diff --git a/.bundle/config b/.bundle/config deleted file mode 100644 index 9bc01b4c325..00000000000 --- a/.bundle/config +++ /dev/null @@ -1,3 +0,0 @@ ---- -BUNDLE_PATH: "vendor/bundle" -BUNDLE_DISABLE_SHARED_GEMS: "true" diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index f6c980ae47b..00000000000 --- a/.gitattributes +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright 2025 Proofcraft Pty Ltd -# SPDX-License-Identifier: BSD-2-Clause - -*.pdf binary diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 6b165d67e99..00000000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright 2020, Data61, CSIRO (ABN 41 687 119 230) -# -# SPDX-License-Identifier: BSD-2-Clause - -# Build and deploy the site - -name: Build - -on: - push: - branches: - - master - pull_request: - schedule: - - cron: '7 3 * * *' - workflow_dispatch: - -jobs: - build: - name: Site - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - submodules: true - - uses: actions/setup-python@v5 - with: - python-version: 3.9 - - uses: ruby/setup-ruby@v1 - with: - bundler-cache: true - - run: pip3 install -U camkes-deps - - run: sudo apt-get install doxygen - - run: make build JEKYLL_ENV=production - - run: tar -cvf site.tar _site/ - - uses: actions/upload-artifact@v4 - with: - name: site - path: site.tar - - deploy: - if: ${{ github.repository_owner == 'seL4' && - (github.event_name == 'push' || github.event_name == 'schedule' || - github.event_name == 'workflow_dispatch') }} - needs: build - name: 'Deploy' - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - with: - ref: gh-pages - token: ${{ secrets.GH_TOKEN }} - # for removing files, we need to start fresh; this does not remove dot-files - - run: rm -rf * - - uses: actions/download-artifact@v4 - with: - name: site - - run: tar -xvf site.tar - - run: cp -a _site/* . - - run: rm -rf site.tar _site - # recreate CNAME file for GitHub; not included in generated site - - run: echo docs.sel4.systems > CNAME - # add/remove everything - - run: git add -A . - - run: git diff --cached - - run: git config user.name "CI" - - run: git config user.email ci@sel4.systems - - run: git commit -m "auto-deployed" - - run: git push diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml deleted file mode 100644 index 7e30f0708a9..00000000000 --- a/.github/workflows/pr.yml +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright 2025, Proofcraft Pty Ltd -# -# SPDX-License-Identifier: BSD-2-Clause - -# Actions to run on pull requests - -name: PR - -on: [pull_request, workflow_dispatch] - -jobs: - pr-checks: - name: Checks - uses: seL4/ci-actions/.github/workflows/pr.yml@master diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml deleted file mode 100644 index 6e8feee1241..00000000000 --- a/.github/workflows/push.yml +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2020, Data61, CSIRO (ABN 41 687 119 230) -# -# SPDX-License-Identifier: BSD-2-Clause - -# Actions to run on Push and Pull Request -name: CI - -on: - push: - branches: - - master - pull_request: - workflow_dispatch: - -jobs: - checks: - name: Checks - uses: seL4/ci-actions/.github/workflows/push.yml@master diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 360f7e848fc..00000000000 --- a/.gitignore +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. -# SPDX-License-Identifier: BSD-2-Clause - -_data/generated.yml -_site/ -_preview/ -.sass-cache/ -_repos/ -projects/virtualization/docs/api/ -.jekyll-cache/ -.npm_deps -vendor/ -node_modules/ -_processed/microkit-tutorial/ -_processed/tutes/ -_processed/rust/ -_data/microkit_tutorial.yml -_data/microkit_platforms.yml diff --git a/.linkcheck-ignore.yml b/.linkcheck-ignore.yml deleted file mode 100644 index 317544f5d60..00000000000 --- a/.linkcheck-ignore.yml +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2025 Proofcraft Pty Ltd -# SPDX-License-Identifier: BSD-2-Clause - -# Ignore all files that are part of the website itself, they will get their own -# link check. Only put admin files such as README.md into the standard PR check. -files: - - vendor - - "_.*/.*" - - ".*html" - - ".*/.*/.*md" - - getting-started.md - - Resources.md - - releases.md - -urls: diff --git a/.reuse/dep5 b/.reuse/dep5 deleted file mode 100644 index 1c8f0dc65b8..00000000000 --- a/.reuse/dep5 +++ /dev/null @@ -1,66 +0,0 @@ -Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: seL4 docs site -Upstream-Contact: seL4 team -Source: https://docs.sel4.systems - -# Sample paragraph, commented out: -# -# Files: src/* -# Copyright: $YEAR $NAME <$CONTACT> -# License: ... - -Files: Gemfile.lock - .ruby-version - .bundle/config - Hardware/HiKey/*.patch - Hardware/CEI_TK1_SOM/CANBoard/Tegra_CANboard_tofab_v1.zip -Copyright: 2020 seL4 Project a Series of LF Projects, LLC. -License: BSD-2-Clause - -Files: _plugins/breadcrumbs.rb -Copyright: 2016 No -License: MIT - -Files: Hardware/CEI_TK1_SOM/*.jpg - Hardware/CEI_TK1_SOM/CANBoard/*.jpg - Hardware/CEI_TK1_SOM/DaughterBoard/*.jpg - projects/buildsystem/old/menuconfig.png - projects/camkes/visual-camkes/*.png - projects/hardware_hacks/level-converter/levelconverter-small.jpg - Hardware/VMware/vmware-serial.png - Hardware/CEI_TK1_SOM/LogicPro8/*.png - Hardware/CEI_TK1_SOM/LogicPro8/*.PNG - Hardware/CEI_TK1_SOM/LogicPro8/*.JPG - Hardware/CEI_TK1_SOM/CANBoard/silk.png - Hardware/CEI_TK1_SOM/tk1-som_pinmux_V2.4.xlsm - Hardware/CEI_TK1_SOM/DaughterBoard/tegra_daughterboard_bom3.xls - Hardware/CEI_TK1_SOM/CEI_TK1_SOM_customer_pinmux_v11.xlsm - Hardware/CEI_TK1_SOM/CANBoard/CanBoardBOMDraft1.xlsx - Hardware/CEI_TK1_SOM/CANBoard/Can_board_pins.png - Hardware/CEI_TK1_SOM/CANBoard/canboard_v3.pdf - Hardware/CEI_TK1_SOM/DaughterBoard/daughterboard_bottom - Hardware/CEI_TK1_SOM/DaughterBoard/daughterboard_r3a_schematic.pdf - Hardware/CEI_TK1_SOM/DaughterBoard/daughterboard_top - Hardware/CEI_TK1_SOM/DaughterBoard/tk1_render_3.PNG - CMA34DBMC/CMA34CRD-thumb.jpg - Hardware/Star64/dip_switch.png -License: CC-BY-SA-4.0 -Copyright: 2020 seL4 Project a Series of LF Projects, LLC. - -Files: _icons/*.svg -Copyright: Tailwind Labs -License: MIT - -Files: package-lock.json package.json -License: BSD-2-Clause -Copyright: 2025 Proofcraft Pty Ltd - -Files: - projects/microkit/manual/2.0.1/assets/microkit_flow.pdf - projects/microkit/manual/2.0.1/assets/microkit_flow.svg - projects/microkit/manual/2.0.1/microkit_user_manual.pdf - projects/microkit/manual/2.1.0/assets/microkit_flow.pdf - projects/microkit/manual/2.1.0/assets/microkit_flow.svg - projects/microkit/manual/2.1.0/microkit_user_manual.pdf -License: CC-BY-SA-4.0 -Copyright: 2021 Breakaway Consulting Pty. Ltd. diff --git a/.ruby-version b/.ruby-version deleted file mode 100644 index bea438e9ade..00000000000 --- a/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -3.3.1 diff --git a/.stylefilter b/.stylefilter deleted file mode 100644 index 2f4dadf0809..00000000000 --- a/.stylefilter +++ /dev/null @@ -1,8 +0,0 @@ -# -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. -# -# SPDX-License-Identifier: BSD-2-Clause -# - -# 3rd-party file -*Hardware/CEI_TK1_SOM/L4TCan/mcp251x.c diff --git a/404.html b/404.html new file mode 100644 index 00000000000..111fd949612 --- /dev/null +++ b/404.html @@ -0,0 +1,551 @@ + + + + + + + | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/ApiDoc.html b/ApiDoc.html new file mode 100644 index 00000000000..db8e8c47aee --- /dev/null +++ b/ApiDoc.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/BenchmarkingGuide.html b/BenchmarkingGuide.html new file mode 100644 index 00000000000..d747a0f1bd5 --- /dev/null +++ b/BenchmarkingGuide.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/CAmkES/Terminology.html b/CAmkES/Terminology.html new file mode 100644 index 00000000000..eb437e0aa76 --- /dev/null +++ b/CAmkES/Terminology.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/CAmkES/index.html b/CAmkES/index.html new file mode 100644 index 00000000000..0486b84aaac --- /dev/null +++ b/CAmkES/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/CAmkESCLI.html b/CAmkESCLI.html new file mode 100644 index 00000000000..eabbf186f18 --- /dev/null +++ b/CAmkESCLI.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/CAmkESDifferences.html b/CAmkESDifferences.html new file mode 100644 index 00000000000..df1e8804bad --- /dev/null +++ b/CAmkESDifferences.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/CAmkESInternals.html b/CAmkESInternals.html new file mode 100644 index 00000000000..825aace8152 --- /dev/null +++ b/CAmkESInternals.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/CAmkESNext.html b/CAmkESNext.html new file mode 100644 index 00000000000..0c0880a9f5e --- /dev/null +++ b/CAmkESNext.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/CMA34DBMC/index.html b/CMA34DBMC/index.html new file mode 100644 index 00000000000..db98fe701cc --- /dev/null +++ b/CMA34DBMC/index.html @@ -0,0 +1,580 @@ + + + + + + + CMA34D | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+
+

This page is archived and is no longer receiving updates.

+

It remains here because some of the content may still be useful.

+
+ + + +
+
+ + + +
+
+
+ + diff --git a/CMA34DBMC/index.md b/CMA34DBMC/index.md deleted file mode 100644 index 1788553b03a..00000000000 --- a/CMA34DBMC/index.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -archive: true -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# CMA34D - -The CMA34D is an embedded i7 board. It needs 12V and 5V supplies. It -does not have a BMC (Base Management Controller) so cannot be controlled -remotely. - -We used a [Stellaris Connected Launchpad](http://www.ti.com/tool/ek-tm4c1294xl) -connected to an RS232 level converter and a 2-way relay module, together with a -suitable power supply. - -Photo of CMA34CRD setup - -In the picture, the CMA34D is at the left, with the TTL-to-RS232 -converter above it. The Launchpad is in the middle, with the relay board -above it, partially obscured by the wiring harness. The power supply is -on the right. All is mounted on a cheap polyethylene breadboard that has -been covered in aluminium tape to provide a ground plane; all the boards -and cables are mounted on 20mm standoffs. - -Software for the launchpad is available at - Use the master branch, and the -project is at -packages/machine-tm4c1294-launchpad/projects/embedded_pc_testbed_src - -The relays are connected to pins PK6 and PK7 on the launchpad; the UART -to pin PA0 (Rx) and PA1 (Tx). You'll need to swap the wires to the level -converter (so Rx from the launcpad connects to Tx on the level -converter, and vice versa); and make sure jumpers J4 and J5 are set to -`UART`. diff --git a/CNAME b/CNAME new file mode 100644 index 00000000000..d1e511ba5a5 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +docs.sel4.systems diff --git a/CapDL.html b/CapDL.html new file mode 100644 index 00000000000..ffaaae1aff5 --- /dev/null +++ b/CapDL.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/DebuggingGuide.html b/DebuggingGuide.html new file mode 100644 index 00000000000..e34cd92e379 --- /dev/null +++ b/DebuggingGuide.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/DebuggingUserspace.html b/DebuggingUserspace.html new file mode 100644 index 00000000000..5e74b83234a --- /dev/null +++ b/DebuggingUserspace.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/Developing/Building/Incorporating.html b/Developing/Building/Incorporating.html new file mode 100644 index 00000000000..da6f3f19d40 --- /dev/null +++ b/Developing/Building/Incorporating.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/Developing/Building/OldBuildSystem.html b/Developing/Building/OldBuildSystem.html new file mode 100644 index 00000000000..7b984498caa --- /dev/null +++ b/Developing/Building/OldBuildSystem.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/Developing/Building/Using.html b/Developing/Building/Using.html new file mode 100644 index 00000000000..44bcd52b97f --- /dev/null +++ b/Developing/Building/Using.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/Developing/Building/index.html b/Developing/Building/index.html new file mode 100644 index 00000000000..e3ba4c163d0 --- /dev/null +++ b/Developing/Building/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/Developing/Building/seL4Standalone.html b/Developing/Building/seL4Standalone.html new file mode 100644 index 00000000000..893e7e796df --- /dev/null +++ b/Developing/Building/seL4Standalone.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/Docker.html b/Docker.html new file mode 100644 index 00000000000..288baa60342 --- /dev/null +++ b/Docker.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/DocsContributing.html b/DocsContributing.html new file mode 100644 index 00000000000..14ddee6188a --- /dev/null +++ b/DocsContributing.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/Gemfile b/Gemfile deleted file mode 100644 index b7d7a7cb08c..00000000000 --- a/Gemfile +++ /dev/null @@ -1,40 +0,0 @@ -source "https://rubygems.org" - -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. -# SPDX-License-Identifier: BSD-2-Clause - -# Hello! This is where you manage which Jekyll version is used to run. -# When you want to use a different version, change it below, save the -# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: -# -# bundle exec jekyll serve -# -# This will help ensure the proper Jekyll version is running. -# Happy Jekylling! -gem "jekyll" - -# Other dependencies -gem "html-proofer", "~>4" - -# Ruby 3.3 warns about these being moved out of std lib and recommends adding -# them here: -gem "base64" -gem "csv" -gem "bigdecimal" - -# If you have any plugins, put them here! -# Look here for supported github plugins: https://pages.github.com/versions/ -group :jekyll_plugins do - gem "jekyll-titles-from-headings" - gem "jekyll-relative-links" - gem "jekyll-optional-front-matter" - gem "jekyll-sitemap" - gem 'jekyll-toc' - gem 'jekyll-redirect-from' - gem 'jekyll-remote-theme' - gem "jekyll-postcss-v2" - gem "jekyll-inline-svg" -end - -# Windows does not include zoneinfo files, so bundle the tzinfo-data gem -gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index 5edac3de150..00000000000 --- a/Gemfile.lock +++ /dev/null @@ -1,206 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - addressable (2.8.8) - public_suffix (>= 2.0.2, < 8.0) - base64 (0.3.0) - bigdecimal (4.0.1) - colorator (1.1.0) - concurrent-ruby (1.3.6) - csv (3.3.5) - em-websocket (0.5.3) - eventmachine (>= 0.12.9) - http_parser.rb (~> 0) - ethon (0.18.0) - ffi (>= 1.15.0) - logger - eventmachine (1.2.7) - ffi (1.17.3-aarch64-linux-gnu) - ffi (1.17.3-aarch64-linux-musl) - ffi (1.17.3-arm-linux-gnu) - ffi (1.17.3-arm-linux-musl) - ffi (1.17.3-arm64-darwin) - ffi (1.17.3-x86_64-darwin) - ffi (1.17.3-x86_64-linux-gnu) - ffi (1.17.3-x86_64-linux-musl) - forwardable-extended (2.6.0) - google-protobuf (4.33.4) - bigdecimal - rake (>= 13) - google-protobuf (4.33.4-aarch64-linux-gnu) - bigdecimal - rake (>= 13) - google-protobuf (4.33.4-aarch64-linux-musl) - bigdecimal - rake (>= 13) - google-protobuf (4.33.4-arm64-darwin) - bigdecimal - rake (>= 13) - google-protobuf (4.33.4-x86_64-darwin) - bigdecimal - rake (>= 13) - google-protobuf (4.33.4-x86_64-linux-gnu) - bigdecimal - rake (>= 13) - google-protobuf (4.33.4-x86_64-linux-musl) - bigdecimal - rake (>= 13) - html-proofer (4.4.3) - addressable (~> 2.3) - mercenary (~> 0.3) - nokogiri (~> 1.13) - parallel (~> 1.10) - rainbow (~> 3.0) - typhoeus (~> 1.3) - yell (~> 2.0) - zeitwerk (~> 2.5) - http_parser.rb (0.8.1) - i18n (1.14.8) - concurrent-ruby (~> 1.0) - jekyll (4.4.1) - addressable (~> 2.4) - base64 (~> 0.2) - colorator (~> 1.0) - csv (~> 3.0) - em-websocket (~> 0.5) - i18n (~> 1.0) - jekyll-sass-converter (>= 2.0, < 4.0) - jekyll-watch (~> 2.0) - json (~> 2.6) - kramdown (~> 2.3, >= 2.3.1) - kramdown-parser-gfm (~> 1.0) - liquid (~> 4.0) - mercenary (~> 0.3, >= 0.3.6) - pathutil (~> 0.9) - rouge (>= 3.0, < 5.0) - safe_yaml (~> 1.0) - terminal-table (>= 1.8, < 4.0) - webrick (~> 1.7) - jekyll-inline-svg (1.1.5) - jekyll (>= 3.3, < 5.0) - svg_optimizer (~> 0.3.0) - jekyll-optional-front-matter (0.3.2) - jekyll (>= 3.0, < 5.0) - jekyll-postcss-v2 (1.0.2) - jekyll-redirect-from (0.16.0) - jekyll (>= 3.3, < 5.0) - jekyll-relative-links (0.7.0) - jekyll (>= 3.3, < 5.0) - jekyll-remote-theme (0.4.3) - addressable (~> 2.0) - jekyll (>= 3.5, < 5.0) - jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) - rubyzip (>= 1.3.0, < 3.0) - jekyll-sass-converter (3.0.0) - sass-embedded (~> 1.54) - jekyll-sitemap (1.4.0) - jekyll (>= 3.7, < 5.0) - jekyll-titles-from-headings (0.5.3) - jekyll (>= 3.3, < 5.0) - jekyll-toc (0.19.0) - jekyll (>= 3.9) - nokogiri (~> 1.12) - jekyll-watch (2.2.1) - listen (~> 3.0) - json (2.18.0) - kramdown (2.5.1) - rexml (>= 3.3.9) - kramdown-parser-gfm (1.1.0) - kramdown (~> 2.0) - liquid (4.0.4) - listen (3.10.0) - logger - rb-fsevent (~> 0.10, >= 0.10.3) - rb-inotify (~> 0.9, >= 0.9.10) - logger (1.7.0) - mercenary (0.4.0) - nokogiri (1.19.0-aarch64-linux-gnu) - racc (~> 1.4) - nokogiri (1.19.0-aarch64-linux-musl) - racc (~> 1.4) - nokogiri (1.19.0-arm-linux-gnu) - racc (~> 1.4) - nokogiri (1.19.0-arm-linux-musl) - racc (~> 1.4) - nokogiri (1.19.0-arm64-darwin) - racc (~> 1.4) - nokogiri (1.19.0-x86_64-darwin) - racc (~> 1.4) - nokogiri (1.19.0-x86_64-linux-gnu) - racc (~> 1.4) - nokogiri (1.19.0-x86_64-linux-musl) - racc (~> 1.4) - parallel (1.27.0) - pathutil (0.16.2) - forwardable-extended (~> 2.6) - public_suffix (7.0.2) - racc (1.8.1) - rainbow (3.1.1) - rake (13.3.1) - rb-fsevent (0.11.2) - rb-inotify (0.11.1) - ffi (~> 1.0) - rexml (3.4.4) - rouge (4.7.0) - rubyzip (2.4.1) - safe_yaml (1.0.5) - sass-embedded (1.97.2-aarch64-linux-gnu) - google-protobuf (~> 4.31) - sass-embedded (1.97.2-aarch64-linux-musl) - google-protobuf (~> 4.31) - sass-embedded (1.97.2-arm-linux-gnueabihf) - google-protobuf (~> 4.31) - sass-embedded (1.97.2-arm-linux-musleabihf) - google-protobuf (~> 4.31) - sass-embedded (1.97.2-arm64-darwin) - google-protobuf (~> 4.31) - sass-embedded (1.97.2-x86_64-darwin) - google-protobuf (~> 4.31) - sass-embedded (1.97.2-x86_64-linux-gnu) - google-protobuf (~> 4.31) - sass-embedded (1.97.2-x86_64-linux-musl) - google-protobuf (~> 4.31) - svg_optimizer (0.3.0) - nokogiri - terminal-table (3.0.2) - unicode-display_width (>= 1.1.1, < 3) - typhoeus (1.4.1) - ethon (>= 0.9.0) - unicode-display_width (2.6.0) - webrick (1.9.2) - yell (2.2.2) - zeitwerk (2.7.4) - -PLATFORMS - aarch64-linux - aarch64-linux-gnu - aarch64-linux-musl - arm-linux-gnu - arm-linux-gnueabihf - arm-linux-musl - arm-linux-musleabihf - arm64-darwin - x86_64-darwin - x86_64-linux - x86_64-linux-gnu - x86_64-linux-musl - -DEPENDENCIES - base64 - bigdecimal - csv - html-proofer (~> 4) - jekyll - jekyll-inline-svg - jekyll-optional-front-matter - jekyll-postcss-v2 - jekyll-redirect-from - jekyll-relative-links - jekyll-remote-theme - jekyll-sitemap - jekyll-titles-from-headings - jekyll-toc - tzinfo-data - -BUNDLED WITH - 2.5.9 diff --git a/Hardware/BeagleBoard.html b/Hardware/BeagleBoard.html new file mode 100644 index 00000000000..e32208e96af --- /dev/null +++ b/Hardware/BeagleBoard.html @@ -0,0 +1,818 @@ + + + + + + + seL4 on the BeagleBoard | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/BeagleBoard.md b/Hardware/BeagleBoard.md deleted file mode 100644 index b5bbf3b58d7..00000000000 --- a/Hardware/BeagleBoard.md +++ /dev/null @@ -1,192 +0,0 @@ ---- -arm_hardware: true -cmake_plat: omap3 -xcompiler_arg: -DAARCH32=1 -platform: BeagleBoard -arch: ARMv7A -virtualization: false -iommu: false -soc: OMAP3 -cpu: Cortex-A8 -verification: [ARM] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# seL4 on the BeagleBoard - -This page documents booting seL4 on the -[Beagleboard](http://beagleboard.org/beagleboard), Omap 3530 - -{% include hw-info.html %} - -See also [Tim Newsham's -post](https://lists.sel4.systems/hyperkitty/list/devel@sel4.systems/message/AHWTG4D3W6OYF4QPUILMBTU4COP4KH4A/) -on the mailing list for his experience with running seL4 on this board. - -## Preparing your SD card - -### Prologue - -These instructions are for later versions of the Beagleboard. Before the Xm, -U-Boot and MLO were held in flash. - -The first stage boot loader expects to find the TI X-loader in the root of a FAT -filesystem, on the first partition of the SD card with the name MLO. - -MLO expects to find a file named u-boot.bin in the root directory of the SD -card. - -## Setting up Minicom - -Plug the board in. seL4 userspace currently does no power management — you will -probably need a 5V power source, and not rely on powering the board over USB - -If you do not have minicom installed: - -```bash -sudo apt-get install minicom -``` - -If you are connecting via a USB serial adapter: - -```bash -sudo minicom -s ttyUSB0 -``` - -And if you were connecting via a **real** serial port: - -```bash -sudo minicom -s ttyS0 -``` - -In either case, this will take you to a configuration menu. - -1. Choose Serial Port Setup -2. Set A: Serial Device to `/dev/ttyUSB0` or `/dev/ttyS0` depending on - which serial device you want to use. -3. Set F: Hardware Flow Control to No -4. Set speed to `115200` and eight bit no parity. -5. Save setup as `ttyUSB0` or `ttyS0` -6. Exit Minicom - -You can now connect to the !BeagleBoard using Minicom: - -```bash -minicom ttyUSB0 -``` - -Or: - -```bash -minicom ttyS0 -``` - -### Permissions - -If you get permissions errors you need to add yourself to the -appropriate group. Find out which group on your machine has access to -the serial ports (on Debian, it's usually `dialout`): - -```bash -$ ls -l /dev/ttyUSB0 -crw-rw---- 1 root dialout 188, 0 Aug 11 09:43 /dev/ttyUSB0 -``` - -Then add yourself to the right group: - -```bash -sudo usermod -G dialout -a your_login_name -``` - -### U-Boot - -Now minicom should connect to what it thinks is a "modem", and then give you a -good old console to work with. You are now in the bootloader, U-Boot, of the -BeagleBoard. You can type commands here and it'll display the results. - -Some quick useful commands: - -|Command|Description| -|-|-| -|help |display list of commands | -|printenv|lists defined environment variables | -|mmc init |initialise MMC (to read the the SD card) | -|mmcinfo |display current SD card info | -|fatls mmc 0 |display list of files on SD card 0 | -|fatload |load script/image into some RAM address to be run | -|run |run scripts | -|bootelf |boot into en ELF image | - - -### dfu-util - -An alternative is to use `dfu-util` with the standard U-Boot to transfer the -image to the board. - -The address that the file downloads to is controlled by the `loadaddr` -environment variable in U-Boot. You can either download an ELF file, and then -run `bootelf` on the U-Boot command-line, or download a U-Boot image file -(created with `mkimage`) and use `bootm` to run it. You may need to take care -that the ELF sections or image regions do not overlap with the location of the -ELF/image itself, or loaded to non-existent memory address (0x81000000 works -fine, but 0x90000000 won't work on the original Beagle Board since there's no -RAM there). - -```none -dfu-util -D sel4test-image-arm -``` - -## Running seL4test - -{% include sel4test.md %} - -Which after a few minutes should give you: - -Now, the ELF image we boot into is the `sel4test-driver-image-arm-omap3` file. -Copy that file onto the sdcard (the boot loader will be able to load images into -RAM from a FAT image: there is no need to do an image copy). If your SD card is -not formatted, just format it using FAT32. Plug the SD card back into the -BeagleBoard and reset the board by pressing the `S2` (reset) button. - -### To run the image - -```uboot -mmc init -mmcinfo -fatload mmc 0 ${loadaddr} sel4test-driver-image-arm-omap3 -bootelf ${loadaddr} -``` - -where `loadaddr` is some address, in this example defined as an environment -variable. - -{% include note.html %} -By default, the image produced is relocated to run at address 0x82000000. -If you want to change the address, you need to modify the file -`projects/tools/elfloader-tool/gen_boot_image.sh` (look for the omap3 case). For -the Beaglebone Black Rev A5, RAM is from address 0x80000000 - 0x9FFFFFFF. -{% include endnote.html %} - -Depending on the uBoot version present on the Beaglebone, the `bootelf` command -might not be present. You can use the `go` command instead. E.g.: - -```uboot -mmc init -mmcinfo -fatload mmc 0 0x82000000 sel4test-driver-image-arm-omap3 -go 0x82000000 -``` - -After this you should start seeing output from seL4test. - -Tip: if you don't remember the name of the images on your SD card, you can use: - -```uboot -fatls mmc 0 -``` - -to see what is on the SD card. diff --git a/Hardware/Beaglebone.html b/Hardware/Beaglebone.html new file mode 100644 index 00000000000..dca97256895 --- /dev/null +++ b/Hardware/Beaglebone.html @@ -0,0 +1,703 @@ + + + + + + + BeagleBone Black / Blue | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/Beaglebone.md b/Hardware/Beaglebone.md deleted file mode 100644 index 77cb3ee2bb0..00000000000 --- a/Hardware/Beaglebone.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -arm_hardware: true -cmake_plat: am335x-boneblack -xcompiler_arg: -DAARCH32=1 -platform: BeagleBone Black / Blue -arch: ARMv7A -virtualization: false -iommu: false -soc: AM335x -cpu: Cortex-A8 -verification: [ARM] -Contrib: Community -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# BeagleBone Black / Blue - -This page contains info about building seL4 on -[BeagleBone Black](https://beagleboard.org/black) and -[BeagleBone Blue](https://beagleboard.org/blue). - -{% include hw-info.html %} - -## Building for the BeagleBone Black / Blue - -These instructions were written by Tim Newsham. The BeagleBone is -a community-supported port. - -### Requirements - -We suggest using the `arm-linux-gnueabi-` cross-compilers. Use -[the instructions on getting a toolchain](../projects/buildsystem/host-dependencies.html). - -### Building - -#### seL4test - -For BeagleBone Blue, substitute `am335x-boneblack` with `am335x-boneblue`. - -{% include sel4test.md %} - -## Booting on the BeagleBone Black / Blue - -### Hardware Requirements (BeagleBone Black) - -* Power supply (5V DC or miniUSB cable) -* Serial adapter -* microSD card for file booting or Ethernet cable for network boot - -### Hardware Requirements (BeagleBone Blue) - -* Power supply (12V DC, 2S LiPo battery or microUSB) -* Serial adapter (Connect to UT0 header) -* microSD card for file booting or microUSB cable for network boot - -### Interacting with U-Boot - -Connect a serial adapter between your development box and the BeagleBone. Use -a serial program such as `picocom` or `screen` to connect to the serial port: - -```sh -picocom /dev/ttyUSB0 -b 115200 -``` - -Power on the device and hit space a few times to interrupt the normal boot -process and get a U-Boot prompt. - -#### Booting from microSD card - -To boot from a microSD card, copy the `sel4test-driver-image-arm-am335x` file -to a FAT32 partition the microSD card and insert the card in the BeagleBone. - -At the U-Boot prompt, enter the following to load and run the image: - -```none -fatload mmc 0 ${loadaddr} sel4test-driver-image-arm-am335x -bootm ${loadaddr} -``` - -#### Booting from TFTP - -To boot over Ethernet, configure your DHCP server to provide a DHCP lease and -to specify the `sel4test` image as the boot file. -Configure a TFTP server to serve the `sel4test-driver-image-arm-am335x` file. - -For BeagleBone Black, plug in an Ethernet cable. For BeagleBone Blue, make sure -a microUSB cable is plugged in and connected to a computer running a DHCP -server. Then, at the U-Boot prompt enter: - -```none -dhcp -bootm ${loadaddr} -``` - -To load an alternate image from the TFTP server at 1.2.3.4, use: - -```none -dhcp ${loadaddr} 1.2.3.4:refos-image-arm-am335x -bootm ${loadaddr} -``` - -## Other resources - -* [Supporting the UART1 interface with CAmkES](http://julien.gunnm.org/geek/sel4/beaglebone%20black/2016/06/15/beaglebone-black-sel4-uart1/) diff --git a/Hardware/CEI_TK1_SOM/CANBoard/index.html b/Hardware/CEI_TK1_SOM/CANBoard/index.html new file mode 100644 index 00000000000..bcea7de561e --- /dev/null +++ b/Hardware/CEI_TK1_SOM/CANBoard/index.html @@ -0,0 +1,851 @@ + + + + + + + The CAN Daughterboard | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/CEI_TK1_SOM/CANBoard/index.md b/Hardware/CEI_TK1_SOM/CANBoard/index.md deleted file mode 100644 index ce901f4c4df..00000000000 --- a/Hardware/CEI_TK1_SOM/CANBoard/index.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# The CAN Daughterboard - -The CAN Daughterboard is an open-hardware -**CAN/SPI/I2C/Serial board** designed by the Trustworthy Systems group, -that can be mounted below the power supply module of -the TK1-SOM. It provides **two CAN buses** implemented with MCP2515 -(on the TK1-SOM's SPI bus) and voltage conversion for the two serial -ports. - -Top of board -Bottom of board -Side view of mounted stack - -## Mounting - The board attaches to the bottom of a TK1-SOM via the -expansion connector. No further work should be needed to enumerate the -device given a kernel supporting GPIO chipselects. - -Note the unpopulated standoff holes on the rightmost image above --- it -is possible to fit a standoff of the same type already installed in the -TK1-SOM to stabilize the 'tower' making it easier to work with. - -The part numbers of the standoffs between the CAN daughterboard and TK1 -is the same as is already used between the CPU & GPU board. Order codes: - -+ **STANDOFF** - HEX M2.5 x 16MM ALUMINUM M-F (M2111-2545-AL) - between pcb standoff -+ **SCREW** - M2.5 x 5 MM SS PAN HEAD PHILIPS (92000A103) bottom - pcb screw - -## Using Linux with this daughterboard for CAN -(**hello world & testing**) See [Using CAN on L4T through an MCP251X](../L4TCan) - -## Pinout detail - The font on the silkscreen indicating pins is -difficult to see once the tower is assembled (wasn't enough space on the -top) - See this picture (view taken from **bottom**): - -![Silk Screen](silk.png) - -### Warning - UART Level Converter: - - -- If using the level converter on the board, and if you are - getting **junk from your 3V3 serial cable**, read this: -- Unfortunately there is an issue with these level converter - chips, in some impedance situations the rise time is much worse - than indicated on the datasheet. Basically, with some serial - cables the converter will garble signals at a high baud rate - (> 57600). -- This can be circumvented by changing your u-boot and extlinux to - use a slower baud rate. 9600 is very safe, anything up to about - 57600 should be fine --- start slow and work up. - -If you need the faster baud rates (or don't want to change the default -settings), **use a 1V8 USB-TTL cable** and plug it straight into the -TK1 as usual. This will be fixed in a future revision. - -## TK1 SOC Connections - -Useful for writing drivers - this is a list of -which pins on the board correspond to which SOC pins: - -{% include note.html %} -All I2C signals operate at 3V3 on their 0.1" headers, except -I2C_CAM which is selectable from 1V8<->3V3 in software. -{% include endnote.html %} - -| PIN | BALL | PERIPHERAL ID | -|--------------|---------|------------------| -|I2C_CAM_SCL |AF8 |I2C3_CLK | -|I2C_CAM_SDA |AG8 |I2C3_DAT | -|I2C_TK1_SCL |Y2 |I2C2_CLK | -|I2C_TK1_SDA |AA2 |I2C2_DAT | -|I2C_LOCAL_SCL |P6 |I2C1_CLK | -|I2C_LOCAL_SDA |M6 |I2C1_DAT | - -All SPI signals out of the TK1 are at 1V8, but are translated to 3V3 by -the board (the 0.1" header operates at 3V3) - -| PIN | BALL | PERIPHERAL ID | -|---------|---------|------------------| -|SPI_CLK |AG15 |SPI1A_SCK | -|SPI_MISO |AL18 |SPI1A_DIN | -|SPI_CSN |AL16 |SPI1A_CS0 | -|SPI_MOSI |AK17 |SPI1A_DOUT | - -All UART signals out of the TK1 are at 1V8, but are translated to 3V3 by -the board. Note that UART signals will only be present on the board -outputs if the uart is actually jumpered to the converter! - -| PIN | BALL | PERIPHERAL ID | -|-----------|---------|------------------| -|J8_RTSn |V5 |UD3_RTS | -|J8_CTSn |V9 |UD3_CTS | -|J8_TXD |V4 |UD3_TXD | -|J8_RXD |U4 |UD3_RXD | -|J2000_RXD |L0 |UART2_RTS_N | -|J2000_TXD |M8 |UART2_CTS_N | -|J2000_CTSn |M1 |UART2_TXD | -|J2000_RTSn |P4 |UART2_RXD | - -Note that TXD (1V8) is translated to TXD (3V3). NOT TXD (1V8) <-> -RXD (1V8). This means that the jumper from the TK1-SOM should go from -it's TX to RX on the daughterboard for a standard ftdi pinout to work. - -Note that GPIOs aren't actually brought out by the board but they are -used by the CAN controller (diagram below). - -| PIN | BALL | PERIPHERAL ID | -|----------|--------|------------------| -|TK1_GPIO0 |AF29 |GPIO3_PS.05 | -|TK1_GPIO1 |AA26 |GPIO3_PT.00 | -|TK1_GPIO2 |AC30 |GPIO3_PS.06 | -|TK1_GPIO3 |AA31 |GPIO3_PS.02 | -|TK1_GPIO4 |V28 |GPIO3_PS.03 | -|TK1_GPIO5 |W31 |GPIO3_PR.00 | -|TK1_GPIO6 |AB31 |GPIO3_PR.06 | -|TK1_GPIO7 |Y27 |GPIO3_PS.04 | - - - -### CAN Controller (MCP25625) GPIO Usage: -MCP25625 pinout - -## Construction Information - -|Schematic |[canboard_v3.pdf](canboard_v3.pdf) | -|PCB Sources Repository |https://bitbucket.csiro.au/projects/OH/repos/tk1som-can-daughterboard| -|Gerber Files (in repo also)|[Tegra_CANboard_tofab_v1.zip](Tegra_CANboard_tofab_v1.zip) | -|BOM (in repo also) |[CanBoardBOMDraft1.xlsx](CanBoardBOMDraft1.xlsx) | - -## Construction notes - Components **R6, R14, R19, R23 should NOT be -mounted**. R6 and R19 are pull-up resistors that were found to cause -signal integrity issues, the other 2 resistors when mounted will supply -5v to the CAN lines and are optional. diff --git a/Hardware/CEI_TK1_SOM/DaughterBoard/index.html b/Hardware/CEI_TK1_SOM/DaughterBoard/index.html new file mode 100644 index 00000000000..a17c50539b8 --- /dev/null +++ b/Hardware/CEI_TK1_SOM/DaughterBoard/index.html @@ -0,0 +1,904 @@ + + + + + + + The TK1-SOM Daughterboard | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/CEI_TK1_SOM/DaughterBoard/index.md b/Hardware/CEI_TK1_SOM/DaughterBoard/index.md deleted file mode 100644 index d0a68f9960a..00000000000 --- a/Hardware/CEI_TK1_SOM/DaughterBoard/index.md +++ /dev/null @@ -1,319 +0,0 @@ ---- -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# The TK1-SOM Daughterboard - -The TK1-SOM Daughterboard is an -open-hardware daughterboard designed by the Trustworthy Systems group -that can be mounted to the TK1-SOM. It provides **CAN -buses**, **serial**,**sensors**, **power management**, **PWM -outputs** and other features that allow the TK1-SOM to be used as a -flight controller for a quadcopter. - -### Warning - - -- Don't plug in or unplug things from the daughterboard while it - is turned on, especially the radio. The current transient will - sometimes kill U13 (TPS563200 5V regulator). If only 1 of the - LEDs above the white molex connector is lit, it is because U13 - is dead. - -### Rough overview (top) - -Top of
-board - -### Rough overview (bottom) - -Bottom of board - -### With TK1 -Daughterboard
-with TK1 - -## Technical documentation - - -- [Schematic PDF](daughterboard_r3a_schematic.pdf) (See '[Technical errata for R3A](#errata)' - for changes) -- Bill of Materials: - [tegra_daughterboard_bom3.xls](tegra_daughterboard_bom3.xls) -- Project repository: - [Altium files](https://bitbucket.csiro.au/projects/OH/repos/tk1som-quadcopter-daughterboard) - -## Connecting the Daughterboard - Going from a TK1-SOM, a pixhawk/IRIS -and a daughterboard to a functioning system requires: - -- [Technical documentation](#technical-documentation) -- [Connecting the Daughterboard](#connecting-the-daughterboard) - - [Mounting the TK1 to the daughterboard](#mounting-the-tk1-to-the-daughterboard) - - [Jumpering the UART level translators](#jumpering-the-uart-level-translators) - - [Jumpering the RESET button](#jumpering-the-reset-button) - - [Attaching the pixhawk power cable](#attaching-the-pixhawk-power-cable) - - [Attaching the CAN bus cable](#attaching-the-can-bus-cable) - - [Attaching the telemetry cable](#attaching-the-telemetry-cable) - - [Connecting the power harness](#connecting-the-power-harness) - - [Connecting the battery OR external PSU](#connecting-the-battery-or-external-psu) - - [Everything connected](#everything-connected) - - [Debugging output and finding grounds](#debugging-output-and-finding-grounds) -- [Errata](#errata) - - [Technical errata for R3A, to be fixed next revision](#technical-errata-for-r3a-to-be-fixed-next-revision) - -### Mounting the TK1 to the daughterboard - Before mounting the -TK1-SOM to the daughterboard, you will have to disassemble the TK1-SOM. -This will involve: - -- Removing the fan screw -- Unscrewing the standoffs -- Separating the 2 module 'halves' -- Removing the fan connector - -This must be done with care as it is easy to damage the TK1. Your goal -is this: - -TK1 disassembled - -Now you can start attaching the TK1 to the daughterboard. It's easy to -identify which half goes where by looking at the connectors on the -bottom, or the overview at the top of this page. - -Firmly press both of the TK1 halves into their sockets. Try to use -unpopulated parts of the PCB as 'finger positions' to avoid damaging -components or connectors. - -{% include note.html %} -Standoffs can optionally be added in this step for extra support -(the friction fit supplied by the TK1 connectors should be more than -sufficient in most cases). Each module has a single standoff point for -an M2.5 screw, bolt, and standoff: - -Standoff fitted - -The end result should look like the image under [With TK1](#with-tk1) near the top of this page -{% include endnote.html %} - -### Jumpering the UART level translators - For the daughterboard to do -any level translation, it needs to be connected to the TK1's UARTs. We -achieve this by jumpering the TK1's UARTs to the 'UART TK1' connector on -the daughterboard. (See 'rough overview', top view) - -The pinout of the TK1's UARTS is the same as the pinout of the -daughterboard's UART inputs. Observe: - -UART 1 on TK1 - -UART 2 on TK1 - -UARTs on daughterboard - -The pinout of the TK1 UARTS is: - -|PIN 1 |RX | -|PIN 2 |TX | -|PIN 3 |CTS-L | -|PIN 4 |RTS-L | - -Since we aren't using flow control, you only need to connect pin 1 (TK1) -to pin 1 (daughterboard), and pin 2 - pin 2 for both UARTS. You should -end up with: - -UARTs jumpered - -**Note**: On this board, UART1 is connected to the RADIO output, the -FTDI port, and the activity LEDs. UART2 is connected to the GPS output. -It is possible to swap these at the TK1 input side without consequence -(this would put the kernel dump through the GPS output, and UART2 -through telemetry). Additionally, one can disconnect these jumpers and -use an 'ordinary' 1V8 converter for debugging (See -[debugging & grounds](#debugging-output-and-finding-grounds) below). - -### Jumpering the RESET button - It's difficult to access the TK1's -reset button when it is mounted, so there is a secondary reset button on -the daughterboard that can optionally be used. First, you must solder a -pin to the hole next to the reset switch on the TK1 (as RESET isn't -brought out on any of its connectors): - -Reset pin soldered to the
-TK1 - -From here, you want to jumper this pin to the 'RESET' pin on the -daughterboard (This is the pin just to the right of the grey switch): - -Reset button and pin on
-daughterboard - -Your end result is: - -Reset pin jumpered - -{% include note.html %} -As this reset switch is just a momentary short to ground, it is -very easy to make your own reset switch that may be larger or more -conveniently mounted elsewhere on the quadcopter. Essentially you just -need a momentary switch between the TK1 pin and ground - the signal is -debounced etc on the TK1. -{% include endnote.html %} - -### Attaching the pixhawk power cable - --(The pixhawk power cable is -how the daughterboard delivers power to the pixhawk. Note that this is -very different to the previous daughterboards - we do not use the IRIS' -power output (that would normally go into the pixhawk) for -anything.)--OUTDATED DUE TO POSSIBLE RAIL INTERACTION - -The pixhawk should be connected to the IRIS power supply as it would be -in a vanilla configuration, to avoid any interaction with the -daughterboard's rails. Do NOT connect anything to the daughterboard's -'Power out to Pixhawk' connector. - -### Attaching the CAN bus cable - The CAN1 connector we are using -(labelled 'PRIMARY CAN CONNECTOR' on 'Rough overview - Top' at the top -of this page) is directly connected to the CAN port on the pixhawk. -Connect one end of the 4-pin DF13 connector to the pixhawk, and the -other to the daughterboard: - -CAN connector on daughterboard - -The left arrow points to the connector. The right arrow points to the -endpoint selection jumper. If the endpoint selection jumper is closed, -CAN1 will be terminated as an endpoint. In our situation, the pixhawk -and the daughterboard are endpoints, so the jumper should be closed for -CAN1. - -Note that the connectors on the bottom and the top of the board are -connected in parallel so that the board can be used in more complex -network topologies, i.e the 2 left connectors are CAN1, and the 2 right -connectors are CAN2. - -### Attaching the telemetry cable - The telemetry connector to be -connected to the 3DR RADIO has a 'RADIO' label, and it is next to the -GPS connector - see 'Rough Overview - Bottom', above. - -To connect it, find the 3DR RADIO cable inside the IRIS and just plug it -in: - -3DR Radio connected to
-daughterboard - -### Connecting the power harness - The power harness is how the -daughterboard supplies power to the TK1-SOM, and also how it intercepts -power from the IRIS' batteries (if it is running on batteries). This is -the power harness: - -The power harness - -To connect it, plug in the molex connector under the daughterboard, and -then plug into the TK1-SOM's barrel jack. Do NOT plug this into the -'+12V IN' barrel jack on the side of the daughterboard. This is what you -want: - -The power harness plugged in - -### Connecting the battery OR external PSU - There are 2 ways of -powering up the daughterboard and pixhawk: - -- 1: Using the TK1-SOM's ordinary power supply (for testing) -- 2: Using the LIPO battery on the quadcopter (for demoing) - -The only difference from a functional point of view is that option 1 -will only power the pixhawk, daughterboard, and TK1-SOM; not the rest of -the quadcopter. The LIPO will do the same, but also provide power for -the rotors etc. - -Note that in both cases the power harness must be connected to supply -the TK1-SOM with power. If the TK1 power supply is used, the yellow -battery connectors should be unplugged. - -In any case, for option 1: simply plug in the TK1 power supply to the -'+12V IN' jack (See 'Rough overview' - Top): - -Powered with ordinary TK1
-PSU - -The TK1 and daughterboard will all turn on. (And the pixhawk if it is -connected unlike the above picture) - -For option 2: Connect one end of the power harness to the main IRIS -power input: - -Connecting to IRIS internal main
-power connector - -and the other end to the battery: (Follow ordinary 3DR procedures before -doing this as it will turn everything on) - -Connecting the battery - -Similarly, everything should turn on as pictured. - -### Everything connected - Slightly more close-up photo of everything -connected and turned on: -Everything
-connected - -### Debugging output and finding grounds - To use an 'ordinary' 1V8 -converter and debug things, you will likely want to: - -- Connect the 1V8 converter to the primary UART on the TK1 (on - the top) for kernel messages -- Swap UART1 with UART2 into the daughterboard, making the secondary - UART go through telemetry. (i.e connect UART2 (TK1) to - UART1 (Daughterboard) to get the secondary UART through telem) - -Our 1V8 converters have the following pinout: - -Everything connected - -You want to connect TX (converter) to RX on the TK1, and RX (converter) -to TX on the TK1. You also need to connect a ground, which you can find -all along the bottom row of the servo connector: - -Everything connected - -(The entire bottom row is connected to ground) - -## Errata - -### Technical errata for R3A, to be fixed next revision - - -- The 'power out to pixhawk' connection on the daughterboard - should not be used as it may cause a rail collision. -- All I2C lines CLK and DAT lines are reversed due to an error in - the schematic supplied to us by CEI; this has been modwired to - the correct connection on some boards. -- U8 (LSM303D, one of the many inertial sensors) is not mounted - due to a footprint error. -- D10 & D11 CAN Reset diodes are not mounted on some boards. This - has been tested OK, the diodes are just to improve CAN chip - reset times - but we aren't actually using the CAN reset line. -- R35 & R45 to supply power through the CAN ports --(ARE)-- ARE - NOT mounted, and should never be to avoid rail collisions. -- The LV cutout circuitry does not work. Since the IRIS battery is - disconnected when not in use anyway, this should not be a - huge issue. UPDATE: Reason is footprint error with TLV431 chip, - swapping A/K fixes issue. -- On schematic sheet 5, the 'Do not populate' remarks indicate the - wrong designators. They should indicate R35 & R45. -- R40 & R49 pull-ups on the SPI CSN line are not mounted. These - were found to cause signal integrity issues. Additionally, the - silkscreen for R51 and R49 is swapped on the PCB. -- R57 - R72 (Current limiting resistors for D12-D27), a value of - 560 ohm was used instead of 10K ohm to increase - their brightness. - - diff --git a/Hardware/CEI_TK1_SOM/L4TCan/index.html b/Hardware/CEI_TK1_SOM/L4TCan/index.html new file mode 100644 index 00000000000..b3e145553bd --- /dev/null +++ b/Hardware/CEI_TK1_SOM/L4TCan/index.html @@ -0,0 +1,853 @@ + + + + + + + Using CAN on L4T through an MCP251X | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/CEI_TK1_SOM/L4TCan/index.md b/Hardware/CEI_TK1_SOM/L4TCan/index.md deleted file mode 100644 index 24fd33fba21..00000000000 --- a/Hardware/CEI_TK1_SOM/L4TCan/index.md +++ /dev/null @@ -1,296 +0,0 @@ ---- -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Using CAN on L4T through an MCP251X - -Front view of TK1-Tower -Bottom view of TK1-Tower - -## Before running L4TCAN: Jumper HW-based chipselect to the GPIO chipselect -Because L4T with CAN doesn't use GPIO chipselect (yet), -it's necessary to connect the hardware CSN line to the GPIO used for -chipselect. - -Note that the GPIO dts sets the GPIO used for chipselect to high -impedance so bad things don't happen. - -CSN is indicated on the SPI expansion header. Can node #1 on the CAN -daughterboard uses TK1_GPIO2, so it's necessary to connect these 2 -pins: - -Jumper hw-based chipselect to GPIO chipselect - -(From right-to-left on the TK1 GPIO header we have GPIO0, GPIO1, GPIO2) - -{% include note.html %} -On the seL4 side, this may not be necessary as it will be able to -use GPIO-based chipselects. -{% include endnote.html %} - -{% include note.html %} -Justification for GPIO chipselects is that we have 2 CAN nodes -and only 1 HW chipselect, so had to do it this way. -{% include endnote.html %} - -## Option 1. Use our Linux image -Grab the image at [tk1_can.img.gz] ([md5]). Make sure to verify against the -md5sum in the same folder once you've got it. - -[md5]: https://trustworthy.systems/Downloads/tk1_can/checksum.txt -[tk1_can.img.gz]: https://trustworthy.systems/Downloads/tk1_can/tk1_can.img.gz - -Set up the TK1 as usual - connect the UART as well as the recovery USB -port next to the ethernet jack. Stop u-boot from booting and issue the -command: - -``` -ums 0 mmc 0 -``` -This will allow you to see the TK1's filesystem on -your host pc. On your host PC, list your devices: - -``` -$ lsblk -``` -You should see a 14.7GB-ish device with a few -partitions - this is the TK1. (Make sure it is by mounting the largest -partition and looking at the rootfs [making sure to unmount again -before next step!]) - -We're ready to image the TK1. Issue the following command, making -ABSOLUTELY sure that your of=/dev/sdX line is correct so you don't -accidentally destroy data on your machine. Also, you want /dev/sdX (the -device), NOT /dev/sdX3 (partitions) etc. -``` -gunzip -c tk1_can.img.gz | sudo dd of=/dev/ conv=sync bs=4K status=progress -``` -This takes \~1.5Hr on my machine to -complete. If dd throws a strange error to do with the 'status=progress' -command, you may be using an old version of dd, it's fine to omit this -command however you will not see a progress bar. - -Once this is complete, exit the ums command in u-boot and attempt to -boot. As long as the can board CS is jumpered to GPIO2, everything -should work. - -You may see some lines after boot like: - -``` -rt5639 0-001c: Failed to set private addr: -121 -``` - -This is normal, -and everything should work regardless (internet connectivity works fine -on our system). We'll be looking into the reason for these errors in the -future. - -See bottom of this page for 'hello-world'-type examples. - -## Option 2: compile your own Linux - The instructions from here on go -from a vanilla TK1-SOM L4T configuration to one which can support CAN -using the daughterboard. - -Getting native Linux CAN drivers to work on the TK1-SOM requires a bit -of hackery, procedure outlined here. - -Before going ahead with this, follow the TK1-SOM custom kernel -procedure, make sure you can build it and flash to the board - -### Add device tree support for MCP251X to L4T & perform driver hacks -The kernel that is included in L4T does not support device tree -binding for the mcp251X, so you have to modify the kernel driver. - -Easiest way to do that is to just use mine: (Works with latest L4T from -colorado. Don't use the upstream NVIDIA L4T) - -Get it here: [mcp251x.c](mcp251x.c) - -You want to replace the file in drivers/net/can/mcp251x.c - -{% include note.html %} -This is NOT the same as the file in mainline kernel, it has a hack -that fixes a problem I had with the device tree not recognising clock -nodes. - -This means that this file will only work with an MCP251X that has a -20MHz crystal! -{% include endnote.html %} - -I've also added a lot of debugging information to the driver so that -dmesg is a bit more helpful. - -### Look at device tree documentation - Device tree documentation does -not exist in the source code as mcp support has been hacked in. Here's -the docs from mainline: - - . -``` - -- Microchip MCP251X stand-alone CAN controller device tree bindings - -Required properties: - -- compatible: Should be one of the following: - - "microchip,mcp2510" for MCP2510. - - - "microchip,mcp2515" for MCP2515. -- reg: SPI chip select. -- clocks: The clock feeding the CAN controller. -- interrupt-parent: The parent interrupt controller. -- interrupts: Should contain IRQ line for the CAN controller. - -Optional properties: - -- vdd-supply: Regulator that powers the CAN controller. -- xceiver-supply: Regulator that powers the CAN transceiver. - -Example: - - can0: { - - compatible = "microchip,mcp2515"; - reg = <1>; - clocks = <&clk24m>; - interrupt-parent = <&gpio4>; - interrupts = <13 0x2>; - vdd-supply = <®5v0>; - xceiver-supply = <®5v0>; - }; -``` - -### Modify the device tree - Replace the existing .dts files with -[tegra124-tk1-som-pm375-000-c00-00.dts](tegra124-tk1-som-pm375-000-c00-00.dts) - -You also need to remap some GPIOs, swap out the GPIO device tree with -[tegra124-tk1-som-gpio-default.dtsi](tegra124-tk1-som-gpio-default.dtsi) - -### Kernel Build Configuration - Using make menuconfig, enable CAN and -MCP251X modules. Make sure your .config contains: -``` -CONFIG_CAN=m -CONFIG_CAN_RAW=m -CONFIG_CAN_BCM=m -CONFIG_CAN_GW=m -CONFIG_CAN_VCAN=m -CONFIG_CAN_DEV=m -CONFIG_CAN_CALC_BITTIMING=y -CONFIG_CAN_MCP251X=m -``` -In addition to -the 'normal' tk1-som kernel build settings given by Colorado in their -readme. - -It is up to you whether you would like to leave user-mode SPI drivers in -there or not, they simply won't load as the CAN dts removes the -user-space SPI device. - -Once we figure out how to do GPIO-muxed chipselect on the TK1SOM -(working on it) it will be possible to use more than one CAN node & -user-space SPI at the same time. - -### Enable hardware-based chipselect #0 - There is a strange old -touch-driver hanging around that needs to be disabled for you to be able -to use hardware CS on the TK1-SOM's SPI line. - -Originally I pulled it out of the TK1-SOM's SPI driver, but it turns out -you can disable it in extlinux.conf, which is much simpler. - -in /boot/extlinux/extlinux.conf on your rootfs, find the touch_id=0@0 -line, and change it to touch_id=3@3 - -### Load everything onto the board - You could do something like this: - -update_kernel.sh -```bash -#!/bin/bash - -L4T_DIR=/home/seb/TK1_SOM_2GB_Flashing/Linux_for_Tegra -SOM_DIR=/mnt/TK1SOM - -sudo cp $L4T_DIR/sources/kernel/arch/arm/boot/zImage -$SOM_DIR/boot/zImage sudo cp -$L4T_DIR/sources/kernel/arch/arm/boot/dts/tegra124-tk1-som-pm375-000-c00-00.dtb -$SOM_DIR/boot/tegra124-tk1-som-pm375-000-c00-00.dtb -``` - -rebuild.sh - assumes u-boot running `umc 0 mmc 0` at `` -``` - make - - make modules - - mount /dev/ /mnt/TK1SOM - - ./update_kernel.sh - - make modules_install INSTALL_MOD_PATH=/mnt/TK1SOM - - umount /dev/sdb1 -``` - -# Hello, world - - -When you boot up Linux login as: ubuntu password ubuntu. - -Then: -``` -dmesg | grep mcp # See if the driver loaded properly - -[ 618.718288] mcp251x spi0.0: entered mcp251x_can_probe -[ 618.718296] mcp251x spi0.0: v2 -[ 618.718332] mcp251x spi0.0: got clock -[ 618.718336] mcp251x spi0.0: finished clock configuration, freq: 20000000 -[ 618.718353] mcp251x spi0.0: allocated CAN device -[ 618.718358] mcp251x spi0.0: clock prepared for enable -[ 618.729737] mcp251x spi0.0: configured can netdev -[ 618.729741] mcp251x spi0.0: power & transceiver regulator pointers OK -[ 618.729745] mcp251x spi0.0: enabled power -[ 618.729749] mcp251x spi0.0: about to enable DMA (if required) -[ 618.729754] mcp251x spi0.0: finished allocating DMA & non-DMA buffers -[ 618.729757] mcp251x spi0.0: netdev set -[ 618.729799] mcp251x spi0.0: configured SPI bus -[ 618.740194] mcp251x spi0.0: CANSTAT 0x80 CANCTRL 0x07 -[ 618.740198] mcp251x spi0.0: successful hardware probe -[ 618.740795] mcp251x spi0.0: probed -[ 628.973815] mcp251x spi0.0: CNF: 0x00 0xbf 0x02 - -ls /sys/class/net # See if the can device is available and what it's called -can0 dummy0 eth0 ip6tnl0 lo rmnetctl sit0 - -sudo ip link set can0 up type can bitrate 500000 # Bring it up -ifconfig # Take a look... -can0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 - UP RUNNING NOARP MTU:16 Metric:1 - RX packets:0 errors:0 dropped:0 overruns:0 frame:0 - TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 - collisions:0 txqueuelen:10{ - RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) - -eth0 Link encap:Ethernet HWaddr 00:50:c2:72:00:59 - inet addr:10.13.1.223 Bcast:10.13.1.255 Mask:255.255.254.0 - inet6 addr: 2402:1800:4000:1:250:c2ff:fe72:59/64 Scope:Global - inet6 addr: fe80::250:c2ff:fe72:59/64 Scope:Link ------------------------------------------------------------------------- - -sudo apt-get install can-utils # (make sure to enable universe repository & update) -cansend can0 5A1#11.22.33.44.55.66.77.88 # Send a packet -candump can0 # Dump packets -``` - -# Loopback mode test -``` -ip link set can0 type can bitrate 500000 loopback on -ifconfig can0 up -candump any,0:0,#FFFFFFFF #In terminal 1 -cansend can0 123#dead #In terminal 2 -``` diff --git a/Hardware/CEI_TK1_SOM/LogicPro8/index.html b/Hardware/CEI_TK1_SOM/LogicPro8/index.html new file mode 100644 index 00000000000..1f9abbb172d --- /dev/null +++ b/Hardware/CEI_TK1_SOM/LogicPro8/index.html @@ -0,0 +1,668 @@ + + + + + + + Using the Saleae Logic Pro 8 to debug a CAN bus | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+
+

This page is archived and is no longer receiving updates.

+

It remains here because some of the content may still be useful.

+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/CEI_TK1_SOM/LogicPro8/index.md b/Hardware/CEI_TK1_SOM/LogicPro8/index.md deleted file mode 100644 index 24b503d6c1f..00000000000 --- a/Hardware/CEI_TK1_SOM/LogicPro8/index.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -archive: true -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Using the Saleae Logic Pro 8 to debug a CAN bus - -## Introduction - -This page is a quick write up of how we used a logic analyzer to help -solve a message loss issue when using a CAN bus. We had two TK1-SOMs -connected together on a CAN bus. One of them runs Linux natively and the -other runs an seL4 CAmkES application that receives CAN frames and then -prints them out. We found that although the CAmkES application could -correctly receive and reply to individual CAN frames, when frames were -being received at the maximum rate of the bus the CAmkES application -would only print out the first, last and occasionally a frame in the -middle. Read more about CAN -[here](https://en.wikipedia.org/wiki/CAN_bus), and -[here](https://www.saleae.com/index) is the Saleae Logic Pro 8 -site. Information about the TK1-SOM daughter board that we use is -[here](https://bitbucket.csiro.au/projects/OH/repos/tk1som-can-daughterboard/browse). - -Photo of CAN connected between two TK1-SOMs - -## Setup - -Each of the TK1-SOMs have a daughter board with a MCP25625 -CAN controller on them that can communicate with the processor over SPI. -When a controller receives a CAN message it notifies the processor by -interrupting it over a GPIO line. The processor then reads the CAN -message out of the controller over SPI. We can use the LogicPro8 to -probe the CAN bus, the SPI bus and also the GPIO pin that the interrupt -is received on to get a feel for what is going on. - -Photo of Saleae connected to TK1-SOM - -### Connecting to the CAN bus - -Schematic of daughter board - -On our daughter board (schematic above), our CAN bus pins are CAN1H, -CAN1L and GND. The Logic pro only needs to be plugged into CAN1L and GND -in order to decode CAN frames. We connect Channel 0 of the Logic pro as -shown: (Note that the schematic above shows the bottom of the daughter -board. So the order of the pins in the photo is reversed) - -Closeup photo of Saleae connected to TK1-SOm - -Saleae provides the [Logic](https://www.saleae.com/downloads) -software which is used to collect and analyse data. - -Screenshot of Logic software - -We configure Logic to collect at a rate of 50MS/s on channel 0 with -3.3+V - -Screenshot of Logic software: Collection bitrate setting menu - -We add CAN as an analyser for Channel 0 and set the bitrate to 125000 -which is what our TK1s are configured to use. - -Screenshot of Logic software: Analyser setting menu -Screenshot of Logic software: Analyser setting menu, sample bitrate setting - -We press start and then send one CAN message from the Linux TK1 to the -seL4 TK1. -``` -Native Linux: -ubuntu@tegra-ubuntu:\~$ cansend can0 5A1#11.22.33.44.55.66.77.88 - -seL4: Recv: error(0), id(5a1), data(11, 22, 33, 44, 55, 66, 77, 88) -``` -In Logic we see that we measured the CAN message being transmitted over -the bus. On the side under Decoded protocols Logic reports the fields of -the message that was sent. - -Screenshot of Logic software: CAN Sample result - -### Connecting to SPI - -We now connect to the SPI bus. To do this we need to measure the CLK, -MOSI and MISO. (These pins can be found at the bottom of the schematic). -We connect the probe to them as follows: - -Photo of attaching Saleae to SPI bus - -In Logic we add the new channels and configure a SPI analyser for them. - -Screenshot of Logic software: SPI Analyser setting menu - -After running the scan again while sending a CAN message we now see the -CAN frame sent on the bus followed by a few SPI transactions between the -Processor and CAN controller. - -Screenshot of Logic software: SPI Sample result - -Zooming in on a single SPI transaction we see that the CAN driver send -0x03, 0x2C and the CAN controller respond with 0x01. This corresponds to -Read register 0x2C (Interrupt flag register) and the register value -being returned as 0x01 (Message received). Under decoded protocols you -can see both CAN messages and SPI messages that were sent. - -Screenshot of Logic software: SPI Sample result, Zoomed in - -### GPIO Interrupt line - -We finally connect the probe to the -interrupt line. The daughter board configures the CAN controller to -interrupt over GPIO3 which is exposed as Pin 4 on pinout J5 as described -in the -[TK1-SOM Reference guide](https://coloradoengineering.com/wp-content/uploads/2021/04/Reference-Guide_FINAL-4.pdf). This is at the back of the TK1 relative to our -setup and we connect the probe as shown: - -Photo of attaching Saleae to GPIO interrupt - -We capture a message being sent again and now we can see the CAN message -being sent, the controller interrupting the GPIO line and then the -processor responding to the interrupt with SPI transactions. Eventually -the interrupt line is reset once the processor has read out the received -CAN message from the CAN controller. - -Screenshot of Logic software: GPIO Sample result diff --git a/Hardware/CEI_TK1_SOM/Tk1SomMods/index.html b/Hardware/CEI_TK1_SOM/Tk1SomMods/index.html new file mode 100644 index 00000000000..6eb96eab726 --- /dev/null +++ b/Hardware/CEI_TK1_SOM/Tk1SomMods/index.html @@ -0,0 +1,634 @@ + + + + + + + TK1-SOM Hardware Modifications | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/CEI_TK1_SOM/Tk1SomMods/index.md b/Hardware/CEI_TK1_SOM/Tk1SomMods/index.md deleted file mode 100644 index 2140d8513fa..00000000000 --- a/Hardware/CEI_TK1_SOM/Tk1SomMods/index.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# TK1-SOM Hardware Modifications - -## Adding a second UART connector - -### The issue - -{% include note.html %} -If you are using our [IO-Daughterboard](../DaughterBoard/), this is unnecessary; -instead a straight-line passthrough jumper is used to hook up to level -converters on the daughterboard. -{% include endnote.html %} - -The TK1-SOM has a secondary UART connection, however it's a bit of a -pain to get to as a normal jumper won't fit sandwiched between the -boards (below left), and you can't get to the connection from the top -because of the fan & heatsink (below right). - -jumper -heatsink - -### What it looks like - -Viewed from the bottom of the CPU board, the secondary UART is the 4 -unpopulated pins just under the ethernet jack pins (see below): - -connector - -### Right-angle connectors? - -Initially I looked at normal right-angle -0.1" headers, but they don't fit in either direction! - -clearance -short - -Above left: you can't connect a jack as there is no clearance to the -mezzanine connector. Above right: the pins will likely short with the -ethernet jack pins. - -### Solution: modify a dual-row header.. - - -A normal dual-row 0.1" header looks like this: - -normal
-header - -But we only need it for clearance - which we can do by just taking out -the bottom 2 rows of pins: - -bend
-pin -pull
-pin - -(It's easiest to use pliers to push the pins out a little bit, bend -them, and then pull them all the way out) - -Eventually, you end up with this (Only the top row left): - -single row
-header - -Now you can solder the pins on (make sure the pins are directed toward -the ethernet jack so there's enough clearance!) - -attached
-header - -Make sure not to use too much heat in this step, there are a few 0201 -components nearby which can easily come off just because of the nearby -heat. Also be sure to keep the iron angled away from the connectors as -it is quite easy to accidentally melt them. - -Once done, put the TK1-SOM back together and you have some easily -accessible UART pins: - -final - -The pinout & levels are described in the TK1-SOM reference guide - this -connector is called J2000. (Pin 1 is the square pad) - -Note the 1V8 logic levels! diff --git a/Hardware/CEI_TK1_SOM/index.html b/Hardware/CEI_TK1_SOM/index.html new file mode 100644 index 00000000000..186ffc0fecb --- /dev/null +++ b/Hardware/CEI_TK1_SOM/index.html @@ -0,0 +1,810 @@ + + + + + + + TK1 som | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/CEI_TK1_SOM/index.md b/Hardware/CEI_TK1_SOM/index.md deleted file mode 100644 index ae341656a78..00000000000 --- a/Hardware/CEI_TK1_SOM/index.md +++ /dev/null @@ -1,193 +0,0 @@ ---- -arm_hardware: true -cmake_plat: tk1 -xcompiler_arg: -DAARCH32=1 -platform: TK1-SOM -arch: ARMv7A -virtualization: true -iommu: true -soc: NVIDIA Tegra K1 -cpu: Cortex-A15 -verification: [ARM_HYP] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -# TK1 som - -The [TK1-SOM from Colorado -engineering](https://coloradoengineering.com/products/tk1-som-2gb/) is a small -form-factor system based on the NVIDIA Tegra K1. - -{% include hw-info.html %} - -## Hardware modifications and Daughterboards - - -[Adding some missing connectors](Tk1SomMods/) makes this board a -bit easier to use. - -We have also developed 2 daughterboards for the TK1-SOM - -- a [CAN daughterboard](CANBoard/), that adds two CAN - controllers on the SPI bus -- an [I/O daughterboard](DaughterBoard/) that adds CAN - controllers, various sensors and power management - -## U-Boot - -Upstream U-Boot now supports this board. - -Follow the instructions for the [Jetson TK1](../jetsontk1.html#flash-u-boot), however: - -- use - as the URL for repo -- don't apply the patch to increase the console buffer size -- use cei-tk1-som (instead of jetson-tk1) as the board ID - -As with the [Jetson](../jetsontk1.html) with this u-boot, set the -environment variable bootm_boot_mode to nonsec In this boot mode, the -standard Linux kernel will not boot: recompile with CONFIG_ARM_PSCI on -and CONFIG_CPU_IDLE off. - -The Pinmux spreadsheet, for use with - is -[here.](CEI_TK1_SOM_customer_pinmux_v11.xlsm) - -The original pinmux spreadsheet from Colorado is -[here](tk1-som_pinmux_V2.4.xlsm) - -## Accessing the MMC -Attach a USB cable -between the TK1-SOM's OTG port and your host, then on the U-Boot console -type `ums mmc 0`. - -A spinning wheel will appear on the console, and the entire MMC will be -presented as a USB storage device to your host. In the default -partitioning (as it comes from Colorado Engineering) partition 1 on the -device is the UBUNTU root partition. - -The [instructions for booting from SD](../GeneralARM.html#booting-from-sd-card) -are also valid for booting from MMC. - -## Serial Connection - The serial port is at 1V8 levels on J8, as -follows: (pin one is farthest from the ground hole) - -|Pin|Function|Direction| -|-|-|-| -|1 |Rx |In | -|2 |Tx |Out | -|3 |CTS |In | -|4 |RTS |Out | - -There is no ground connection. There is however an unpopulated hole next -to J8 that is connected to Ground. Alternatively one can use pin 1 of J5 -on the bottom (PSU) board as a ground connection. The pins are -unlabelled; pin 1 is the one in the middle of the board, under the gap -between J5 and J7 on the GPU/processor board. It's easiest to connect to -this if you unscrew and take the thing apart. Please do this at a -static-controlled workstation! - -If you need 1V8 as a reference (VDIO on some FTDI connectors), it's -available on the JTAG connector at pin 1. Pin one is the top right pin -if the ethernet port is to your left. It is marked with a dot on the -silk-screen. - -Speed 115200 8bits no parity; the default Linux image has login ubuntu, -password ubuntu. - -## Peripherals - We have an open-hardware CAN and I2C board available, -see [CAN-Board](CANBoard) - -## DFU: Loading kernels over USB -You can load seL4 kernels over USB using dfu-util. (you can also use fastboot, -but to boot a kernel over fastboot means making the ELF file produced -from the build system look like an ANDROID Linux kernel). - -On the u-boot console do: -``` -setenv dfu_alt_info "kernel ram $loadaddr 0x1000000" -saveenv -``` -once. - -Then to boot, on the u-boot console do: -``` -dfu 0 ram 0 -``` -and on your host: - -- install dfu-util (one time only: apt-get install dfu-util) -- connect to the TK1-SOM using a USB connector to the on-the-go - port - -- run dfu-util (you may need to run this with sudo) - - dfu-util --device 0955:701a -a kernel -D sel4test-driver-image-arm-tk1 . - dfu-util --device 0955:701a -e - - (if the -e option isn't supported you - can add -R to the above command or ignore it and manually Ctrl-C out - of dfu in u-boot on the TK1-SOM) - - -This will load the `sel4test-driver-image-arm-tk1` file onto the TK1-SOM -at address `$loadaddr`. You can then run it in uboot with - - bootefi $loadaddr - -If you want, you can automate all this with: - - setenv bootcmd_dfu "dfu 0 ram 0; bootefi $loadaddr" saveenv - -then just - - run bootcmd_dfu - -If you ''always'' want to do this you can do - - setenv bootcmd "run bootcmd_dfu" - -# Booting from a USB storage device - -You can boot from a USB storage device, by plugging it into the blue -port (on the power supply board). Patches are pending upstream to enable -the other port too. Use a FAT32 or ext2 partition on the storage; put -your image on it. You can either use a syslinux-style menu, or can boot -directly. -``` -usb start -fatload usb 0:1 ${loadaddr} sel4test-image-arm -bootelf ${loadaddr} -``` - -# Using L4T from CEI - - -CEI provides modifications to L4T and instructions for getting it -running on the TK1-SOM. Unfortunately these seem to only be available on -a private FTP site, so you'll have to contact CEI for access to those. - -Once you have access, follow the instructions in the README.txt. - -If you have a recent distribution and use the instructions from -Colorado, you will end up with an unbootable system --- the format of -the ext4 filesystem, created by the flash.sh script has features that -the u-boot and kernel cannot understand. The simple change is to build -an ext3 filesystem instead. - -Do: - - -``` -sudo env ROOTFS_TYPE=ext3 ./flash.sh -L bootloader/ardbeg/u-boot.bin tk1-som mmcblk0p1 -``` -instead of using the instructions in the Colorado-provided -README.txt - -Alternatively we have a customised image that we use: more information -at [L4TCan](L4TCan). diff --git a/Hardware/GeneralARM.html b/Hardware/GeneralARM.html new file mode 100644 index 00000000000..98f78744000 --- /dev/null +++ b/Hardware/GeneralARM.html @@ -0,0 +1,647 @@ + + + + + + + Loading seL4 onto ARM Hardware | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/GeneralARM.md b/Hardware/GeneralARM.md deleted file mode 100644 index 197de01a800..00000000000 --- a/Hardware/GeneralARM.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Loading seL4 onto ARM Hardware - -The ARM platform has many ways to boot into an operating system. Typically there -is some low-level ROM code (very specific to each device) that turns on RAM, and -turns on enough clocks to be able to load a second-stage bootloader which does -the work. Some do this in several stages, to enable Trust Zone, HYP-mode etc. - -The main bootloaders after the ROM are U-Boot, UEFI, Loki (for Samsung devices) -and simpleboot. Most of these provide Fastboot over USB to allow software -loading. - - On UEFI for arm: [http://blog.hansenpartnership.com/efitools-for-arm-released/](http://blog.hansenpartnership.com/efitools-for-arm-released/) On U-Boot for arm: [http://www.denx.de/wiki/U-Boot](http://www.denx.de/wiki/U-Boot) - -Load from U-Boot, from SD card or flash, or using Fastboot or TFTP. Most -applications have two parts: treat the "kernel" part as a kernel, and the -"application" part like an initial root disk. If there is only one part to an -image (e.g., seL4test for some platforms) treat it like a kernel. - -Detailed instructions differ from board to board. See the [Supported -Platforms](index.html) page for links to board-specific instructions. - -## Fastboot - -Most ARM platforms other than the Beagle Boards that seL4 can use support -booting via Fastboot. - -To boot via Fastboot, you need to convert the image file produced by the seL4 -build system into a U-Boot image. - -```bash -mkimage -A arm -a 0x48000000 -e 0x48000000 -C none -A arm -T kernel -O qnx -d INPUT_FILE OUTPUT_FILE -``` - -The reason we choose `-O qnx` is because we exploit the fact that, like seL4, -QNX expects to be ELF-loaded. The alternative is to convert our ELF file into a -binary file using `objcopy`. The address to use varies from board to board. -Unless you change the load address, use these: - -| **Platform** | **Address** | -| :------------ | :----------| -| Arndale, Odroid-X, Odroid-XU | 0x48000000| -| Sabre Lite |0x30000000| -| Panda, Panda ES | 0x80000000| - -When you have your image, put the board into Fastboot mode (interrupt U-Boot, -and type "fastboot"), then do: - -```fastboot -fastboot boot OUTPUT_FILE -``` - -## Booting from SD card - -Pull out the SD card from your board, and put it into an SD card reader attached -to your build host. Mount the (MS-DOS) filesystem on the first partition on the -SD card and copy your image to it. Unmount the filesystem, and put the card back -into your board. Reset the board (by power cycling, or pressing the reset -button). To run the image: - -``` -mmc init -mmcinfo -fatload mmc 0 ${loadaddr} sel4test-image-arm -bootelf ${loadaddr} -``` - -You can use - -``` -fatls mmc 0 -``` - -to see what is there. Most U-Boot implementations define a suitable `loadaddr` -in their environment. - -## TFTP booting - -Setting up a DHCP and TFTP server are out of scope for this document. Once you -have done that, however, and installed a TFTP-enabled U-Boot on your board if it -doesn't already have one. - -You can then power up the device and stop U-Boot's auto boot feature if -enabled by pressing a key, and do: - -``` -dhcp file address -bootelf address -``` diff --git a/Hardware/HiKey/index.html b/Hardware/HiKey/index.html new file mode 100644 index 00000000000..c6446cd6d62 --- /dev/null +++ b/Hardware/HiKey/index.html @@ -0,0 +1,890 @@ + + + + + + + HiKey | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+
+

This page is archived and is no longer receiving updates.

+

It remains here because some of the content may still be useful.

+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/HiKey/index.md b/Hardware/HiKey/index.md deleted file mode 100644 index 95df759e375..00000000000 --- a/Hardware/HiKey/index.md +++ /dev/null @@ -1,272 +0,0 @@ ---- -arm_hardware: true -archive: true -cmake_plat: hikey -xcompiler_arg: -DAARCH64=1 -platform: HiKey -arch: ARMv8A -virtualization: true -iommu: false -soc: Kirin 620 -cpu: Cortex-A53 -verification: [AARCH64] -Contrib: Data61 -Maintained: false -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# HiKey - -{% include hw-info.html %} - -## Pre-Requisites - - -- One HiKey Board. See - [Hikey 96Board](http://www.96boards.org/products/ce/hikey/) -- Fully working development environment. See - the [set up instructions](../../projects/buildsystem/host-dependencies.html) page. - -## Getting Started - -The Hikey board is based around the [HiSilicon Kirin -620](https://github.com/96boards/documentation/blob/master/consumer/hikey/hikey620/hardware-docs/Hi6220V100_Multi-Mode_Application_Processor_Function_Description.pdf) -eight-core ARM Cortex-A53 64-bit !SoC running at 1.2GHz. Toe start using 32-bit -seL4 follow the below instructions. They will walk you step by step beginning -from the source files and ultimately running an image. - -## 1. Creating a directory - -```bash -mkdir hikey-flash -cd hikey-flash -``` - -## 2. Custom toolchains - -The cross-toolchains GCC 4.9 for Aarch64 and -gnueabihf are required to flash the Hikey. If versions of GCC 5, or -higher, are installed the following steps must be taken as GCC5 is not -backwards compatible. Otherwise skip to the next Section. - -The necessary files are: - -- GCC 4.9 cross-toolchain for - Aarch64 (gcc-linaro-4.9-2016.02-x86_64_aarch64-linux-gnu.tar.xz) -- GCC 4.9 cross-toolchain for - gnueabihf (gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf.tar.xz) - -The files are obtainable from the -following links: - -- -- - -```bash -#Run the following commands to use GCC 4.9 only in this directory mkdir -arm-tc arm64-tc tar --strip-components=1 -C ${PWD}/arm-tc -xf ~/Downloads gcc-linaro-4.9-2016.02-x86_64_aarch64-linux-gnu.tar.xz -tar --strip-components=1 -C ${PWD}/arm64-tc -xf ~/Downloads/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf.tar.xz -export PATH="${PWD}/arm-tc/bin:${PWD}/arm64-tc/bin:$PATH" - -# To check that GCC 4.9 is used aarch64-linux-gnu-gcc --version -arm-linux-gnueabihf-gcc --version -``` - -## 3. Obtaining the source files - -```bash -git clone -b hikey --depth 1 https://github.com/96boards/edk2.git linaro-edk2 -git clone -b hikey --depth 1 https://github.com/96boards-hikey/arm-trusted-firmware.git -git clone -b hikey --depth 1 https://github.com/96boards/LinaroPkg.git -git clone --depth 1 https://github.com/96boards/l-loader.git -git clone git://git.linaro.org/uefi/uefi-tools.git -``` - -## 4. Changing console to UART0 - -```bash -gedit LinaroPkg/platforms.config - -# Uncomment the following lines -BUILDFLAGS=-DSERIAL_BASE=0xF8015000 -ATF_BUILDFLAGS=CONSOLE_BASE=PL011_UART0_BASE CRASH_CONSOLE_BASE=PL011_UART0_BASE -``` - -## 5. Patching the UEFI for the Hikey - -Obtain the patch from [edk2.patch](edk2.patch) and follow the below steps. - -```bash -cd linaro-edk2 -patch -p1 < ~/Downloads/edk2.patch -# Then return to the main directory hikey-flash -``` - -## 6.Modifying the firmware - -If settings are required -to be changed while in EL3 then the file in -arm-trusted-firmware/bl1/bl1_main.c can be modified. To disable the -prefetcher obtain the patch file from -[bl1_main.patch](bl1_main.patch) and follow the below steps. - -```bash -cd arm-trusted-firmware/bl1 -patch -p5 < ~/Downloads/bl1_main.patch -# Then return to the main directory hikey-flash -``` - -## 7. Modifying the UEFI - -If settings are required to -be changed while in EL2 then the file in -linaro-edk2/MdeModulePkg/Application/noboot/efi-stub.S can be modified. -To disable the prefetcher obtain the patch file from -[efi-stub.patch](efi-stub.patch) follow the below steps. - -```bash - cd -linaro-edk2/MdeModulePkg/Application/noboot patch -p7 < -~/Downloads/efi-stub.patch # Then return to the main directory -hikey-flash -``` - -## 8. Building the UEFI for the Hikey - -```bash -export AARCH64_TOOLCHAIN=GCC49 -export EDK2_DIR=${PWD}/linaro-edk2 -export UEFI_TOOLS_DIR=${PWD}/uefi-tools - -cd ${EDK2_DIR} -${UEFI_TOOLS_DIR}/uefi-build.sh -c ../LinaroPkg/platforms.config -b RELEASE -a ../arm-trusted-firmware hikey - -cd ../l-loader -ln -s ${EDK2_DIR}/Build/HiKey/RELEASE_GCC49/FV/bl1.bin -ln -s ${EDK2_DIR}/Build/HiKey/RELEASE_GCC49/FV/fip.bin - -# If the DEBUG version of the build is require run the below commands instead -cd ${EDK2_DIR} -${UEFI_TOOLS_DIR}/uefi-build.sh -c ../LinaroPkg/platforms.config -b DEBUG -a ../arm-trusted-firmware hikey - -cd ../l-loader -ln -s ${EDK2_DIR}/Build/HiKey/DEBUG_GCC49/FV/bl1.bin -ln -s ${EDK2_DIR}/Build/HiKey/DEBUG_GCC49/FV/fip.bin -# End - -arm-linux-gnueabihf-gcc -c -o start.o start.S -arm-linux-gnueabihf-gcc -c -o debug.o debug.S -arm-linux-gnueabihf-ld -Bstatic -Tl-loader.lds -Ttext 0xf9800800 start.o debug.o -o loader -arm-linux-gnueabihf-objcopy -O binary loader temp -python gen_loader.py -o l-loader.bin --img_loader=temp --img_bl1=bl1.bin -sudo PTABLE=linux-4g bash -x generate_ptable.sh -python gen_loader.py -o ptable-linux.img --img_prm_ptable=prm_ptable.img -``` - -## 9. Boot Image - -{% include note.html %} -96boards does no longer seem to provide the release binary below. -{% include endnote.html %} - -Obtain the boot image from -`https://builds.96boards.org/releases/hikey/linaro/debian/latest/boot-fat.uefi.img.gz` -and follow the below commands. - -```bash -gunzip *.img.gz - -mkdir -p boot-fat -sudo mount -o loop,rw,sync boot-fat.uefi.img boot-fat - -sudo rm boot-fat/EFI/BOOT/fastboot.efi -sudo cp ../linaro-edk2/Build/HiKey/RELEASE_GCC49/AARCH64/AndroidFastbootApp.efi boot-fat/EFI/BOOT/fastboot.efi -sudo cp ../linaro-edk2/Build/HiKey/RELEASE_GCC49/AARCH64/noboot.efi boot-fat/EFI/BOOT/ - -sudo umount boot-fat -``` - -## 10. Minicom - -Install and configure minicom. Two terminals are required for the commands. If -minicom is already installed and configured skip the next Section. - -```bash -# In the first terminal -cd /dev/ -ls -# Note the ttyUSBX that is observed - -# In the second terminal -sudo apt-get install minicom -sudo minicom -s -``` - - 1. Use the arrow keys to scroll down to Serial port setup and press - enter - 2. Press 'a' to start editing the Serial Device - 3. Rename the serial device to /dev/ttyUSBX where X is the observed - number - 4. Press 'esc' twice and select Save setup as dfl - -## 11. Flash the firmware - - 1. Turn off the power to the board if it is on. - 2. Connect UART0 to a USB port if it is not connected already. - 3. Connect the Hikey board with a USB to micro USB cable. - 4. Connect pins 1&2 (AUTO PWR) and 3&4 (BOOT SEL) on the - J15 header. The pins are silk screened onto the PCB, otherwise - see page the [Hikey user manual](https://www.96boards.org/documentation/consumer/hikey/hikey620/hardware-docs/hardware-user-manual.md.html#board-overview). - 5. Obtain the Hikey flash recovery tool from - - 6. Turn the power on the to Hikey - 7. Three terminals are then required for the following commands - -```bash -# In the first terminal -ls -# Note the next ttyUSBY that is observed, in addition to the current ttyUSBX - -# In the third terminal -sudo python ~/Downloads/hisi-idt.py --img1=l-loader.bin -d /dev/ttyUSBY -wget https://builds.96boards.org/releases/hikey/linaro/binaries/latest/nvme.img -sudo fastboot flash ptable ptable-linux.img -sudo fastboot flash fastboot fip.bin -sudo fastboot flash nvme nvme.img -sudo fastboot flash boot boot-fat.uefi.img -# The debug prints are displayed in the second terminal - -# Then power off the Hikey -``` - -## 12. Build your first seL4 system - -{% include sel4test.md %} - -The Hikey also supports AArch32 mode. If you choose to build the AArch32 kernel, -please be sure to pass `-DAARCH32=1` instead of `-DAARCH64=1`. - -## 13. Booting the Hikey - - -1. Remove the connection for pins 3&4 on the J15 header and connect - pins 5&6 instead. -2. Power the Hikey -3. Run the desired image. The command below is an example. - -```bash -# In the third terminal -fastboot boot images/sel4test-driver-image-arm-hikey -c mode=32bit -``` - -## 14. Modifications to firmware or UEFI - - -- If the firmware is modified the whole process from and including - Section 9 onward must be done. -- If the UEFI loader is modified then only Section 9 and from - Section 11 onward need to be completed - -Other instructions can be viewed here: diff --git a/Hardware/IA32.html b/Hardware/IA32.html new file mode 100644 index 00000000000..e2cbfdb2c78 --- /dev/null +++ b/Hardware/IA32.html @@ -0,0 +1,687 @@ + + + + + + + PC99 (32-bit) | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/IA32.md b/Hardware/IA32.md deleted file mode 100644 index 49d849a46ab..00000000000 --- a/Hardware/IA32.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -cmake_plat: ia32 -simulation_target: true -simulation_only: false -arch: x86 -platform: PC99 -virtualization: true -iommu: true -verification: [] -Contrib: "Data61" -Maintained: "seL4 Foundation" -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# PC99 (32-bit) - -{% include pc99.md %} diff --git a/Hardware/IF6410.html b/Hardware/IF6410.html new file mode 100644 index 00000000000..6b264b108f2 --- /dev/null +++ b/Hardware/IF6410.html @@ -0,0 +1,674 @@ + + + + + + + Inforce IFC6410 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+
+

This page is archived and is no longer receiving updates.

+

It remains here because some of the content may still be useful.

+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/IF6410.md b/Hardware/IF6410.md deleted file mode 100644 index 723dd0f1253..00000000000 --- a/Hardware/IF6410.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -archive: true -arm_hardware: true -xcompiler_arg: -DAARCH32=1 -platform: Inforce IFC6410 -arch: ARMv7A -virtualization: false -iommu: false -soc: Snapdragon S4 Pro APQ8064 -cpu: Krait (Cortex-A15 like) -verification: [] -Contrib: Data61 -Maintained: false -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Inforce IFC6410 - -{% include hw-info.html %} - -This page contains info on building seL4 for the Inforce IFC6410 development -board, running a Qualcomm Krait processor that is like an A15. Krait is a -Qualcomm reimplementation of ARMv7A. - -## Building for the Inforce IFC6410 - -To use default build config, use `inforce_` configurations. - -To make a bootable image you will need the Android bootimg tool. On -Debian, do - -```bash -apt-get install android-mkbootimg -``` - -Then when you have built your app, you can create a boot image with these -commands, substituting the name of your output file for -`sel4test-driver-image-arm-apq8064`: - - -```bash -> ramdisk -objcopy -O binary sel4test-driver-image-arm-apq8064 sel4test-driver-image-arm-apq8064.bin -mkbootimg --kernel sel4test-driver-image-arm-apq8064.bin --ramdisk ramdisk --base "0x82000000" --output boot.img -``` - -## Serial Console - -The serial port on the Inforce is at RS232 voltage levels. Connect to a -normal serial port, then use minicom or screen to talk to it, at 115200 -baud, no parity, eight bits. - -## Booting seL4 - -Force the board to boot into Fastboot mode by shorting pins 26 and 30 on the -large header — see [This blog -post](https://web.archive.org/web/20150526213626/http://mydragonboard.org/2013/forcing-ifc6410-into-fastboot) -for details. - -You will see something like this on the serial port: - -```none -Android Bootloader - UART_DM Initialized!!! -[0] welcome to lk - -[10] platform_init() -[10] target_init() -[130] USB init ept @ 0x88f4e000 -[170] fastboot_init() -[170] udc_start() -[300] -- reset -- -[300] -- portchange -- -[470] fastboot: processing commands -``` - -You can then do: - -```none -fastboot boot boot.img -``` - -and should then see the output from your app. - -## Caveats - -The timer driver is not complete, which means that two of the tests in seL4test -will fail. diff --git a/Hardware/JetsonTX2.html b/Hardware/JetsonTX2.html new file mode 100644 index 00000000000..1c5786f15d6 --- /dev/null +++ b/Hardware/JetsonTX2.html @@ -0,0 +1,634 @@ + + + + + + + Jetson TX2 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/JetsonTX2.md b/Hardware/JetsonTX2.md deleted file mode 100644 index e35aef87ddc..00000000000 --- a/Hardware/JetsonTX2.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -arm_hardware: true -cmake_plat: tx2 -xcompiler_arg: -DAARCH64=1 -platform: TX2 -arch: ARMv8A, AArch64 only -virtualization: true -iommu: true -soc: NVIDIA Tegra X2 -cpu: Cortex-A57 Quad, Dual NVIDIA Denver -verification: [AARCH64] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Jetson TX2 - -The [Jetson TX2](https://elinux.org/Jetson_TX2) is an embedded system-on-module -(SOM) developed by NVIDIA. - -{% include hw-info.html %} - -The seL4 kernel has a limited port to the TX2 which supports the SoM -only in 64-bit mode. - -## Building seL4test - -{% include sel4test.md %} - -## Booting via PXE - -A U-Boot uImage will be created by the seL4 build system. This can be booted -by U-Boot using PXE. diff --git a/Hardware/Kzm.html b/Hardware/Kzm.html new file mode 100644 index 00000000000..244195e77a8 --- /dev/null +++ b/Hardware/Kzm.html @@ -0,0 +1,558 @@ + + + + + + + KZM (Deprecated seL4 platform) | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+
+

This page is archived and is no longer receiving updates.

+

It remains here because some of the content may still be useful.

+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/Kzm.md b/Hardware/Kzm.md deleted file mode 100644 index dbd653fd8a1..00000000000 --- a/Hardware/Kzm.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -archive: true -simulation_target: true -simulation_only: false -cmake_plat: kzm -xcompiler_arg: -DAARCH32=1 -platform: KZM -arch: ARMv6A -virtualization: false -iommu: false -soc: i.MX31 -cpu: ARM1136J -verification: [] -Contrib: Data61 -Maintained: false -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -# KZM (Deprecated seL4 platform) - -**seL4 previously supported the KZM-ARM11-01 until version 12.1.0, which can also be simulated in qemu.** -**Support for this platform has since been removed** - -The KZM is deprecated, ARMv11 Hardware which was used for the original seL4 verification. The latest -verification platform is the [SabreLite](sabreLite.html). diff --git a/Hardware/MaaXBoard.html b/Hardware/MaaXBoard.html new file mode 100644 index 00000000000..501e8996ea8 --- /dev/null +++ b/Hardware/MaaXBoard.html @@ -0,0 +1,623 @@ + + + + + + + Avnet MaaXBoard | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/MaaXBoard.md b/Hardware/MaaXBoard.md deleted file mode 100644 index bc0be3c41f6..00000000000 --- a/Hardware/MaaXBoard.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -arm_hardware: true -cmake_plat: maaxboard -xcompiler_arg: -DAARCH64=1 -platform: Avnet MaaXBoard -arch: ARMv8A -virtualization: true -iommu: false -soc: i.MX8MQ -cpu: Cortex-A53 Quad 1.5 GHz -verification: [AARCH64] -Contrib: 'Capgemini Engineering"' -Maintained: 'Capgemini Engineering"' -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2022 seL4 Project a Series of LF Projects, LLC. ---- - -# Avnet MaaXBoard - -{% include hw-info.html %} - -## Building seL4test - -{% include sel4test.md %} -Also `-DAARCH32=1` is available. diff --git a/Hardware/OdroidC2.html b/Hardware/OdroidC2.html new file mode 100644 index 00000000000..9f6513866a3 --- /dev/null +++ b/Hardware/OdroidC2.html @@ -0,0 +1,644 @@ + + + + + + + Odroid-C2 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/OdroidC2.md b/Hardware/OdroidC2.md deleted file mode 100644 index cc54445a677..00000000000 --- a/Hardware/OdroidC2.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -arm_hardware: true -cmake_plat: odroidc2 -xcompiler_arg: -DAARCH64=1 -platform: Odroid-C2 -arch: ARMv8A, AArch64 -virtualization: true -iommu: false -soc: Amlogic S905 -cpu: Cortex-A53 -verification: [AARCH64] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Odroid-C2 - -The [Odroid-C2](https://wiki.odroid.com/odroid-c2/odroid-c2) is a single board -computer based on the Amlogic S905 System-on-Chip. - -{% include hw-info.html %} - -Only 64-bit mode is supported both with and without SMP. Hypervisor -support has not been tested. - -## U-Boot - -The default U-Boot will allocate DMA regions that can corrupt seL4 -kernel memory. -Mainline U-Boot can be used instead on this board. -Some Linux distributions include mainline U-Boot binaries compiled for -this board, or you can compile U-Boot yourself. - -## Building seL4test - -{% include sel4test.md %} - -## Booting via TFTP - -Make sure you've set up a TFTP server to serve the seL4 image. - -``` -dhcp -tftp 0x20000000 :sel4test-driver-image-arm-odroidc2 -go 0x20000000 -``` diff --git a/Hardware/OdroidC4.html b/Hardware/OdroidC4.html new file mode 100644 index 00000000000..d5a55e4887e --- /dev/null +++ b/Hardware/OdroidC4.html @@ -0,0 +1,635 @@ + + + + + + + Odroid-C4 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/OdroidC4.md b/Hardware/OdroidC4.md deleted file mode 100644 index 8f52b04460c..00000000000 --- a/Hardware/OdroidC4.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -arm_hardware: true -cmake_plat: odroidc4 -xcompiler_arg: -DAARCH64=1 -platform: Odroid-C4 -arch: ARMv8A, AArch64 -virtualization: true -iommu: false -soc: Amlogic S905X3 -cpu: Cortex-A55 -verification: [AARCH64] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Odroid-C4 - -The [Odroid-C4](https://wiki.odroid.com/odroid-c4/odroid-c4) is a single board -computer based on the Amlogic S905X3 System-on-Chip. - -{% include hw-info.html %} - -Note that only 64-bit mode is supported. - -## Building seL4test - -{% include sel4test.md %} - -## Booting via TFTP - -Make sure you've set up a TFTP server to serve the seL4 image. - -``` -dhcp -tftp 0x20000000 :sel4test-driver-image-arm-odroidc4 -go 0x20000000 -``` diff --git a/Hardware/OdroidXU.html b/Hardware/OdroidXU.html new file mode 100644 index 00000000000..c08bae7dbed --- /dev/null +++ b/Hardware/OdroidXU.html @@ -0,0 +1,653 @@ + + + + + + + seL4 on the Odroid XU | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/OdroidXU.md b/Hardware/OdroidXU.md deleted file mode 100644 index 1e27b4f25f2..00000000000 --- a/Hardware/OdroidXU.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -arm_hardware: true -cmake_plat: exynos5410 -xcompiler_arg: -DAARCH32=1 -platform: OdroidXU -arch: ARMv7A -virtualization: true -iommu: limited -soc: Exynos5 -cpu: Cortex-A15 -verification: [ARM, ARM_HYP] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# seL4 on the Odroid XU - -This page provides info on the -[Odroid-XU](https://www.hardkernel.com/shop/odroid-xu/) -Exynos 5 board - -{% include hw-info.html %} - -seL4 assumes that one boots in HYP mode. To do this, one needs a new -signed bootloader. - -Follow the instructions -[on the HardKernel Forum](http://forum.odroid.com/viewtopic.php?f=64&t=2778&sid=be659cc75c16e1ecf436075e3c548003&start=60#p33805) to get and flash the firmware - -The standard U-Boot will allow booting via Fastboot or by putting the -bootable ELF file onto an SD card or the eMMC chip. - -## Run seL4test using fastboot - -### Get and build sel4test - -{% include sel4test.md %} - -### Put seL4test onto the board - -Boot the Odroid, with serial cable -attached, and a terminal emulator attached to the serial port. - -Interrupt U-Boot's autoboot by hitting SPACE - -Enter Fastboot mode by typing fastboot - -On the host, - -```bash -mkimage -A arm -a 0x48000000 -e 0x48000000 -C none -A arm -T kernel -O qnx -d images/sel4test-driver-image-arm-exynos5 image -fastboot boot image -``` diff --git a/Hardware/OdroidXU4.html b/Hardware/OdroidXU4.html new file mode 100644 index 00000000000..6072f136338 --- /dev/null +++ b/Hardware/OdroidXU4.html @@ -0,0 +1,628 @@ + + + + + + + seL4 on the Odroid XU4 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/OdroidXU4.md b/Hardware/OdroidXU4.md deleted file mode 100644 index 75a8d3c76ea..00000000000 --- a/Hardware/OdroidXU4.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -arm_hardware: true -cmake_plat: exynos5422 -xcompiler_arg: -DAARCH32=1 -platform: OdroidXU4 -arch: ARMv7A -virtualization: true -iommu: limited -soc: Exynos5 -cpu: Cortex-A15 -verification: [ARM, ARM_HYP] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# seL4 on the Odroid XU4 - -This page provides info on the -[Odroid-XU4](https://www.hardkernel.com/shop/odroid-xu4-special-price/) -Exynos 5 board - -{% include hw-info.html %} - -## Get and build sel4test - -{% include sel4test.md %} diff --git a/Hardware/RISCV.html b/Hardware/RISCV.html new file mode 100644 index 00000000000..89080377e00 --- /dev/null +++ b/Hardware/RISCV.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/Hardware/Rpi3.html b/Hardware/Rpi3.html new file mode 100644 index 00000000000..5af1ed19f65 --- /dev/null +++ b/Hardware/Rpi3.html @@ -0,0 +1,850 @@ + + + + + + + Raspberry PI 3 Model B and Model B+ | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/Rpi3.md b/Hardware/Rpi3.md deleted file mode 100644 index a73e40b6da0..00000000000 --- a/Hardware/Rpi3.md +++ /dev/null @@ -1,184 +0,0 @@ ---- -arm_hardware: true -cmake_plat: bcm2837 -xcompiler_arg: -DAARCH32=1 -platform: Raspberry Pi 3-b -arch: ARMv8A -virtualization: true -iommu: false -soc: BCM2837 -cpu: Cortex-A53 -verification: [ARM] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Raspberry PI 3 Model B and Model B+ - -{% include note.html %} -This is an experimental port and is not guaranteed to work. We recommend -using the [Raspberry PI4B](./Rpi4.md) instead. -{% include endnote.html %} - -{% include hw-info.html %} - -## Hardware - -[raspberry-pi-3-b-reduced-schematics.pdf](https://datasheets.raspberrypi.com/rpi3/raspberry-pi-3-b-reduced-schematics.pdf) - -|Feature |Part |Datasheet | -|-|-|-| -|USB+ETH |SMSC LAN9514|[pdf](https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/DataSheets/00002306A.pdf)| -|SoC |BCM2837 | | - -## Serial connection - -Serial TX and RX are located at GPIO pins 14 and 15 respectively (See Hardware -schematic above) - -## Reset - -Short the jumper marked "RUN" between the expansion header and USB sockets to -perform a soft reset of the CPU. - -## U-Boot - -Right now, the default U-Boot will not successfully boot an seL4 image -on the RPi3, because of cache configuration issues in the seL4 -ELFLoader. This problem can be remedied by having U-boot disable caches -before loading seL4. Unfortunately, the stock upstream U-boot used to -disable caches before loading the kernel image, but as of [this patch](https://github.com/u-boot/u-boot/commit/995eab8b5b580b67394312b1621c60a71042cd18), -U-boot no longer disables caches. - -In order to obtain a U-boot binary that disables caching, you can either -compile U-Boot from source yourself, or you can -**[use this prebuilt U-Boot binary image which already works](https://sel4.systems/Info/Docs/u-boot-working-rpi3-32bit-v2017.11.bin)**. - -If you choose to build your own U-boot, then clone U-boot from upstream, -then revert commit 995eab8b5b580b67394312b1621c60a71042cd18, and then -build it: - -```bash -git clone https://github.com/u-boot/u-boot.git u-boot -cd u-boot -git revert 995eab8b5b580b67394312b1621c60a71042cd18 -make CROSS_COMPILE=arm-linux-gnueabi- rpi_3_32b_defconfig -make CROSS_COMPILE=arm-linux-gnueabi- -``` - -This will enable you to get the most up-to-date U-boot which will boot -seL4 on the RPi3 successfully. - -{% include note.html %} -Automatic revert is not going to work if you are using the latest version of -u-boot. You need to manually revert the change by looking at the changeset. -{% include endnote.html %} - -Building u-boot using configuration `rpi_3_3b_defconfig` is going to -produce an image that can boot seL4 on the Raspberry PI Model 3B and -3B+. Unfortunately for the 3B+ tftp boot is not going to work using -this version of u-boot (the `tftp` command will report error -`No Ethernet found`). -In this case you need to build an image specific for the 3B+. -Unfortunately the provided defconfig file for the 3B+ model -(`rpi_3_b_plus_defconfig`) doesn't appear to build correctly. - -In order to use tftp boot on a Raspberry PI Model 3B+, use the -defconfig for the 3B (as described above), then manually change the -`CONFIG_DEFAULT_DEVICE_TREE` parameter in the `.config` from: - -```config -CONFIG_DEFAULT_DEVICE_TREE="bcm2837-rpi-3-b" -``` - -to: - -```config -CONFIG_DEFAULT_DEVICE_TREE="bcm2837-rpi-3-b-plus" -``` - -Now the generated image should be able to use the on-board -Ethernet device for TFTP. - - -## SD card setup - -The PI boots from the first FAT32 partition on the SD card. Where files are -specified, they should be located in the root directory of this partition. - -|Stage |Filename |Description |Source| -|-|-|-|-| -|FSBL |- |Mounts SD and loads SSBL |ROM | -|SSBL |bootcode.bin|Loads GPU firmware and boots GPU| | -|GPU firmware |start.elf or recovery.elf |Loads CPU bootloader and boots CPU | | -|Usually the Linux kernel, but could also be u-boot |u-boot.bin |u-boot| You can either [use our prebuilt U-boot which works](https://sel4.systems/Info/Docs/u-boot-working-rpi3-32bit-v2017.11.bin), or compile your own using the instructions above | -||config.txt|u-boot parameters |Add enable_uart=1 and kernel=u-boot.bin to the bottom of config.txt | -||uboot.env |u-boot saved environment |Generated by u-boot (default environment) bootcmd copied to bootcmd_orig bootcmd and bootdelay removed | - -## Getting seL4 onto your Raspberry Pi 3 - -In this section you should find the two most convenient methods of getting a -kernel image booted on your RPi3 described. All three methods assume that you -have already built a kernel image using one of our projects---such as seL4Test: - -{% include sel4test.md %} - -The two methods described here are using the SD card and TFTP. - -Both methods require you to use an SD card to provide the RPi3 firmware -with a U-boot bootloader it can load. The RPi3 doesn't store its -bootloader in flash memory, so it looks for the bootloader on the SD -card. Please see the section above for how to prepare your SD Card for -the base set of requirements; you can glance at the table above to see -the files you'll need and how to obtain them. - -### SD Card - -Get a micro-SD card ready by getting the base files copied onto it (See the -previous section). - -Following this, copy your seL4 image (such as an seL4test image), onto -the SD card in its root directory - that's it. You can now remove the SD -Card from your PC and re-insert it into the RPi3, and power the RPi3 on. - -When the RPi3 boots up, be sure to interrupt the boot process and drop -into the U-boot command prompt. From the U-boot command prompt, type -something the following: fatls mmc 0. If you don't see your seL4 image -file's name printed out, then you might need to double-check your steps -so far to make sure you didn't forget something along the way. If you -see your file listed, then do something like: - -``` -fatload mmc 0 0x10000000 sel4test-driver-image-arm-bcm2837 -bootelf 0x10000000 -``` - -### TFTP - -Be sure you've set up the internal SD card with the required files for -U-Boot and the RPi3 firmware (consult the table above). Then make -certain that you've started up a TFTP server with your seL4 image being -served by that TFTP server. From there: - -``` -usb start -dhcp -tftp 0x10000000 :sel4test-driver-image-arm-bcm2837 -bootelf 0x10000000 -``` - -If you are using a Raspberry PI Model 3B+, make sure you build the -correct u-boot image as described above. - -To use static IP instead of DHCP, use: - -``` -usb start -setenv ipaddr -setenv serverip -tftp 0x10000000 sel4test-driver-image-arm-bcm2837 -bootelf 0x10000000 -``` diff --git a/Hardware/Rpi4.html b/Hardware/Rpi4.html new file mode 100644 index 00000000000..6aabee852f9 --- /dev/null +++ b/Hardware/Rpi4.html @@ -0,0 +1,737 @@ + + + + + + + Raspberry Pi 4 Model B | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/Rpi4.md b/Hardware/Rpi4.md deleted file mode 100644 index 0e396c07839..00000000000 --- a/Hardware/Rpi4.md +++ /dev/null @@ -1,95 +0,0 @@ ---- -arm_hardware: true -cmake_plat: rpi4 -xcompiler_arg: -DAARCH64=1 -DRPI4_MEMORY=<1024,2048,4096,8192> -platform: Raspberry Pi 4B -arch: ARMv8A -virtualization: true -iommu: false -soc: BCM2711 -cpu: Cortex-A72 -verification: [AARCH64] -Contrib: 'Hensoldt and ARM Research IceCap' -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Raspberry Pi 4 Model B - -{% include hw-info.html %} - -## Serial connection - -Serial TX and RX are located at GPIO pins 14 and 15 respectively. - -## U-Boot - -In order to build U-Boot for the Raspberry Pi 4B, run the following commands: -```bash -git clone https://github.com/u-boot/u-boot.git u-boot -cd u-boot -make CROSS_COMPILE=aarch64-linux-gnu- rpi_4_defconfig -make CROSS_COMPILE=aarch64-linux-gnu- -``` - -In the `u-boot` directory you should now see the U-Boot image `u-boot.bin` indicating that U-Boot has successfully compiled. - -More information regarding U-Boot support for the Raspberry Pi can be found [here](https://u-boot.readthedocs.io/en/latest/board/broadcom/raspberrypi.html). - -## SD card setup -The RPi4 boots from the first FAT32 partition on the microSD card. Where files are specified, -they should be located in the root directory of this partition. - -|Stage |Filename |Description |Source| -|-|-|-|-| -|FSBL |- |Mounts SD and loads SSBL |ROM | -|GPU firmware |start4.elf |Loads CPU bootloader and boots CPU | | -|Additional GPU firmware |fixup4.dat |Fixes memory locations used in start4.elf | | -|Usually the Linux kernel, but could also be U-Boot |u-boot.bin |U-Boot binary| Compiled using the instructions above | -||config.txt|U-Boot parameters |Add `arm_64bit=1` and `kernel=u-boot.bin` to the bottom of `config.txt` | -||uboot.env |U-Boot saved environment |Generated by U-Boot (default environment) bootcmd copied to bootcmd_orig bootcmd and bootdelay removed. This file will not exist when you first setup your SD card. | -||bcm2711-rpi-4-b.dtb | RPi4 device tree blob | | -||overlays/* | Device tree overlays | | - -## Getting seL4 onto your Raspberry Pi 4 - -The final step to test that you have setup your RPi4 correctly is to build and run the -seL4test project. - -You will see that the `init-build.sh` command contains the flag -`-DRPI4_MEMORY`, this specifies how much RAM exists on the Raspberry Pi that will run -the final seL4 image. Since seL4 needs to know the physical memory layout of the hardware -at build time, and the RPi4 has multiple models with different amounts of RAM, we have to -specify how much RAM the system will have when we build seL4. If `-DRPI4_MEMORY` is not supplied, -seL4 defaults to expecting 8GB of memory. - -{% include sel4test.md %} - -Now that we have a bootable image, we can run it on your RPi4. The following instructions describe -how to use a microSD card to boot seL4, using the seL4test image as well as the files mentioned -in the previous section. - -The first step is to copy the seL4 image onto the microSD card to the root directory. After -removing the card from your computer and inserting into your RPi4, you can power on the RPi4. - -Once the RPi4 boots up, you will see something like the following text from U-Boot: -``` -Hit any key to stop autoboot: 2 -``` - -At this point you want to interrupt the U-Boot booting process by pressing any key. - -You will now be in the U-Boot command prompt, type the following command: -``` -fatls mmc 0 -``` - -You should see the seL4test image you just placed on your microSD card. - -From here, you can load and boot the image using: -``` -fatload mmc 0 0x10000000 sel4test-driver-image-arm-bcm2711 -go 0x10000000 -``` diff --git a/Hardware/Star64/index.html b/Hardware/Star64/index.html new file mode 100644 index 00000000000..3dbc6d7fefe --- /dev/null +++ b/Hardware/Star64/index.html @@ -0,0 +1,815 @@ + + + + + + + Pine64 Star64 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/Star64/index.md b/Hardware/Star64/index.md deleted file mode 100644 index 786ecdc54fb..00000000000 --- a/Hardware/Star64/index.md +++ /dev/null @@ -1,220 +0,0 @@ ---- -riscv_hardware: true -cmake_plat: star64 -xcompiler_arg: -DRISCV64=1 -DUseRiscVOpenSBI=OFF -platform: Pine64 Star64 -arch: RV64GBC, RV64IMAC, RV32IMAFBC -virtualization: false -iommu: false -simulation_target: false -verification: [] -Contrib: "Community" -Maintained: "seL4 Foundation" -soc: StarFive JH7110 -cpu: U74-MC, E24 -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Pine64 Star64 - -The Star64 is a RISC-V SBC by Pine64 based on the StarFive JH7110 SoC. Check -the [Pine64 Wiki](https://wiki.pine64.org/wiki/STAR64) for details. - -{% include hw-info.html %} - -The StarFive JH7110 SoC is comprised of the SiFive U74-MC (four 64-bit U74 -cores and one 64-bit S7 core) and one SiFive E24 32-bit core. Note that by -default seL4 is setup to use the U74 cores as neither the S7 or E24 core has -S-Mode, which seL4 requires. - -The Star64 arrives with the following boot process from the SPI flash: - -1. U-Boot SPL starts -2. OpenSBI starts -3. U-Boot proper starts - -From U-Boot proper you can then load and start an seL4 image, see below for details. - -## Building the GCC toolchain - -{% include risc-v.md %} - -## Building seL4test - -{% include sel4test.md %} - -## Booting via microSD card - -```sh -fatload mmc 1 0x60000000 sel4test-driver-image-riscv-star64 -go 0x60000000 -``` - -## Booting via TFTP - -If you have setup a TFTP server, enter the following commands on the U-Boot console -to load an image via the network. - -```sh -dhcp -tftpboot 0x60000000 :sel4test-driver-image-riscv-star64 -go 0x60000000 -``` - -## Producing a SD card bootable image - -If you require a custom U-Boot or have other constraints, you may need to create -your own bootable image. The following instructions show how to make a bootable -image for a microSD card that can then be inserted into the Star64. Note that you -will need to change the booting mode via the DIP switch, like so: - -![Star64 DIP switch when booting via microSD card](dip_switch.png) - -The boot process of this bootable image is the same as the SPI flash booting -process. Unfortunately, at the time of writing, U-Boot does not support booting -in M-Mode which means U-Boot must be loaded by an SBI in S-Mode. - -### Acquiring sources - -At the time of writing, mainline U-Boot does not support the Pine64 Star64, hence -if you want to built it yourself, there is a patch to apply available on a fork of -U-Boot. Note that these instructions are reproduced from [here](https://github.com/Ivan-Velickovic/star64_sdcard). - -```sh -git clone https://github.com/Fishwaldo/u-boot.git --branch Star64 -git clone https://github.com/riscv/opensbi.git -git clone https://github.com/starfive-tech/soft_3rdpart.git -``` - -### Compiling U-Boot and U-Boot SPL - -```sh -CROSS_COMPILE= make -C u-boot pine64_star64_defconfig -CROSS_COMPILE= make -C u-boot -``` - -### Compiling OpenSBI - -Now that we have U-Boot, we can make the OpenSBI image that contains U-Boot as the -payload. - -```sh -mkdir -p opensbi_build -make -C $OPENSBI PLATFORM=generic \ - CROSS_COMPILE= \ - FW_FDT_PATH=u-boot/arch/riscv/dts/pine64_star64.dtb \ - FW_PAYLOAD_PATH=u-boot/u-boot.bin \ - PLATFORM_RISCV_XLEN=64 \ - PLATFORM_RISCV_ISA=rv64imafdc \ - PLATFORM_RISCV_ABI=lp64d \ - O=opensbi_build \ - FW_TEXT_START=0x40000000 \ -``` - -Now we need to take the payload and turn it into a Flattened uImage Tree (FIT) for U-Boot SPL -to load. - -First we'll need an ITS file to describe the FIT: - -```sh -/dts-v1/; - -/ { - description = "U-boot-spl FIT image for JH7110 Pine64 Star64"; - #address-cells = <2>; - - images { - firmware { - description = "u-boot"; - data = /incbin/("opensbi_build/platform/generic/firmware/fw_payload.bin"); - type = "firmware"; - arch = "riscv"; - os = "u-boot"; - load = <0x0 0x40000000>; - entry = <0x0 0x40000000>; - compression = "none"; - }; - }; - - configurations { - default = "config-1"; - - config-1 { - description = "U-boot-spl FIT config for JH7110 Pine64 Star64"; - firmware = "firmware"; - }; - }; -}; -``` - -Now, invoke the `mkimage` tool to generate the FIT. - -```sh -mkimage -f -A riscv -O u-boot -T firmware opensbi_uboot_fit.img -``` - -### Add SPL header to U-Boot SPL binary - -First we need to compile a small tool that adds the SPL header to the U-Boot -SPL image. - -```sh -cd soft_3rdpart/spl_tool -make -``` - -Now invoke the tool on the U-Boot SPL image: - -```sh -spl_tool -c -f u-boot/spl/u-boot-spl.bin -``` - -You should now have a file called `u-boot-spl.bin.normal.out`. - -### Generate bootable image - -Lastly, we need to create the bootable image from all of these binaries. For this -the `genimage` tool is used. - -First, we'll need the configuration file. Note that you will have to change the -paths to match where you build each binary. - -```conf -image sdcard.img { - hdimage { - gpt = true - } - - partition spl { - image = "/path/to/u-boot-spl.bin.normal.out" - partition-type-uuid = 2E54B353-1271-4842-806F-E436D6AF6985 - offset = 2M - size = 2M - } - - partition uboot { - image = "/path/to/opensbi_uboot_fit.img" - partition-type-uuid = 5B193300-FC78-40CD-8002-E86C45580B47 - offset = 4M - size = 4M - } -} -``` - -Now we can pass this configuration, a temporary directory path, and a root -directory path to the genimage tool. - -```sh -# genimage expects these directories to exist before invoking it -mkdir -p temp -mkdir -p root -# represents the top dir from where the genimage tool looks for -# the image paths in the configuration file -genimage --config --inputpath --tmppath temp -``` - -The final image will be `images/sdcard.img`. You can either use the `dd` utility -or the [balenaEtcher](https://www.balena.io/etcher) program to write the image to -your microSD card. diff --git a/Hardware/VMware/index.html b/Hardware/VMware/index.html new file mode 100644 index 00000000000..9cda07bde94 --- /dev/null +++ b/Hardware/VMware/index.html @@ -0,0 +1,690 @@ + + + + + + + seL4 on VMware | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/VMware/index.md b/Hardware/VMware/index.md deleted file mode 100644 index c3b8d5f726d..00000000000 --- a/Hardware/VMware/index.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# seL4 on VMware - - -This is a quick guide on how to run seL4 x86 on VMWare Workstation/Player. -Written based on decently up-to-date versions Workstation 9 & 10 Player 5 & 6 -and for a Linux host machine. May work on Mac host machine, won't work for -Windows host (although general idea should be similar). - -This guide assumes that your project is all set up and configured to build for -x86. Read the [set up -instructions](../../projects/buildsystem/host-dependencies.html) otherwise. - -## Setting up a VM - - -Both the free non-commercial Player and Workstation run seL4 fine; the -difference with player is that additional setup is required to automate -everything if you use Player. In order to start / stop VMWare from the -command line you need to install VMWare VIX API for Player. Workstation -comes with VIX and Player both installed. - -Once you get VMWare installed and running, go on and create a VM for -seL4 (choose install OS later, and choose "Other" for guest OS type). - -### Set Up Serial Port - - -After you have a VM, we want to add a serial port so we can see the -stuff we print out. Go machine configuration -> Add device -> -Serial port. - -Make sure this is the only serial port, and it is serial port 0. If you -selected Guest OS type "Ubuntu" or something VMWare may set up a secret -hidden serial port which you can't edit from the GUI. Choose "Other" for -guest type. - -Virtual Machine Settings - -There are three options for the serial port - -1. **Output to a text file** (easiest but output only). The VM - will dump its serial output to a text file when it runs, and you - can simply go `less -F `. -2. **Use physical serial port** (best but requires serial cable + - another machine to minicom/picocom off it). Set it to /dev/ttyS0 - or something. - -3. **Output to a socket** (allows input/output but annoying to -set up). You'll want to apt-get install socat and then run something -like: -```bash -#!/bin/bash -while true; do - socat -d -d UNIX-CONNECT:/tmp/vsock,forever PTY:link=/dev/tty99 -done -``` -and - then minicom to `/dev/tty99` or - to `/dev/pts/`. - -Choose depending on whether you can get a serial cable from your -machine, whether you need output...etc. Easiest is to just use a text -file. - -### Install GRUB2 - - -Once you have a VM, you'll want to set up the hard disk partitions and -get GRUB2 on the virtual hard disk and its MBR somehow. Easiest way to -do this is simple install some Linux distro that has GRUB2 (Ubuntu -Debian Fedora...etc). If you want to save some hard disk space you can -try -[Ubuntu Minimal](https://help.ubuntu.com/community/Installation/MinimalCD). Choose to install GRUB to the MBR when installing your OS. - -Alternatively if you feel like extra headaches to save space and time -you can try install GRUB2 manually with grub-install from some Linux -Live CD image. - -### Add GRUB2 Option To Run seL4 - - -Now we want to edit its **grub.cfg** (usually in /grub2 or /boot/grub -or something like that) somehow and modify it to boot our seL4 kernel + -userland binary. - -Simplest method is to simply use VMWare player to boot into the guest OS -you just installed, and then edit the grub.cfg from the guest OS itself. - -Another method is to use **vmware-mount**: -```bash -# Usage: vmware-mount diskPath [partition num] mountPoint -mkdir /tmp/vmount -vmware-mount /path/to/your/HD.vmdk /tmp/vmount -# Now do your editing in /tmp/vmount. -vmware-mount -d /tmp/vmount -``` - -Once you have grub.cfg open in your favourite editor, Add an extra -option to it: -``` -menuentry 'seL4' --class fedora --class gnu-linux --class gnu --class os { - load_video - insmod gzio - insmod part_msdos - insmod ext2 - set root='(hd0,msdos1)' - search --no-floppy --fs-uuid --set=root - echo 'Loading seL4 kernel' - multiboot /kernel-image-ia32-pc99 - echo 'Loading initial module ...' - module /sel4-image-ia32-pc99 -} -``` - -Of course, change the `--set=root ` line to your -DeviceID (set the DeviceID from other entries already in your grub.cfg), -and also change the `sel4-image-ia32-pc99` to match the name of your -binary image that your Make produces (look in your build logs or in -`images/` folder). - -Also may be a good idea to add `set default=` -to the grub.cfg, so grub is configured to boot seL4. - -## Using The VM to run seL4 - - -Now you have a VM ready, you'll want to copy your built kernel + -userland binary image over onto its HD, and then start the VM, and -choose the seL4 option in GRUB, and then monitor the serial output. You -will need to repeat this entire above process every time you build & run -seL4. Fortunately I have a script does all of the above in one go (may -need editing of paths here and there to fit where you put things). - -[Download seL4vmw.py](seL4vmw.py) - -### Do It Manually - - -First, use vmware-mount to mount the vmdk disk image. Then copy your -newly built kernel and user binaries over. Then, unmount using -vmware -d. - -Then start your VM (either from VMWare Player GUI or using the vmrun -script from VIX API), and choose seL4 boot option. Monitor serial -output. If you've set up the seL4 option as the grub default then you -just need to wait for the grub time out. - -If your kernel fails an assert during startup, make sure your kernel -repo is up to date. diff --git a/Hardware/X64.html b/Hardware/X64.html new file mode 100644 index 00000000000..3fe7dea0317 --- /dev/null +++ b/Hardware/X64.html @@ -0,0 +1,689 @@ + + + + + + + PC99 (64-bit) | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/X64.md b/Hardware/X64.md deleted file mode 100644 index 35be04dc6da..00000000000 --- a/Hardware/X64.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -cmake_plat: x86_64 -simulation_target: true -simulation_only: false -arch: x64 -platform: PC99 -virtualization: true -iommu: true -verification: [X64] -Contrib: "Data61" -Maintained: "seL4 Foundation" -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# PC99 (64-bit) - -{% include pc99.md %} diff --git a/Hardware/ZC706.html b/Hardware/ZC706.html new file mode 100644 index 00000000000..04cbfad05d4 --- /dev/null +++ b/Hardware/ZC706.html @@ -0,0 +1,699 @@ + + + + + + + Zynq7000 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/ZC706.md b/Hardware/ZC706.md deleted file mode 100644 index 0402c107d09..00000000000 --- a/Hardware/ZC706.md +++ /dev/null @@ -1,97 +0,0 @@ ---- -cmake_plat: zynq7000 -xcompiler_arg: -DAARCH32=1 -arm_hardware: true -defconfig: zynq7000_debug_xml_defconfig -simulation_target: true -simulation_only: false -platform: Zynq-7000 ZC706 Evaluation Kit -arch: ARMv7A -virtualization: false -iommu: false -soc: Zynq7000 -cpu: Cortex-A9 -verification: [ARM] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Zynq7000 - -This board is a Zynq-7000 ZC706 Evaluation Kit, Rev 1.2 - -{% include hw-info.html %} - -Xilinx maintains [online material](https://www.amd.com/en/products/adaptive-socs-and-fpgas/evaluation-boards/ek-z7-zc706-g.html), including designs and documentation. - -## Building - -### seL4test - -{% include sel4test.md %} - - -## Development environment - -### Vivado SDK - -Bitstream generation (ie FPGA code compiler) is not supported for ZC706 when using a free license. Other features may still work - -The Vivado SDK provides many features: - -- first stage boot loader and boot image generation -- FPGA logic design -- ARM software design -- Support libraries -- JTAG connectivity and debugging - -Download it [here](http://www.xilinx.com/support/download.html) (Requires a free Xilinx account). - -After the download completes, extract and/or run the install program. You should run as root to install cable drivers, otherwise, they can be installed independently later. - -When provided with install options, select "Vivado Design Edition" because the WebPack install does not support the ZC706 board. Ensure the Software Development Kit (SDK) is selected as an install candidate - -When installation competes, the License Manager window will open. Choose "obtain license" from the tree on the left, select "Get Free Licenses" and click "Connect Now". You will be navigated to the Xilinx login page in order to register for a license. Select the free webpack license and a license file will be mailed to you. While still in the License Manager, click "Load License" from the tree on the left and click the "Copy License" button. Select the license file that you received via email and click "Open". Once you have configured your license, close the window and wait for the install to finish. - -The last step is to install the cable drivers as follows: - -```bash -uname -a | grep "x86_64" && LIN=lin64 || LIN=lin -cd /opt/Xilinx/SDK/2014.4/data/xicom/cable_drivers/$LIN/install_script/install_drivers -sudo ./install_drivers -``` - -### JTAG - -[http://wiki.gentoo.org/wiki/Xilinx_USB_JTAG_Programmers](http://wiki.gentoo.org/wiki/Xilinx_USB_JTAG_Programmers) - -You will need - -- xmd (shipped with vivado but can possibly be obtained as a package on its own) -- digilent USB drivers - -1. create a xmd.ini script within the directory that you intend to run xmd from. - - ```bash - # Connect to the board - connect arm hw - # program the fpga with the provided bitstream - fpga -f system_wrapper.bit - # The processor needs to be initialised (Clocks, MIO, etc), but these depend on the bitstream! ps7_init.tcl was generated with the bitstream. Load and execute this script to configure the processor. - source ps7_init.tcl - ps7_init - ps7_post_config - # Download your elf file (Could also be done from GDB) - dow bootimg.elf - # To run the elf file directly from XMD, uncomment the following lines - # run - # exit - ``` - -2. Run XMD. XMD will not terminate; leave it open. -3. Next run GDB. Any arm-*-gdb should work. -4. Enter "target extended-remote localhost:1234" to connect to the GDB server that was started by XMD or the hw_server -5. "c" to start the program! diff --git a/Hardware/ZCU102.html b/Hardware/ZCU102.html new file mode 100644 index 00000000000..f17ad3bf098 --- /dev/null +++ b/Hardware/ZCU102.html @@ -0,0 +1,785 @@ + + + + + + + Zynq ZCU102 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/ZCU102.md b/Hardware/ZCU102.md deleted file mode 100644 index 1e774ce4b21..00000000000 --- a/Hardware/ZCU102.md +++ /dev/null @@ -1,192 +0,0 @@ ---- -cmake_plat: zcu102 -xcompiler_arg: -DAARCH64=1 -arm_hardware: true -platform: Zynq ZCU102 Evaluation Kit -arch: ARMv8A -virtualization: true -iommu: true -soc: Zynq UltraScale+ MPSoC -cpu: Cortex-A53 -verification: [ARM, AARCH64] -Contrib: 'DornerWorks' -Maintained: 'DornerWorks' -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Zynq ZCU102 - -The board is Zynq UltraScale MPSoC ZCU102 Eval Kit, Rev 1.1 -The port also works on the [ZCU106](ZCU106.html) evaluation kit. - -{% include hw-info.html %} - -Xilinx maintains [online material](https://www.amd.com/en/products/adaptive-socs-and-fpgas/evaluation-boards/ek-u1-zcu102-g.html), including designs and documentation. - -## Building - -### seL4test - -{% include sel4test.md %} - -The ZCU102 also supports AArch32 mode. If you choose to build the AArch32 kernel, -please be sure to pass `-DAARCH32=1` instead of `-DAARCH64=1`. - -## ARM Trusted Firmware (ATF) - -```bash -git clone https://github.com/Xilinx/arm-trusted-firmware.git -cd arm-trusted-firmware -make PLAT=zynqmp RESET_TO_BL31=1 CROSS_COMPILE=aarch64-linux-gnu- -``` - -Generated ELF file can be found at `build/zynqmp/release/bl31/bl31.elf`. - -## U-Boot - -```bash -git clone https://github.com/Xilinx/u-boot-xlnx.git -cd u-boot-xlnx -make xilinx_zynqmp_virt_defconfig -# Use "make menuconfig" to open the configuration interface, change the value -in "Default Device Tree" to "zynqmp-zcu102-rev1.0" -make CROSS_COMPILE=aarch64-linux-gnu- -``` - -If you use gcc > 10, apply the following patch before compiling: - -```patch -diff --git a/scripts/dtc/dtc-lexer.l b/scripts/dtc/dtc-lexer.l -index fd825ebba6..24af549977 100644 ---- a/scripts/dtc/dtc-lexer.l -+++ b/scripts/dtc/dtc-lexer.l -@@ -38,7 +38,6 @@ LINECOMMENT "//".*\n - #include "srcpos.h" - #include "dtc-parser.tab.h" - --YYLTYPE yylloc; - extern bool treesource_error; - - /* CAUTION: this will stop working if we ever use yyless() or yyunput() */ -``` - -If you choose to use the AArch32 kernel, apply the following patch: - -```patch -diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c -index 52b08c4dbe..c9ebd33d15 100644 ---- a/board/xilinx/zynqmp/zynqmp.c -+++ b/board/xilinx/zynqmp/zynqmp.c -@@ -358,7 +358,7 @@ unsigned long do_go_exec(ulong (*entry)(int, char * const []), int argc, - smp_kick_all_cpus(); - dcache_disable(); - armv8_switch_to_el1(0x0, 0, 0, 0, (unsigned long)entry, -- ES_TO_AARCH64); -+ ES_TO_AARCH32); - } else { - printf("FAIL: current EL is not above EL1\n"); - ret = EINVAL; -``` - -Generated ELF file is `u-boot.elf`. - -Upstream U-Boot also works; instructions are [here](https://u-boot.readthedocs.io/en/stable/board/xilinx/zynqmp.html) - -## Development Environment - -Install Vivado SDK or Vitis Software Platform from Xilinx [here](http://www.xilinx.com/support/download.html) -(Requires a free Xilinx account). The following instructions are based on Vivado SDK v2019.1 - -### First stage boot load (FSBL) - -Open Vivado SDK, create a new application project. - -- OS platform: standalone -- Hardware Platform: ZCU102_hw_platform -- Processor: psu_cortexa53_0 -- Language: C -- Compiler: 64-bit -- Hypervisor Guest: No -- Template: Zynq MP FSBL - -Generated ELF file is in `Debug` directory - -### PMU firmware - -Open Vivado SDK, create a new application project. - -- OS platform: standalone -- Hardware Platform: ZCU102_hw_platform -- Processor: psu_pmu_0 -- Language: C - -Generated ELF file is in `Debug` directory - -## Booting via JTAG - -Set DIP switch (SW6) to JTAG boot (on, on, on, on). - -Start the Xilinx debug tool (shipped with Vivado SDK): - -```bash -xsct -nodisp -``` - -Upload files to the board using XSCT prompt: - -```tcl -connect -targets -set -filter {name =~ "PSU"} -mwr 0xffca0038 0x1ff -targets -set -filter {name =~ "MicroBlaze*"} -dow pmufw.elf -con -target -set -filter {name =~ "Cortex-A53 #0*"} -rst -processor -dow fsbl.elf -con -dow bl31.elf -con -dow u-boot.elf -con -# Load the seL4 image in ELF format, the file can be found in the sel4test build directory -dow elfloader/elfloader -con -``` - -## Booting via SD Card - -Get an SD card can format it with FAT32. - -Set DIP switch (SW6) to SD boot (off, off, off, on) - -Create a output.bif file with the following content: - -```bif -the_ROM_image: -{ - [bootloader, destination_cpu = a53-0] fsbl.elf - [pmufw_image] pmufw.elf - [destination_cpu = a53-0, exception_level = el-3] bl31.elf - [destination_cpu = a53-0, exception_level = el-2] u-boot.elf -} -``` - -Generate the bootable binary: - -```bash -bootgen -arch zynqmp -image output.bif -w on -o BOOT.bin -``` - -Copy BOOT.bin to the SD card - -Insert the SD card into ZCU102 then power on the board, and drop into the U-Boot -prompt. When you're at the prompt, type the following to load the ELF file generated -from building seL4test: - -```bash -fatload mmc 0 0x8000000 sel4test-driver-image-arm-zynqmp -bootelf 0x8000000 -``` diff --git a/Hardware/ZCU106.html b/Hardware/ZCU106.html new file mode 100644 index 00000000000..67fb15ce37d --- /dev/null +++ b/Hardware/ZCU106.html @@ -0,0 +1,785 @@ + + + + + + + Zynq ZCU1026 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/ZCU106.md b/Hardware/ZCU106.md deleted file mode 100644 index 4e4d1e6a849..00000000000 --- a/Hardware/ZCU106.md +++ /dev/null @@ -1,192 +0,0 @@ ---- -cmake_plat: zcu106 -xcompiler_arg: -DAARCH64=1 -arm_hardware: true -platform: Zynq ZCU106 Evaluation Kit -arch: ARMv8A -virtualization: true -iommu: true -soc: Zynq UltraScale+ MPSoC -cpu: Cortex-A53 -verification: [ARM, AARCH64] -Contrib: 'DornerWorks' -Maintained: 'DornerWorks' -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Zynq ZCU1026 - -The board is Zynq UltraScale MPSoC ZCU106 Evaluation Kit. The seL4 implementation -is the same as for the [ZCU102](ZCU102.html) - -{% include hw-info.html %} - -Xilinx maintains [online material](https://www.amd.com/en/products/adaptive-socs-and-fpgas/evaluation-boards/zcu106.html), including designs and documentation. - -## Building - -### seL4test - -{% include sel4test.md %} - -The ZCU102 also supports AArch32 mode. If you choose to build the AArch32 kernel, -please be sure to pass `-DAARCH32=1` instead of `-DAARCH64=1`. - -## ARM Trusted Firmware (ATF) - -```bash -git clone https://github.com/Xilinx/arm-trusted-firmware.git -cd arm-trusted-firmware -make PLAT=zynqmp RESET_TO_BL31=1 CROSS_COMPILE=aarch64-linux-gnu- -``` - -Generated ELF file can be found at `build/zynqmp/release/bl31/bl31.elf`. - -## U-Boot - -```bash -git clone https://github.com/Xilinx/u-boot-xlnx.git -cd u-boot-xlnx -make xilinx_zynqmp_virt_defconfig -# Use "make menuconfig" to open the configuration interface, change the value -in "Default Device Tree" to "zynqmp-zcu106-rev1.0" -make CROSS_COMPILE=aarch64-linux-gnu- -``` - -If you use gcc > 10, apply the following patch before compiling: - -```patch -diff --git a/scripts/dtc/dtc-lexer.l b/scripts/dtc/dtc-lexer.l -index fd825ebba6..24af549977 100644 ---- a/scripts/dtc/dtc-lexer.l -+++ b/scripts/dtc/dtc-lexer.l -@@ -38,7 +38,6 @@ LINECOMMENT "//".*\n - #include "srcpos.h" - #include "dtc-parser.tab.h" - --YYLTYPE yylloc; - extern bool treesource_error; - - /* CAUTION: this will stop working if we ever use yyless() or yyunput() */ -``` - -If you choose to use the AArch32 kernel, apply the following patch: - -```patch -diff --git a/board/xilinx/zynqmp/zynqmp.c b/board/xilinx/zynqmp/zynqmp.c -index 52b08c4dbe..c9ebd33d15 100644 ---- a/board/xilinx/zynqmp/zynqmp.c -+++ b/board/xilinx/zynqmp/zynqmp.c -@@ -358,7 +358,7 @@ unsigned long do_go_exec(ulong (*entry)(int, char * const []), int argc, - smp_kick_all_cpus(); - dcache_disable(); - armv8_switch_to_el1(0x0, 0, 0, 0, (unsigned long)entry, -- ES_TO_AARCH64); -+ ES_TO_AARCH32); - } else { - printf("FAIL: current EL is not above EL1\n"); - ret = EINVAL; -``` - -Generated ELF file is `u-boot.elf`. - -Upstream U-Boot also works; instructions are [here](https://u-boot.readthedocs.io/en/stable/board/xilinx/zynqmp.html) - -## Development Environment - -Install Vivado SDK or Vitis Software Platform from Xilinx [here](http://www.xilinx.com/support/download.html) -(Requires a free Xilinx account). The following instructions are based on Vivado SDK v2019.1 - -### First stage boot load (FSBL) - -Open Vivado SDK, create a new application project. - -- OS platform: standalone -- Hardware Platform: ZCU102_hw_platform -- Processor: psu_cortexa53_0 -- Language: C -- Compiler: 64-bit -- Hypervisor Guest: No -- Template: Zynq MP FSBL - -Generated ELF file is in `Debug` directory - -### PMU firmware - -Open Vivado SDK, create a new application project. - -- OS platform: standalone -- Hardware Platform: ZCU102_hw_platform -- Processor: psu_pmu_0 -- Language: C - -Generated ELF file is in `Debug` directory - -## Booting via JTAG - -Set DIP switch (SW6) to JTAG boot (on, on, on, on). - -Start the Xilinx debug tool (shipped with Vivado SDK): - -```bash -xsct -nodisp -``` - -Upload files to the board using XSCT prompt: - -```tcl -connect -targets -set -filter {name =~ "PSU"} -mwr 0xffca0038 0x1ff -targets -set -filter {name =~ "MicroBlaze*"} -dow pmufw.elf -con -target -set -filter {name =~ "Cortex-A53 #0*"} -rst -processor -dow fsbl.elf -con -dow bl31.elf -con -dow u-boot.elf -con -# Load the seL4 image in ELF format, the file can be found in the sel4test build directory -dow elfloader/elfloader -con -``` - -## Booting via SD Card - -Get an SD card can format it with FAT32. - -Set DIP switch (SW6) to SD boot (off, off, off, on) - -Create a output.bif file with the following content: - -```bif -the_ROM_image: -{ - [bootloader, destination_cpu = a53-0] fsbl.elf - [pmufw_image] pmufw.elf - [destination_cpu = a53-0, exception_level = el-3] bl31.elf - [destination_cpu = a53-0, exception_level = el-2] u-boot.elf -} -``` - -Generate the bootable binary: - -```bash -bootgen -arch zynqmp -image output.bif -w on -o BOOT.bin -``` - -Copy BOOT.bin to the SD card - -Insert the SD card into ZCU102 then power on the board, and drop into the U-Boot -prompt. When you're at the prompt, type the following to load the ELF file generated -from building seL4test: - -```bash -fatload mmc 0 0x8000000 sel4test-driver-image-arm-zynqmp -bootelf 0x8000000 -``` diff --git a/Hardware/ariane.html b/Hardware/ariane.html new file mode 100644 index 00000000000..519f93dde63 --- /dev/null +++ b/Hardware/ariane.html @@ -0,0 +1,656 @@ + + + + + + + Ariane | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/ariane.md b/Hardware/ariane.md deleted file mode 100644 index 664cdfc1439..00000000000 --- a/Hardware/ariane.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -riscv_hardware: true -cmake_plat: ariane -xcompiler_arg: -DRISCV64=1 -platform: Ariane -arch: RV64IMAC -virtualization: false -iommu: false -simulation_target: false -verification: [] -Contrib: "Data61" -Maintained: "Hensoldt Cyber" -cpu: Ariane (CVA6) -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Ariane - -Ariane is a 6-stage RISC-V CPU. For details, refer to -[https://github.com/pulp-platform/ariane](https://github.com/pulp-platform/ariane) - -{% include hw-info.html %} - -## Building the GCC toolchain - -{% include risc-v.md %} - -## Building seL4test - -{% include sel4test.md %} - -## Running seL4test -Ariane only provides support for the [Genesys 2 -board](https://reference.digilentinc.com/reference/programmable-logic/genesys-2/reference-manual) - -1. Compile the bitstream from source or download the pre-build bitstream from - [here](https://github.com/pulp-platform/ariane/releases). - -2. Prepare the SD card - ```sh - sudo sgdisk --clear --new=1:2048:67583 --new=2 --typecode=1:3000 --typecode=2:8300 /dev/sdX - sudo dd if=images/sel4test-driver-image-riscv-ariane of=/dev/sdX1 - ``` - Note that the "sgdisk" command above also creates a second partition for - Linux rootfs, you could download a pre-build Linux kernel from - [here](https://github.com/pulp-platform/ariane-sdk/releases) to verify that - the FPGA is working correctly. - -3. Booting from the SD card and observing the output from the UART port. diff --git a/Hardware/arndale.html b/Hardware/arndale.html new file mode 100644 index 00000000000..b1352601c25 --- /dev/null +++ b/Hardware/arndale.html @@ -0,0 +1,752 @@ + + + + + + + Arndale | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+
+

This page is archived and is no longer receiving updates.

+

It remains here because some of the content may still be useful.

+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/arndale.md b/Hardware/arndale.md deleted file mode 100644 index d0f0a7b10da..00000000000 --- a/Hardware/arndale.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -archive: true -arm_hardware: true -cmake_plat: exynos5250 -xcompiler_arg: -DAARCH32=1 -platform: Arndale -arch: ARMv7A -virtualization: true -iommu: false -soc: Exynos5 -cpu: Cortex-A15 -verification: [ARM_HYP] -Contrib: Data61 -Maintained: false -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Arndale - -{% include hw-info.html %} - -## Client setup - -### Hardware requirements: - -1. 5V power supply, center +ve - -## SD card setup - -The offsets depend on which versions of bl1, bl2 and U-Boot you get. - -For BL1 from the Android tree: - -|Key|Position (block) | -|-|-| -|BL1 |1 | -|BL2 (uboot-module)|31 (8k) | -|u-boot |63 | -|!TrustZone |719 | - -Note — U-Boot understands DOS filesystems (and ext2) so uImage, uInitrd -and the DTB could be normal files in a partition, rather than at a fixed -offset on the SD card. - -These offsets are designed for a U-Boot environment like this: - -```none -bootargs=root=/dev/mmcblk1p1 rw rootwait console=ttySAC2,115200n8 init --no-log -bootcmd=mmc read 40007000 451 2000;mmc read 42000000 2451 20;bootm 40007000 - 42000000 -``` - -If you have a separate boot partition on your card you could instead -use: (untested as yet) - -```none -kernel=0x40007000 -dtb=42000000 -bootcmd=mmc init; fatload mmc 0:1 ${kernel} uImage; fatload mmc 0:1 ${dtb} dtb; bootm ${kernel} - ${dtb} -``` - -### U-Boot - -There are at least three versions available, the one in the Android tree (which -should have Fastboot) and the one from Linaro (which understands the USB and -network drivers). - -There's also which -is supposed to enable the virtualisation features. I'm not sure at -present whether the difference is merely configuration or if there are -source differences. U-Boot. - -Inside the Android environment do: - -```bash -make ARCH=arm CROSS_COMPILE=arm-eabi-arndale -sudo dd iflag=dsync oflag=dsync if=u-boot.bin of=/dev/sdb seek=63 -``` - -## seL4 Image file preparation - -In most cases it is okay to simply load the elf file into memory and run -`bootelf`. However, Fastboot may require that the ELF file be packed into a U-Boot -application image file. Follow the below instructions to create this image. - -```bash -sudo apt-get install uboot-mkimage -INPUT_FILE=images/sel4test-image-arm-exynos4 -OUTPUT_FILE=sel4-uImage -mkimage -a 0x48000000 -e 0x48000000 -C none -A arm -T kernel -O qnx -d $INPUT_FILE $OUTPUT_FILE -``` - -The reason we choose QNX is because we exploit the fact that, like seL4, QNX -expects to be ELF-loaded. The alternative is to convert our ELF file into a -binary file using objcopy. - -## Booting - -### Building an image - -{% include sel4test.md %} - -### tftpboot - -At the U-Boot prompt, type print to see the list of environment variables and -their values. Use the following commands to set any variables that are missing -from the list. - -```none -setenv bootfile filename -setenv ethaddr 00:40:5c:26:0a:FF -setenv usbethaddr 00:40:5c:26:0a:FF -setenv pxefile_addr_r 0x50000000 -``` - -Now run: - -```none -usb start; dhcp; bootelf; bootm; -``` - -## References - -- diff --git a/Hardware/bananapi-f3.html b/Hardware/bananapi-f3.html new file mode 100644 index 00000000000..ddd525313a9 --- /dev/null +++ b/Hardware/bananapi-f3.html @@ -0,0 +1,700 @@ + + + + + + + Banana Pi BPI-F3 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/bananapi-f3.md b/Hardware/bananapi-f3.md deleted file mode 100644 index dbc2717e23f..00000000000 --- a/Hardware/bananapi-f3.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -riscv_hardware: true -cmake_plat: bananapi-f3 -xcompiler_arg: -DRISCV64=1 -platform: Banana Pi BPI-F3 -arch: RV64GCVB -virtualization: false -iommu: false -simulation_target: false -verification: [] -Contrib: "Community" -Maintained: "10xEngineers" -soc: SpacemiT K1 -cpu: X60 -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 10xEngineers ---- - -# Banana Pi BPI-F3 - -The Banana Pi BPI-F3 is an industrial-grade RISC-V single-board computer -from Banana Pi, based on SpacemiT K1 SoC. It has an octa-core RISC-V (8 × X60) -CPU, with integrated 2.0 TOPs AI computing power. - -{% include hw-info.html %} - -Details and links to manuals can be found on the [Banana Pi product -page](https://docs.banana-pi.org/en/BPI-F3/BananaPi_BPI-F3). - -The SoC technical reference manual can be found [on -SpacemiT website](https://developer.spacemit.com/documentation?token=GAmMwCrRUiZAo5kXKUQcNNacnwb&type=pdf). - -The Banana Pi BPI-F3 arrives with the following boot process: - -1. Firmware starts -2. OpenSBI starts -3. U-Boot proper starts - -From U-Boot proper you can then load and start an seL4 image, see below for details. - -## Building the GCC toolchain - -{% include risc-v.md %} - -## Building seL4test - -{% include sel4test.md %} - -## Booting - -There are multiple ways to boot from U-Boot, documented below is booting via TFTP and from -a microSD card. - -### Obtaining the DTB {#dtb} - -Since we are using a `uImage` for the Banana Pi BPI-F3, U-Boot requires a Device Tree Blob (DTB) alongside -the binary image to boot. - -The Device Tree Source (DTS) can be compiled from the seL4 tree with the Device Tree Compiler (`dtc`): -```sh -dtc -I dts -O dtb sel4/tools/dts/bananapi-f3.dts > bananapi-f3.dtb -``` - -### Booting via microSD card - -These instructions expect the microSD card to be paritioned with FAT. - -The microSD card slot registers as device `0` in U-Boot so to see if the device -is recognised run: - -```sh -mmc dev 0 -# Check that the card info is expected -mmc info -# List partitions -mmc part -``` - -To load and run the image: - -```sh -fatload mmc 0: 0x200000 sel4test-driver-image-riscv-bananapi-f3 -fatload mmc 0: 0x31000000 bananapi-f3.dtb -bootm 0x200000 - 0x31000000 -``` - -### Booting via TFTP - -If you have setup a TFTP server, enter the following commands on the U-Boot console -to load an image via the network. - -```sh -dhcp -tftpboot 0x200000 :sel4test-driver-image-riscv-bananapi-f3 -tftpboot 0x31000000 :bananapi-f3.dtb -bootm 0x200000 - 0x31000000 -``` diff --git a/Hardware/cheshire.html b/Hardware/cheshire.html new file mode 100644 index 00000000000..27a17c12637 --- /dev/null +++ b/Hardware/cheshire.html @@ -0,0 +1,762 @@ + + + + + + + Cheshire | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/cheshire.md b/Hardware/cheshire.md deleted file mode 100644 index 6aeb52e5ac3..00000000000 --- a/Hardware/cheshire.md +++ /dev/null @@ -1,146 +0,0 @@ ---- -riscv_hardware: true -cmake_plat: cheshire -xcompiler_arg: -DRISCV64=1 -platform: Cheshire -arch: RV64IMAFDC -virtualization: false -iommu: false -simulation_target: false -verification: [] -Contrib: "UNSW" -Maintained: "UNSW" -cpu: Cheshire -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2024 seL4 Project a Series of LF Projects, LLC. ---- - -# Cheshire - -Cheshire is a 6-stage RISC-V CPU. For details, refer to -[https://github.com/pulp-platform/cheshire](https://github.com/pulp-platform/cheshire) - -{% include hw-info.html %} - -seL4 currently only provides Cheshire support for the [Genesys 2 -board](https://reference.digilentinc.com/reference/programmable-logic/genesys-2/reference-manual). - -## Synthesising Cheshire - -Synthesising hardware for the Genesys 2 requires a Vivado Enterprise license. -Unfortunately there are no prebuilt bitstreams available. Vivado 2023.2 is -recommended. Follow the [Cheshire Manual](https://pulp-platform.github.io/cheshire/tg/xilinx/) -to install dependencies, then: - -1. Compile the device tree blob: - - ```sh - make sw/boot/cheshire.genesys2.dtb - ``` - -2. Synthesise the bitstream for the Genesys 2 board: - - ```sh - export VIVADO=/path/to/xilinx/bin/vivado - make chs-xilinx-genesys2 - ``` - - This will produce a `.bit` file in `target/xilinx/out/cheshire.genesys2.bit`. - - -## Building the GCC toolchain - -{% include risc-v.md %} - -## Building OpenOCD - -OpenOCD needs to be the RISC-V downstream fork. `6f84e90d` is a known working commit. -Follow the instructions in the README to find the required dependencies. - -```sh -git clone https://github.com/riscv-collab/riscv-openocd.git -cd riscv-openocd -./bootstrap -./configure --disable-werror --enable-jtag_vpi \ - --enable-remote-bitbang --enable-ftdi \ - --prefix=/opt/riscv-openocd/ --exec-prefix=/opt/riscv-openocd -make -j$(nproc) -sudo make install -``` - -## Building OpenSBI - -Cheshire needs a custom build of OpenSBI. It is recommended to compile the `FW_JUMP` -style image. The device tree blob `cheshire.genesys2.dtb` was build above. You -might need to use `rv64imafdc` or `rv64g` depending on your RISC-V toolchain as the ISA. - -```sh -git clone https://github.com/pulp-platform/opensbi.git --branch cheshire -cd opensbi -make PLATFORM=fpga/cheshire CROSS_COMPILE= -j$(nproc) \ - PLATFORM_RISCV_XLEN=64 PLATFORM_RISCV_ISA=rv64imafdc_zicsr_zifencei PLATFORM_RISCV_ABI=lp64 \ - FW_JUMP=y FW_JUMP_ADDR=0x90000000 FW_FDT_PATH=/path/to/cheshire.genesys2.dtb -``` - -You can then find `build/platform/fpga/cheshire/firmware/fw_jump.elf`. - -## Building seL4test - -{% include sel4test.md %} - -## Running seL4test - -{% include note.html %} -Whilst it is possible to setup U-Boot off an SD Card as with other platforms, -Cheshire does not have an ethernet peripheral and so images need to be loaded over GDB. -{% include endnote.html %} - -1. Program the FPGA using the Vivado Hardware Manager. Open the hardware manager - GUI and choose `/path/to/cheshire/target/xilinx/out/cheshire.genesys2.bit` as - the bitstream file in the "Program Device" dialog. - -2. In a new terminal, connect an OpenOCD session to the board over the JTAG - micro-USB port. - - ```sh - openocd -f /path/to/cheshire/util/openocd.genesys2.tcl - ``` - -3. In another terminal, connect to OpenOCD using GDB from the RISC-V toolchain. - - ```sh - riscv64-unknown-elf-gdb --eval-command "target extended-remote localhost:3333" - ``` - -4. Use GDB to reset the board, then load seL4test and OpenSBI. - - ```gdb - # Reset CPU and halt - (gdb) monitor reset halt - - # Load seL4 image (ELF), entry is 0x90000000 - (gdb) restore sel4test-driver-image-riscv-cheshire - - # openSBI compiled with FW_JUMP=y FW_JUMP_ADDR=0x90000000 and embedded DTB - (gdb) set $a0=0 - (gdb) set $a1=0 - (gdb) load fw_jump.elf - - # Run OpenSBI which jumps to seL4 - (gdb) c - ``` - -## Notes - -If you encounter issues such as OpenOCD failing to connect, you should attempt -to reset the JTAG connection with `lsusb`. The JTAG device should have a name -similar to `Future Technology Devices International, Ltd FT2232C/D/H Dual UART/FIFO IC`. -Note the `Bus XXX Device YYY` next to the device and reset it with - -```sh -sudo usbreset XXX/YYY -``` - -Loading the probes (`.ltx`) file in Vivado Hardware Manager it is also possible -to remotely reset the board using [Virtual IOs](https://pulp-platform.github.io/cheshire/tg/xilinx/#virtual-ios). diff --git a/Hardware/hifive-p550.html b/Hardware/hifive-p550.html new file mode 100644 index 00000000000..58475d71010 --- /dev/null +++ b/Hardware/hifive-p550.html @@ -0,0 +1,700 @@ + + + + + + + HiFive Premier P550 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/hifive-p550.md b/Hardware/hifive-p550.md deleted file mode 100644 index d34286803e7..00000000000 --- a/Hardware/hifive-p550.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -riscv_hardware: true -cmake_plat: hifive-p550 -xcompiler_arg: -DRISCV64=1 -platform: HiFive Premier P550 -arch: RV64GC -virtualization: false -iommu: false -simulation_target: false -verification: [] -Contrib: "Community" -Maintained: "seL4 Foundation" -soc: ESWIN EIC7700X -cpu: P550 -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# HiFive Premier P550 - -The HiFive Premier P550 is a RISC-V development platform from SiFive based -on the ESWIN EIC7700X SoC. It is a quad-core SoC using the SiFive P550 -CPU. - -{% include hw-info.html %} - -Details and links to manuals can be found on the [SiFive product -page](https://www.sifive.com/boards/hifive-premier-p550). - -The SoC technical reference manual can be found [on -GitHub](https://github.com/eswincomputing/EIC7700X-SoC-Technical-Reference-Manual/releases). - -The HiFive P550 arrives with the following boot process from the SPI flash: - -1. Firmware starts -2. OpenSBI starts -3. U-Boot proper starts - -From U-Boot proper you can then load and start an seL4 image, see below for details. - -## Building the GCC toolchain - -{% include risc-v.md %} - -## Building seL4test - -{% include sel4test.md %} - -## Booting - -There are multiple ways to boot from U-Boot, documented below is booting via TFTP and from -a microSD card. - -### Obtaining the DTB {#dtb} - -Since we are using a `uImage` for the HiFive P550, U-Boot requires a Device Tree Blob (DTB) alongside -the binary image to boot. - -The Device Tree Source (DTS) can be compiled from the seL4 tree with the Device Tree Compiler (`dtc`): -```sh -dtc -I dts -O dtb seL4/tools/dts/hifive-p550.dts > hifive_p550.dtb -``` - -### Booting via microSD card - -These instructions expect the microSD card to be paritioned with FAT. - -The microSD card slot registers as device `1` in U-Boot so to see if the device -is recognised run: - -```sh -mmc dev 1 -# Check that the card info is expected -mmc info -# List partitions -mmc part -``` - -To load and run the image: - -```sh -fatload mmc 1: 0x90000000 sel4test-driver-image-riscv-hifive-p550 -fatload mmc 1: 0xa0000000 hifive_p550.dtb -bootm 0x90000000 - 0xa0000000 -``` - -### Booting via TFTP - -If you have setup a TFTP server, enter the following commands on the U-Boot console -to load an image via the network. - -```sh -dhcp -tftpboot 0x90000000 :sel4test-driver-image-riscv-hifive-p550 -tftpboot 0x90000000 :hifive_p550.dtb -bootm 0x90000000 - 0xa0000000 -``` diff --git a/Hardware/hifive.html b/Hardware/hifive.html new file mode 100644 index 00000000000..e1e7330ee56 --- /dev/null +++ b/Hardware/hifive.html @@ -0,0 +1,654 @@ + + + + + + + HiFive Unleashed | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/hifive.md b/Hardware/hifive.md deleted file mode 100644 index 3bb13c5f9d9..00000000000 --- a/Hardware/hifive.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -riscv_hardware: true -cmake_plat: hifive -xcompiler_arg: -DRISCV64=1 -platform: HiFive Unleashed -arch: RV64IMAC, RV64GC -virtualization: false -iommu: false -simulation_target: false -verification: [RISCV64] -Contrib: "Data61" -Maintained: "seL4 Foundation" -soc: Freedom U540 -cpu: U54-MC, E51 -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# HiFive Unleashed - -HiFive Unleashed is a RISC-V development board by SiFive. Check -[here](https://www.sifive.com/boards/hifive-unleashed) for details. - -{% include hw-info.html %} - -## Building the GCC toolchain - -{% include risc-v.md %} - -## Building seL4test - -{% include sel4test.md %} - -## Booting via SD card - -1. Set all DIP switches to 1(towards CPU). - -2. Prepare the SD card - ```sh - sudo sgdisk --clear --new=1:2048:67583 --typecode=1:3000 /dev/sdX - sudo dd if=images/sel4test-driver-image-riscv-hifive of=/dev/sdX1 - ``` -3. Insert the SD card and connect the micro USB port(J7). - Note that the UART device node is /dev/ttyUSB1 diff --git a/Hardware/imx8mm.html b/Hardware/imx8mm.html new file mode 100644 index 00000000000..1c5dbc05d01 --- /dev/null +++ b/Hardware/imx8mm.html @@ -0,0 +1,622 @@ + + + + + + + i.MX8M Mini | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/imx8mm.md b/Hardware/imx8mm.md deleted file mode 100644 index 748b6271e14..00000000000 --- a/Hardware/imx8mm.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -arm_hardware: true -cmake_plat: imx8mm-evk -xcompiler_arg: -DAARCH64=1 -platform: i.MX8M Mini -arch: ARMv8A -virtualization: false -iommu: false -soc: IMX8MM-EVK -cpu: Cortex-A53 Quad 1.8 GHz -verification: [ARM, AARCH64] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# i.MX8M Mini - -See also the NXP [i.MX8M Mini web page](https://www.nxp.com/products/i.MX8MMINI). - -{% include hw-info.html %} - -## Building seL4test - -{% include sel4test.md %} - diff --git a/Hardware/imx8mp.html b/Hardware/imx8mp.html new file mode 100644 index 00000000000..15eef8c0ce8 --- /dev/null +++ b/Hardware/imx8mp.html @@ -0,0 +1,627 @@ + + + + + + + i.MX8M Plus | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/imx8mp.md b/Hardware/imx8mp.md deleted file mode 100644 index a56ffb0cd7a..00000000000 --- a/Hardware/imx8mp.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -arm_hardware: true -cmake_plat: imx8mp-evk -xcompiler_arg: -DAARCH64=1 -platform: i.MX8M Plus -arch: ARMv8A, AArch64 -virtualization: true -iommu: false -soc: IMX8MP-EVK -cpu: Cortex-A53 Quad 1.8 GHz -verification: [AARCH64] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# i.MX8M Plus - -See also the NXP [i.MX8M Plus product -page](https://www.nxp.com/design/design-center/development-boards-and-designs/8MPLUSLPD4-EVK). - -{% include hw-info.html %} - -The seL4 i.MX8 port currently only supports running the board in AArch64 mode. - -## Building seL4test - -{% include sel4test.md %} diff --git a/Hardware/imx8mq.html b/Hardware/imx8mq.html new file mode 100644 index 00000000000..57b21096d5d --- /dev/null +++ b/Hardware/imx8mq.html @@ -0,0 +1,628 @@ + + + + + + + i.MX8M Quad | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/imx8mq.md b/Hardware/imx8mq.md deleted file mode 100644 index 83f671d5e3f..00000000000 --- a/Hardware/imx8mq.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -arm_hardware: true -cmake_plat: imx8mq-evk -xcompiler_arg: -DAARCH64=1 -platform: i.MX8M Quad -arch: ARMv8A, AArch64 -virtualization: true -iommu: false -soc: MCIMX8M-EVKB -cpu: Cortex-A53 Quad 1.5 GHz -verification: [AARCH64] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# i.MX8M Quad - -See also the the NXP [i.MX8M Quad fact -sheet](https://www.nxp.com/docs/en/fact-sheet/IMX8MQUADEVKFS.pdf). - -{% include hw-info.html %} - -The seL4 i.MX8M Quad port currently only supports running the board in AArch64 -mode. - -## Building seL4test - -{% include sel4test.md %} - diff --git a/Hardware/imx93.html b/Hardware/imx93.html new file mode 100644 index 00000000000..add7b0ecb5b --- /dev/null +++ b/Hardware/imx93.html @@ -0,0 +1,628 @@ + + + + + + + i.MX93 Evaluation Kit | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/imx93.md b/Hardware/imx93.md deleted file mode 100644 index c045006ee5c..00000000000 --- a/Hardware/imx93.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -arm_hardware: true -cmake_plat: imx93 -xcompiler_arg: -DAARCH64=1 -platform: i.MX93 EVK -arch: ARMv8A, AArch64 -virtualization: true -iommu: false -soc: i.MX93 -cpu: Cortex-A55 -verification: [AARCH64] -Contrib: Indan Zupančič, Proofcraft -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. ---- - -# i.MX93 Evaluation Kit - -See also the NXP [i.MX93 EVK product -page](https://www.nxp.com/design/design-center/development-boards-and-designs/i.MX93EVK). - -{% include hw-info.html %} - -The seL4 i.MX93 port currently only supports running the board in AArch64 -mode. - -## Building seL4test - -{% include sel4test.md %} diff --git a/Hardware/index.html b/Hardware/index.html new file mode 100644 index 00000000000..7996a97632a --- /dev/null +++ b/Hardware/index.html @@ -0,0 +1,1342 @@ + + + + + + + Supported platforms | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/index.md b/Hardware/index.md deleted file mode 100644 index 8c31928184e..00000000000 --- a/Hardware/index.md +++ /dev/null @@ -1,213 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. -wide: true ---- - -# Supported platforms - -seL4 is available on 3 major hardware architectures, [Arm](#arm), -[RISC-V](#risc-v) and [x86](#x86), for a number of platforms with varying -hardware features. - -The tables below list the platforms for which seL4 is available. For each -platform, the tables list whether specific features are supported (e.g. -*Virtualisation*, *IOMMU/SMMU*, etc) and to which degree (where applicable), as -well as the *verification status* for that platform. - -seL4 is formally verified for specific configurations for a subset of these -platforms. The depth of the proofs and which properties are verified depend on -the platform and are noted in the *Verification Status* column as follows: - -* Unverified: this platform is not verified at all and is not scheduled for verification. -* Ongoing: this feature is currently undergoing verification. -* FC: the functional correctness proofs are complete. -* Verified: all proofs for this platform are complete, including functional - correctness, integrity and information flow. - -More information can be found on the [Verified Configurations](../projects/sel4/verified-configurations.md) page. - -## Arm - -seL4 has support for select ARMv7 and ARMv8 Platforms. In addition to the page -with [general instructions how to run seL4 on Arm](GeneralARM.html), each board -page may have additional instructions for running seL4 on it. - -
- - - - - - - - - - - - - -{%- assign sorted = site.pages | sort: 'platform' %} -{%- for page in sorted %} -{%- if page.arm_hardware and page.Maintained -%} -{%- assign status = "" %} -{%- for config in page.verification -%} -{%- assign link = "/projects/sel4/verified-configurations.html#" | append: config | relative_url -%} -{%- assign status = status | append: '' | append: config | append: '' %} -{%- unless forloop.last %} -{%- assign status = status | append: ", " %} -{%- endunless %} -{%- endfor %} - - - - - - - - - -{%- endif %} -{%- endfor %} - -
PlatformSystem-on-chipCoreVirtualisationSMMUProofsProof config
{{ page.platform }}{{ page.soc}}{{ page.cpu }} -{%- if page.virtualization %} - {% svg _icons/check.svg class="inline-icon stroke-3 text-f_green-500 dark:text-logogreen" %} -{%- else %} - – -{%- endif %} - -{%- if page.iommu %} -{%- if page.iommu == "limited" %} -{%- assign color="text-yellow-500" %} -{%- else %} -{%- assign color="text-f_green-500 dark:text-logogreen" %} -{%- endif %} - {% svg _icons/check.svg class="inline-icon stroke-3 {{color}}" %} -{%- else %} - – -{%- endif %} - -{%- if status != "" %} - {% svg _icons/check.svg class="inline-icon stroke-3 text-f_green-500 dark:text-logogreen" %} -{%- elsif page.simulation_only %} -{%- assign status = "N/A" %} -{%- else %} -{%- assign status = "–" %} - – -{%- endif %} - {{status}}
-
- -## RISC-V - -We currently provide support for some of the RISC-V platforms. Support for the hypervisor extension is yet to be mainlined. - -
- - - - - - - - - - - - - -{%- for page in sorted %} -{%- if page.riscv_hardware and page.Maintained -%} -{%- assign status = "" %} -{%- for config in page.verification -%} -{%- assign link = "/projects/sel4/verified-configurations.html#" | append: config | relative_url -%} -{%- assign status = status | append: '' | append: config | append: '' %} -{%- unless forloop.last %} -{%- assign status = status | append: ", " %} -{%- endunless %} -{%- endfor %} - - - - - - - - - -{%- endif %} -{%- endfor %} - -
PlatformSystem-on-chipCoreArchProofsProof config
{{ page.platform }}{{ page.soc}}{{ page.cpu }}{{ page.arch }} -{%- if status != "" %} - {% svg _icons/check.svg class="inline-icon stroke-3 text-f_green-500 dark:text-logogreen" %} -{%- elsif page.simulation_only %} -{%- assign status = "N/A" %} -{%- else %} -{%- assign status = "–" %} - – -{%- endif %} - {{status}}
-
- -## x86 - -seL4 supports PC99-style Intel Architecture Platforms. - -| Platform | Arch | Virtualisation | IOMMU | Proofs | Proof config | -| - | - | - | - | - | - | -| [PC99 (32-bit)](IA32.html) | x86 | VT-X | VT-D | - | - | -| [PC99 (64-bit)](X64.html) | x64 | VT-X | VT-D | yes | [X64] | - -[X64]: {{ '/projects/sel4/verified-configurations.html#X64' | relative_url }} - - -### Simulating seL4 - -Running seL4 in a simulator is a quick way to test it out and iteratively -develop software. Note that feature support is then limited by the simulator. -See the QEMU [Arm](qemu-arm-virt.html) and [RISCV](qemu-riscv-virt.html) targets -and the [simulation instructions for sel4test](../projects/sel4test/) -for x86 for how to run seL4 using QEMU. Some hardware platforms support the -`SIMULATION=1` option --- this will be marked on the respective platform page -and will generally be good enough to run most of the seL4 test suite, but QEMU -usually does not provide enough hardware device implementation to build more -complex systems in the simulated environment. - -### Not in the lists above? - -If the platform, architecture, feature that you are after is not listed on this page, -you have several options, listed below. It is important to note however that, as -explained in the guidelines linked below, contributing new ports or features will require -compelling arguments, discussion with the technical community (including through -Request-For-Comments), as well as testing requirements and maintenance/expertise -commitment, to a degree depending on the nature of the contribution. - - -- You can contact one of the seL4 Foundation [Endorsed Services - Providers](https://sel4.systems/Foundation/Services/) to get commercial - support or professional advice to develop such a port or feature (with the - implications and expectations detailed in our [guidelines for contributing - kernel code](../projects/sel4/kernel-contribution.html)); - -- You can check the [roadmap](https://sel4.systems/roadmap.html) for any planned - contributions, from the seL4 Foundation or larger community, such on any new - architecture ports, new large formal verifications, or large or fundamental - new features; - -- You can contact the seL4 community through one of our [communication - channels](https://sel4.systems/contact/) to ask whether someone is developing - such a port or feature already, or whether there is general interest in discussing - such a new port or feature; - -- If you are in a position to develop the seL4 port or feature yourself, you - should follow our [guidelines for contributing kernel - code](../projects/sel4/kernel-contribution.html), which details the - implications and expectations. diff --git a/Hardware/jetsontk1.html b/Hardware/jetsontk1.html new file mode 100644 index 00000000000..1b9c05be836 --- /dev/null +++ b/Hardware/jetsontk1.html @@ -0,0 +1,751 @@ + + + + + + + Jetson TK1 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/jetsontk1.md b/Hardware/jetsontk1.md deleted file mode 100644 index 58c07d15ba4..00000000000 --- a/Hardware/jetsontk1.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -arm_hardware: true -cmake_plat: tk1 -xcompiler_arg: -DAARCH32=1 -platform: Jetson TK1 -arch: ARMv7A -virtualization: true -iommu: true -soc: NVIDIA Tegra K1 -cpu: Cortex-A15 -verification: [ARM, ARM_HYP] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Jetson TK1 - -The [Jetson TK1](http://www.nvidia.com/object/jetson-tk1-embedded-dev-kit.html) -is a affordable embedded system developed by NVIDIA. - -{% include hw-info.html %} - -## Pre-Requisites - -* One Tegra Board. See [Jetson TK1](http://www.nvidia.com/object/jetson-tk1-embedded-dev-kit.html) -* A working development environment. See the [set up - instructions](../projects/buildsystem/host-dependencies.html). - -## Getting Started - - To get started, check out the [NVIDIA developer -page](https://developer.nvidia.com/embedded-computing), make sure your board is -correctly configured and plugged. - -## Build your first seL4 system - -{% include sel4test.md %} - -## Load the binary - -You need to be able to see output from the serial console on the Tegra. Connect -the serial port to your computer with a serial cable, either a USB->RS232 -converter, or if your computer has a serial port, connect to it. - -Once you have the wires in place, you can connect to the console via -`screen` (or you can use minicom or another serial console program). In -the following, we assume that the Tegra is connected to `/dev/ttyUSB0`. - -```sh -screen /dev/ttyUSB0 115200 -``` - -When you start the board, you will see the U-Boot prompt. To load the -binary you need to interact with U-Boot. I personally use a DHCP/TFTP -server to get the binary onto the board. Copy `sel4.img` onto the tftp -server; if you've set up DHCP properly it will pass the server IP to the -board. Otherwise you can specify the IOP address on the command. The -following command will then scan the PCI bus and enable the ethernet, -and then ask to get an address via the DHCP and get `sel4.img` file from -the TFTP server at `192.168.1.1`. - -```sh -pci enum dhcp ${loadaddr} 192.168.1.1:sel4.img -``` - -Then, let's start the program. - -```sh -bootefi ${loadaddr} -``` - -## Flash U-Boot - - -Warning: This flashing procedure is for the Jetson TK1 by NVIDIA. There -is another TK1 board called the TK1-SOM by Colorado Engineering which -requires a different flashing procedure. Please be sure you're following -these instructions if you are truly trying to flash a **Jetson** and -not the **TK1-SOM**. If you are trying to flash a TK1-SOM, please -[use the procedure described here instead](CEI_TK1_SOM/#u-boot). - -The initial version of U-Boot does not provides all necessary -functionality. In particular, it boots the system in secure mode. To run -a virtual machine monitor, the Tegra needs to be booted in nonsecure or -HYP mode. After installing a new u-boot (instructions below) you can -boot in either secure on non-secure mode based on a u-boot environment -variable. - -Do - -```sh -setenv bootm_boot_mode nonsec -saveenv -``` - -to boot in nonsecure (HYP) -mode. This also enables kvm if you boot Linux. - -To go back to secure mode booting do - -```sh -setenv bootm_boot_mode sec -saveenv -``` - -## Getting the sources - -```bash -mkdir tegra-u-boot-flasher -cd tegra-u-boot-flasher -repo init -u https://github.com/NVIDIA/tegra-uboot-flasher-manifests.git -repo sync -``` - -## Building - -To build the sources, build the necessary tools first. - -Install autoconf, pkg-config, flex, bison, libcrypto++-dev and libusb-1.0.0-dev -for your distribution. On Debian or Ubuntu you can do: - -```sh -sudo apt-get update -sudo apt-get install build-essential autoconf pkg-config flex bison libcrypto++-dev libusb-1.0.0-dev gcc-arm-linux-gnueabi -``` - -Then do: - -```bash -cd scripts -./build-tools build -``` - -Then, in the script directory, build everything. - -```bash -./build --socs tegra124 --boards jetson-tk1 build -``` - -## Flashing - -To flash, attach the Jetson board's OTG USB port to a USB port on your machine. -Hold down the FORCE RECOVERY button while pressing the RESET button next to it; -release FORCE RECOVERY a second or two after releasing the reset button - -Then issue: - -```bash -./tegra-uboot-flasher flash jetson-tk1 -``` - -The board should now be updated. - -## Running Linux with the new U-Boot - -To boot Linux in non-secure mode, build the kernel with the Power-State -Coordination Interface (PSCI) enabled (`CONFIG_ARM_PSCI=y`, in Kernel Features -menu)and CPU-Idle PM support disabled (`CONFIG_CPU_IDLE is not set` in CPU Power -Management->CPU Idle). Without these changes the kernel will hang. diff --git a/Hardware/jetsontx1.html b/Hardware/jetsontx1.html new file mode 100644 index 00000000000..06304f63082 --- /dev/null +++ b/Hardware/jetsontx1.html @@ -0,0 +1,746 @@ + + + + + + + Jetson TX1 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/jetsontx1.md b/Hardware/jetsontx1.md deleted file mode 100644 index d8dfd091a50..00000000000 --- a/Hardware/jetsontx1.md +++ /dev/null @@ -1,157 +0,0 @@ ---- -arm_hardware: true -cmake_plat: tx1 -xcompiler_arg: -DAARCH64=1 -platform: TX1 -arch: ARMv8A, AArch64 only -virtualization: true -iommu: true -soc: NVIDIA Tegra X1 -cpu: Cortex-A57 Quad -verification: [AARCH64] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Jetson TX1 - -{% include hw-info.html %} - -The Jetson TX1 is a multimedia and DSP board with a highly -optimized 64-bit memory controller which supports low latency accesses -from the CPU, high bandwidth accesses from the GPU and bounded latency -accesses from real-time devices such as the display. - -It has two multi-core CPU clusters, each with 4 identical cores (One -Cortex-A57 cluster and one Cortex-A53 cluster). Each cluster has its own -L2 cache. Both clusters are ARMv8 compliant platforms. In addition the -Tx1 has an ARM7 shadow Co-processor. - -The seL4 kernel has a limited port to the TX1 which supports the SoC -only in 64-bit mode. SMP, SMMU, Hyp-mode, etc are not supported by the -current port of the seL4 kernel to the TX1. - -The stock TX1 comes with support for booting using DFU, using an SD-card -or by copying the OS you would like to boot onto the internal 15 GiB USB -mass storage that comes with the TX1. - -Unfortunately the stock U-boot that comes with the TX1 does not support -TFTP-boot over the Ethernet port. You can get U-boot to support the -TX1's Ethernet driver and enable TFTP-boot, but this is beyond the scope -of this article since it entails compiling a custom U-boot and then -flashing it onto the board. - -## Building seL4test - -{% include sel4test.md %} - -The TX1 also supports AArch32 mode. If you choose to build the AArch32 kernel, -please be sure to pass `-DAARCH32=1` instead of `-DAARCH64=1`. - -## Booting via TFTP - Unfortunately the stock U-boot that comes with -the TX1 does not support TFTP because -[it does not come with an ethernet driver](https://devtalk.nvidia.com/default/topic/962946/tx1-pxe-boot/), but if you so choose, it -seems that it is possible to recomplile u-boot with support for the -ethernet driver, and then flash your custom U-boot onto your TX1. -Instructions on how to do this are not included here. - -## Booting via DFU - -To boot via DFU, attach the usb-mini end of a USB cable to the USB-mini -port on the TX1. Then plug in the power supply for the TX1 and power it -on. When the TX1 is powered on, pay attention to the text being printed -out so that you can stop the boot process at the U-boot command prompt. -When you have successfully got to the U-boot command prompt, enter the -following: -``` -setenv dfu_alt_info "kernel ram 0x82000000 0x1000000" -setenv bootcmd_dfu "dfu 0 ram 0; go 0x82000000" -saveenv -``` - -To make U-boot enter its DFU server mode now, just type: -run bootcmd_dfu. U-boot should sit still waiting for a kernel image to -be uploaded. Now you should open up a new terminal on your PC, and type -the following: -``` -dfu-util --device 0955:701a -a kernel -D /sel4test-driver-image-arm-tx1 -``` - -You may need to give dfu-util root privileges. If dfu-util is unable to -find the TX1 device, try unplugging and replugging in the USB mini-cable -that connects your PC to the TX1. - -## Booting via SD Card - -Get an SD card and format it with either FAT32, EXT2 or EXT4. Then build -seL4test, or any of the other seL4 projects. The resulting image file -should be placed inside of /images within the build directory. Take that -image file, and copy it to the root folder of the SD card you intend to -use with your TX1. - -Insert this SD card into your TX1 and then power on the TX1, and drop -into the U-boot command prompt. When you're at the prompt, please type -the following: - -For FAT32: -``` -fatload mmc 1 0x82000000 sel4test-driver-image-arm-tx1 -go 0x82000000 -``` - -For EXT2: -``` -ext2load mmc 1 0x82000000 sel4test-driver-image-arm-tx1 -go 0x82000000 -``` - -For EXT4: -``` -ext4load mmc 1 0x82000000 sel4test-driver-image-arm-tx1 -go 0x82000000 -``` - -## Internal 15 GiB USB mass storage - -Booting off the internal USB mass storage is almost the same as booting -off the SD card, but in particular, you should do something along the -lines of: - -Attach a USB mini cable to the mini-USB port on the TX1, and the other -end of the cable to your PC. Then power on the TX1 and drop into the -U-boot command line, and do the following: - -``` -ums mmc 0 -``` - -Your PC should now show that a new USB mass storage device has been -connected. Copy the seL4 image into the root directory of this mass -storage device, then unmount it and remove it safely. Then go back to -the U-boot command line and press Ctrl+C to exit the mass-storage -server. Then, type the following, depending on the filesystem type that -you formatted the internal mass storage device to (or if you didn't -personally format it, then whatever filesystem already existed on the -internal mass storage): - -For FAT32: -``` -fatload mmc 0 0x82000000 sel4test-driver-image-arm-tx1 -go 0x82000000 -``` - -For EXT2: -``` -ext2load mmc 0 0x82000000 sel4test-driver-image-arm-tx1 -go 0x82000000 -``` - -For EXT4: -``` -ext4load mmc 0 0x82000000 sel4test-driver-image-arm-tx1 -go 0x82000000 -``` diff --git a/Hardware/odroidx.html b/Hardware/odroidx.html new file mode 100644 index 00000000000..f136497cae6 --- /dev/null +++ b/Hardware/odroidx.html @@ -0,0 +1,759 @@ + + + + + + + Odroid-X | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+
+

This page is archived and is no longer receiving updates.

+

It remains here because some of the content may still be useful.

+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/odroidx.md b/Hardware/odroidx.md deleted file mode 100644 index 087a4b36ec7..00000000000 --- a/Hardware/odroidx.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -archive: true -arm_hardware: true -cmake_plat: exynos4 -xcompiler_arg: -DAARCH32=1 -platform: OdroidX -arch: ARMv7A -virtualization: false -iommu: false -soc: Exynos4412 -cpu: Cortex-A9 -verification: [ARM] -Contrib: Data61 -Maintained: False -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Odroid-X - -{% include hw-info.html %} - -  - -{% include note.html %} -This board is discontinued by the manufacturer. The instructions here are -provided to keep existing setups working. See support for other more recent -Odroid boards on [Supported platforms](./). -{% include endnote.html %} - -## Client setup - -### Hardware requirements: - -1. 5V power supply -1. RS232 or USB to UART converter -1. USB OTG cable - -{% include note.html %} -The USB-UART converter that is shipped with the board requires a -Linux kernel version > 3.2 -{% include endnote.html %} - -### Serial port setup - -Open minicom on `/dev/ttyUSB*` and set the serial port settings to: `115200N1` - -- 115200bps -- parity-none -- 1 stop bit - -### udev - -You may also like to set up a udev rule for Fastboot: - -```none -SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="0002", MODE="660", GROUP="dialout" -``` - -### U-Boot - -U-Boot must reside at a magical offset in a special partition of the SD -card. To copy U-Boot and the other boot loaders to the SD card: - -```bash -cd sd_fusesudo -./sd_fusing_4412.sh /dev/sdx -``` - -## seL4 Image file preparation - -{% include sel4test.md %} - -The seL4 image file must be converted -into a U-Boot application file. The first step is to strip the elf file -into a binary file. Next we use mkimage to create the image. - -```bash -sudo apt-get install uboot-mkimage -INPUT_FILE=images/sel4test-image-arm-exynos4 -OUTPUT_FILE=sel4-uImage -mkimage -a 0x48000000 -e 0x48000000 -C none -A arm -T kernel -O qnx -d $INPUT_FILE $OUTPUT_FILE -``` - -The reason we choose QNX is because we exploit the fact that, like seL4, -QNX expects to be ELF-loaded. The alternative is to convert our ELF file -into a binary file using objcopy. - -## Booting - -Follow these steps to boot your program: - - 1. Connect the USB cable between the ODROID and the client - 2. Connect the UART converter between the ODROID and the client - 3. Insert your SD card into the ODROID - 4. Connect the 5V power supply - 5. Open minicom - 6. Hold the power button for 3 seconds - 7. In minicom, press a key to stop the auto boot process or hold the - user button on the board during the boot process - -To boot using fastboot: - - 1. At the u-boot prompt, type fastboot - - 2. On the client machine, run sudo fastboot devices to ensure that the device - has been recognised. The device should have the label `SMDKEXYNOS-01`. - Note that fastboot fails silently if you do not have permissions to access - the device. In that case, try running with `sudo`. - - 3. On the client machine, run fastboot boot sel4-uImage - -To boot from mmc: - - 1. At the U-Boot prompt type - `fatload mmc 0:2 0x42000000 bootm 0x42000000` - -## References - - diff --git a/Hardware/platforms.json b/Hardware/platforms.json index 949804bf5a6..cf5e90f10a1 100644 --- a/Hardware/platforms.json +++ b/Hardware/platforms.json @@ -1,30 +1,49 @@ ---- -layout: null -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 International ---- - [ [ "Arm", [ -{%- assign sorted = site.pages | sort: 'platform' %} -{%- for page in sorted %} -{%- if page.arm_hardware and page.Maintained %} - "{{ page.platform }}"{% unless forloop.last %},{% endunless %} -{%- endif %} -{%- endfor %} + "Avnet MaaXBoard", + "BeagleBoard", + "BeagleBone Black / Blue", + "Jetson TK1", + "Odroid-C2", + "Odroid-C4", + "OdroidXU", + "OdroidXU4", + "QEMU Arm Virt", + "ROCKPro64", + "Raspberry Pi 3-b", + "Raspberry Pi 4B", + "Rock3b", + "Sabre Lite", + "TK1-SOM", + "TQMa8XQP 1GB", + "TX1", + "TX2", + "Ultra96v2 Evaluation Kit", + "Zynq ZCU106 Evaluation Kit", + "Zynq ZCU102 Evaluation Kit", + "Zynq-7000 ZC706 Evaluation Kit", + "i.MX8M Mini", + "i.MX8M Plus", + "i.MX8M Quad", + "i.MX93 EVK" ] ], [ "RISC-V", [ -{%- assign sorted = site.pages | sort: 'platform' %} -{%- for page in sorted %} -{%- if page.riscv_hardware and page.Maintained %} - "{{ page.platform }}"{% unless forloop.last %},{% endunless %} -{%- endif %} -{%- endfor %} + "Ariane", + "Banana Pi BPI-F3", + "Cheshire", + "HiFive Premier P550", + "HiFive Unleashed", + "Microchip PolarFire Icicle Kit", + "Pine64 Star64", + "QEMU RISC-V", + "Rocketchip", + "Rocketchip", + "Spike", ] ], [ diff --git a/Hardware/polarfire.html b/Hardware/polarfire.html new file mode 100644 index 00000000000..020cf472ce2 --- /dev/null +++ b/Hardware/polarfire.html @@ -0,0 +1,708 @@ + + + + + + + Microchip PolarFire Icicle Kit | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/polarfire.md b/Hardware/polarfire.md deleted file mode 100644 index 96fa62dfcad..00000000000 --- a/Hardware/polarfire.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -riscv_hardware: true -cmake_plat: polarfire -xcompiler_arg: -DSel4testAllowSettingsOverride=True -DElfloaderImage=binary -DKernelVerificationBuild=OFF -platform: Microchip PolarFire Icicle Kit -arch: RV64IMAC, RV64GC -virtualization: false -iommu: false -simulation_target: false -verification: [] -Contrib: 'DornerWorks' -Maintained: 'DornerWorks' -soc: PolarFire SoC FPGA -cpu: U54-MC, E51 -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Microchip PolarFire Icicle Kit - -Polarfire Icicle Kit is a RISC-V development board by Microchip. Check -[here](https://www.microchip.com/en-us/development-tool/MPFS-ICICLE-KIT-ES) for details. - -{% include hw-info.html %} - -Microchip maintains online material, including designs and documentation -[here](https://www.microchip.com/en-us/products/fpgas-and-plds/system-on-chip-fpgas/polarfire-soc-fpgas#documentation). - -Additional documentation and resources can be found on the polarfire-soc github -[here](https://github.com/polarfire-soc/). - -## Building -### seL4test - -{% include sel4test.md %} - -Converting to a u-boot uImage: -```bash -mkimage -A riscv -O linux -T kernel -C none -a 0x80000000 -e 0x80000000 -n sel4test -d \ -images/sel4test-driver-image-riscv-polarfire images/seL4-uImage -cp kernel/kernel.dtb images/ -``` - -### Hart Software Services - -Install the SoftConsole software development environment from Microchip -[here](https://www.microchip.com/en-us/products/fpgas-and-plds/fpga-and-soc-design-tools/soc-fpga/softconsole). -The following instructions are based on SoftConsole v2022.2 - -1. Clone the Hart Software Services -```bash -git clone https://github.com/polarfire-soc/hart-software-services -``` - -2. Open SoftConsole and import a project from the newly cloned `hart-software-services` repo. - -3. Build the project with the project defaults. - -### hss-payload-generator -```bash -git clone https://github.com/polarfire-soc/hart-software-services -cd hart-software-services/tools/hss-payload-generator -make -``` - -This generates a `hss-payload-generator` ELF. - -### U-Boot -```bash -git clone https://github.com/polarfire-soc/u-boot -cd u-boot -CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv make microchip_mpfs_icicle_defconfig -CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv make -``` - -This generates a `u-boot-dtb.bin` binary. - -In order boot u-boot from the HSS, the `u-boot-dtb.bin` needs to be packaged as an HSS payload using -the hss-payload-generator tool but first a payload configuration yaml file needs to be created: - -```yaml -# -# HSS Payload Generator - U-Boot Payload -# - -set-name: 'PolarFire-SoC-HSS::U-Boot' - -hart-entry-points: {u54_1: '0x1000200000', u54_2: '0x1000200000', u54_3: '0x1000200000', u54_4: '0x1000200000'} - -payloads: - u-boot.bin: {exec-addr: '0x1000200000', owner-hart: u54_1, secondary-hart: u54_2, secondary-hart: u54_3, secondary-hart: u54_4, priv-mode: prv_s } - -``` - -The payload can then be generated using this yaml file. -```bash -./hss-payload-generator -c u-boot.yaml uboot-payload.bin -``` - -This generates a `uboot-payload.bin` binary. - -## Booting via SD card - -Prepare the SD card -```sh -sudo sgdisk -Zo --new=1:2048:2099199 --typecode=1:0700 \ - --new=2:2099200:4196351 --typecode=2:EF02 /dev/sdX -sudo dd if=images/uboot-payload.bin of=/dev/sdX2 -sudo mkfs.vfat -F16 /dev/sdX1 -sudo mount /dev/sdX1 /mnt -sudo cp images/seL4-uImage /mnt -sudo cp images/kernel.dtb /mnt -``` - -Insert the SD card into the Icicle Kit then power on the board, and drop into the u-boot -prompt. When you're at the prompt, type the following: -```bash -fatload mmc 0 0x1000200000 seL4-uImage -fatload mmc 0 0x1020200000 kernel.dtb -bootm 0x1000200000 - 0x1020200000 -``` diff --git a/Hardware/qemu-arm-virt.html b/Hardware/qemu-arm-virt.html new file mode 100644 index 00000000000..44a0306cbaf --- /dev/null +++ b/Hardware/qemu-arm-virt.html @@ -0,0 +1,636 @@ + + + + + + + QEMU Arm virtual platform | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/qemu-arm-virt.md b/Hardware/qemu-arm-virt.md deleted file mode 100644 index f34d23cf345..00000000000 --- a/Hardware/qemu-arm-virt.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -arm_hardware: true -simulation_target: true -simulation_only: true -xcompiler_arg: '-DSIMULATION=1' -cmake_plat: qemu-arm-virt -platform: QEMU Arm Virt -arch: ARMv7A, ARMv8A -virtualization: true -iommu: false -soc: virt -cpu: Multiple -verification: [] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. ---- - -# QEMU Arm virtual platform - -This is a simulation-only target for running the Arm version of seL4 on the -[QEMU] simulator with the [virt] platform. - -{% include hw-info.html %} - -## Supported Configurations - -The default CPU for simulation on `qemu-arm-virt` is Cortex A53. If -`KernelSel4Arch` is set to `aarch32` or `arm_hyp`, the default is Cortex A15. - -Supported values for the optional build parameter `ARM_CPU` are: `cortex-a7`, -`cortex-a15`, `cortex-a53`, `cortex-a57`, and `cortex-a72`. - -## Running seL4 test - -See the [machine setup] instructions for how to install build dependencies. - -{% include sel4test.md %} - -[QEMU]: https://www.qemu.org -[virt]: https://www.qemu.org/docs/master/system/arm/virt.html -[machine setup]: {{ '/projects/buildsystem/host-dependencies.html' | relative_url }} diff --git a/Hardware/qemu-riscv-virt.html b/Hardware/qemu-riscv-virt.html new file mode 100644 index 00000000000..3c09fc4161c --- /dev/null +++ b/Hardware/qemu-riscv-virt.html @@ -0,0 +1,630 @@ + + + + + + + QEMU RISC-V virtual platform | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/qemu-riscv-virt.md b/Hardware/qemu-riscv-virt.md deleted file mode 100644 index a5f92b8225d..00000000000 --- a/Hardware/qemu-riscv-virt.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -riscv_hardware: true -simulation_target: true -simulation_only: true -xcompiler_arg: '-DSIMULATION=1' -cmake_plat: qemu-riscv-virt -platform: QEMU RISC-V -arch: RV32GC, RV64IMAC -virtualization: false -iommu: false -soc: virt -cpu: rv32, rv64 -verification: [] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. ---- - -# QEMU RISC-V virtual platform - -This is a simulation-only target for running the RISC-V version of seL4 on the -[QEMU] simulator with the [virt] platform. - -{% include hw-info.html %} - -## Supported Configurations - -The values `riscv64` and `riscv32` are supported for `KernelSel4Arch`. - -## Running seL4 test - -See the [machine setup] instructions for how to install build dependencies. - -{% include sel4test.md %} - -[QEMU]: https://www.qemu.org -[virt]: https://www.qemu.org/docs/master/system/riscv/virt.html -[machine setup]: {{ '/projects/buildsystem/host-dependencies.html' | relative_url }} diff --git a/Hardware/rock3b.html b/Hardware/rock3b.html new file mode 100644 index 00000000000..a320eb16891 --- /dev/null +++ b/Hardware/rock3b.html @@ -0,0 +1,718 @@ + + + + + + + Rock3b | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/rock3b.md b/Hardware/rock3b.md deleted file mode 100644 index d32211adbe0..00000000000 --- a/Hardware/rock3b.md +++ /dev/null @@ -1,129 +0,0 @@ ---- -arm_hardware: true -cmake_plat: rk3568 -xcompiler_arg: -DAARCH64=1 -platform: Rock3b -arch: ARMv8A, AArch64 -virtualization: true -iommu: false -soc: RK3568 quad-core -cpu: Cortex-A55 Quad 2.0 GHz -verification: [AARCH64] -Contrib: "UNSW" -Maintained: "UNSW" -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. ---- - -# Rock3b - -{% include hw-info.html %} - -## Obtaining TPL - -Since some parts of the board are proprietary and need custom binaries, Rockchip provides the binaries that you need to download and include in both the TF-A and U-Boot builds. To obtain them simply execute: -```bash -git clone --depth 1 https://github.com/rockchip-linux/rkbin -``` - -## Compiling TF-A - -ARM Trusted Firmware-A is necessary for the board to boot up properly. It is responsible for setting up all secure peripherals and pieces of the system that the regular user won't have access to. -To build it execute: -```bash -git clone --depth 1 https://github.com/TrustedFirmware-A/trusted-firmware-a.git -cd trusted-firmware-a -make realclean -make CROSS_COMPILE=aarch64-linux-gnu- PLAT=rk3358 -cd .. -``` - -## Compiling U-Boot - -In order to build U-Boot for the Rock3b, we need to first download or build the run the following commands: -```bash -git clone https://github.com/u-boot/u-boot.git u-boot -cd u-boot -make CROSS_COMPILE=aarch64-linux-gnu- rock-3b-rk3568_defconfig -make CROSS_COMPILE=aarch64-linux-gnu- BL31=../trusted-firmware-a/build/rk3568/release/bl31/bl31.elf ROCKCHIP_TPL=../rkbin/bin/rk35/rk3568_ddr_1560MHz_v1.13.bin -``` - -In the `u-boot` directory you should now see the U-Boot image `u-boot.bin` indicating that U-Boot has successfully compiled. - -More information regarding U-Boot support for the Rock3b can be found [here](https://docs.u-boot.org/en/latest/board/rockchip/rockchip.html). - -## Flashing the U-Boot on the SD-card - -To write an image that boots from a SD card (check your device path!): - -```bash -sudo dd if=u-boot.bin of=/dev/ seek=64 -sync -``` - -## Flashing the U-Boot on the SPI Flash - -If you want to boot from SPI Flash, you have to put the U-Boot image there first. - -### Preparation of the SD-card - -Prepare the SD-card by plugging it into your PC and running: - -```bash -DEV=/dev/ - -sudo wipefs -a "$DEV" - -# Partition table + partitions (start at 16MiB to avoid overlapping bootloader areas) -sudo parted -s "$DEV" mklabel gpt -sudo parted -s "$DEV" mkpart BOOT fat32 16MiB 256MiB -sudo parted -s "$DEV" mkpart ROOT ext4 256MiB 100% - -# Format -sudo mkfs.vfat -F 32 -n BOOT ${DEV}p1 -sudo mkfs.ext4 -F -L ROOT ${DEV}p2 - -# Flash the non-SPI image onto SD-card -sudo dd if=u-boot-rockchip.bin of=/dev/sda seek=64 - -# Copy the SPI image onto the ext4 partition -sudo mkdir -p sd/ -sudo mount ${DEV}p2 sd/ -sudo cp u-boot-rockchip-spi.bin sd/ -sync -sudo umount sd/ -``` - -Then insert the SD-card into the Rock3b and run following there: -```bash -mmc list -# ensure you can see you SD-card here -sf probe -# ensure you can see the flash registering itself here -ls mmc 1:2 -# ensure you can see the u-boot-rockchip-spi.bin here - -load mmc 1:2 $kernel_addr_r u-boot-rockchip-spi.bin - -sf update $fileaddr 0 $filesize -``` - -Poweroff the board, eject the SD-card and observe the board booting from flash. - -## Building seL4test - -{% include sel4test.md %} - -## Running seL4test - -You have two options of running the seL4test, either run it from the SD-card's partition or using TFTP. Here the option of running it via TFTP is described. - -This assumes the Ethernet cable connected to the board and having a DHCP and TFTP servers running. When the board boots, enter its console and simply type `dhcp` to establish the connection and then copy over your image from the TFTP server by running: - -```bash -tftp 0x02000000 sel4test-driver-image-arm-rk3568 -go 0x02000000 -``` - -This will launch seL4tests. diff --git a/Hardware/rocketchip-zcu102.html b/Hardware/rocketchip-zcu102.html new file mode 100644 index 00000000000..0a599484fcb --- /dev/null +++ b/Hardware/rocketchip-zcu102.html @@ -0,0 +1,771 @@ + + + + + + + Rocketchip FPGA mapped to Zynq ZCU102 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/rocketchip-zcu102.md b/Hardware/rocketchip-zcu102.md deleted file mode 100644 index 4d90174eec6..00000000000 --- a/Hardware/rocketchip-zcu102.md +++ /dev/null @@ -1,181 +0,0 @@ ---- -riscv_hardware: true -cmake_plat: rocketchip-zcu102 -xcompiler_arg: -DRISCV64=1 -platform: Rocketchip -arch: RV64IMAFDC -virtualization: false -iommu: false -simulation_target: false -verification: [] -Contrib: 'DornerWorks' -Maintained: 'DornerWorks' -cpu: Rocket -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Rocketchip FPGA mapped to Zynq ZCU102 - -This rocketchip implementation will run on the ZCU102 FPGA fabric. - -{% include hw-info.html %} - -## Building the GCC toolchain - -{% include risc-v.md %} - -## Building seL4test - -{% include sel4test.md %} - -### Updating OpenSBI - -In order to run on the ZCU102, the OpenSBI platform must be changed from `generic`. -[DornerWorks](https://github.com/dornerworks/opensbi/tree/bao/rocket) has forked a version of -OpenSBI from the bao-project that supports the ZCU104 platform, which is nearly identical to the -ZCU102. Perform the following commands in the seL4 codebase to set the OpenSBI target to -`rocket-fpga-zcu104`. - -```sh -cd tools/opensbi -git remote add dornerworks https://github.com/dornerworks/opensbi/ -git fetch dornerworks -git checkout dornerworks/bao/rocket -``` - -## Building the Rocketchip Bitstream - -### Setting up the Repo - -The following repository contains patches that will add virtualization support via the h-extensions -to the rocketchip. Clone the repo with the following command - -```sh -git clone https://github.com/dornerworks/Vivado-Prebuilts -git clone https://github.com/dornerworks/bao-demos -b rocket rocketchip-h-extend -cd rocketchip-h-extend -``` - -Export the following variables for the scripts to work correctly. Please note that order is also -important since some of these variables use previous variables in their declaration. - -```sh -export PLATFORM=rocket-fpga-zcu104 -export DW_VIVADO_PREBUILTS=/PATH/TO/vivado-prebuilts -export BAO_DEMOS=/PATH/TO/rocketchip-h-extend -export BAO_DEMOS_WRKDIR=$BAO_DEMOS/wrkdir -export BAO_DEMOS_WRKDIR_SRC=$BAO_DEMOS_WRKDIR/srcs -export BAO_DEMOS_WRKDIR_PLAT=$BAO_DEMOS_WRKDIR/imgs/$PLATFORM -export BAO_DEMOS_CHIPYARD=$BAO_DEMOS_WRKDIR_SRC/chipyard -export BAO_DEMOS_ROCKETCHIP=$BAO_DEMOS_CHIPYARD/generators/rocket-chip -export BAO_DEMOS_VIVADO_SCRIPTS=$BAO_DEMOS/platforms/$PLATFORM/scripts -export BAO_DEMOS_ROCKET_CONFIG=RocketHypConfig$(echo $PLATFORM | awk '{split($0,A,"-"); print A[length(A)]}') -export BAO_DEMOS_OPENSBI=$BAO_DEMOS_WRKDIR_SRC/opensbi -export ARCH=riscv -export CROSS_COMPILE=riscv64-unknown-elf- -export VIVADO_CORES=$(nproc) - -mkdir -p $BAO_DEMOS_WRKDIR -mkdir -p $BAO_DEMOS_WRKDIR_SRC -``` - -### Generate the SoC Design - -With these variables in place use the following commands to generate the rocketchip design with the -h-extensions enabled: - -```sh -git clone https://github.com/ucb-bar/chipyard.git $BAO_DEMOS_CHIPYARD -cd $BAO_DEMOS_CHIPYARD -git checkout 64632c8 -./scripts/init-submodules-no-riscv-tools.sh -git apply $BAO_DEMOS/platforms/$PLATFORM/patches/0001-add-rocket-hyp-fpga-support.patch -git -C generators/boom apply $BAO_DEMOS/platforms/$PLATFORM/patches/0001-boom-add-usehyp-option.patch -git -C generators/ariane apply $BAO_DEMOS/platforms/$PLATFORM/patches/0001-ariane-add-usehyp-option.patch -cd $BAO_DEMOS_ROCKETCHIP -git remote add hyp https://github.com/dornerworks/rocket-chip.git -git fetch hyp -git checkout hyp -``` - -Next use the following command to build the bootROM: - -```sh -make -C $BAO_DEMOS_CHIPYARD/bootromFPGA -``` - -Finally, use the following command to generate the verilog before building the design: - -```sh -make -C $BAO_DEMOS_CHIPYARD/sims/vcs verilog SUB_PROJECT=rocket \ - CONFIG=$BAO_DEMOS_ROCKET_CONFIG -``` - -### Modifying the scripts - -Before building the design, a few lines in the tcl scripts must be modified in order to ensure we -are building for the ZCU102. Change directory to `$BAO_DEMOS_VIVADO_SCRIPTS` and modify the switch -statement in `env.tcl` with the following information. - -``` - zcu102 { - set part xczu9eg-ffvb1156-2-e - set board_part xilinx.com:zcu102:part0:3.1 - } -``` - -The board declaration must be changed to ZCU102 with the following line: - -``` -set board zcu102 -``` - -### Building the SoC Design - -Vivado can be used with the generated verilog to build the SoC Design. Ensure that Vivado 2020.2 is -on your path and run the following commands: - -```sh -vivado -nolog -nojournal -mode batch -source $BAO_DEMOS_VIVADO_SCRIPTS/create_ip.tcl -vivado -nolog -nojournal -mode batch -source $BAO_DEMOS_VIVADO_SCRIPTS/create_design.tcl -vivado -nolog -nojournal -mode batch -source $BAO_DEMOS_VIVADO_SCRIPTS/build.tcl -``` - -## Prebuilt Rocketchip Bitstreams - -DornerWorks has pre-built a version of the rocketchip with and without the h-extensions -available. The bitsteams, along with the corresponding `psu_init.tcl` scripts, can be found at the -following [repo](https://github.com/dornerworks/Vivado-Prebuilts). This repo also contains a script -to flash the rocketchip onto the ZCU102. - -## Booting the Rocketchip - -Use the Xilinx `xsct` tool to flash the ZCU102. Connect the JTAG and UART ports to your computer. If -using VMWare, ensure that USB3.0 is enabled. Set the ZCU102 to boot via JTAG and power on the board. - - -Open a `screen` session for the ZCU102 with the following command: - -```sh -screen /dev/ttyUSB1 115200 -``` - -Next, ensure the generated seL4 image is in the binary format. This will be the case when the -`ElfloaderImage` CMake variable is set to `binary`. - -Finally, flash the ZCU102 with the following command: - -```sh -xsct $BAO_DEMOS_VIVADO_SCRIPTS/deploy.tcl /PATH/TO/BINARY/SEL4/IMAGE -``` - -Alternatively, if using the prebuilt bitstream provided by DornerWorks, the `Vivado-Prebuilts` -repository contains a `flash_rocket` shell script which can be invoked to flash the ZCU102 with the -prebuilt bitstream. - -```sh -cd $DW_VIVADO_PREBUILTS -source flash_rocket.sh /PATH/TO/BINARY/SEL4/IMAGE -``` diff --git a/Hardware/rocketchip.html b/Hardware/rocketchip.html new file mode 100644 index 00000000000..7395de2daf1 --- /dev/null +++ b/Hardware/rocketchip.html @@ -0,0 +1,638 @@ + + + + + + + Rocketchip FPGA mapped to Zynq ZC706 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/rocketchip.md b/Hardware/rocketchip.md deleted file mode 100644 index 3f9dd82b31f..00000000000 --- a/Hardware/rocketchip.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -riscv_hardware: true -cmake_plat: rocketchip -xcompiler_arg: -DRISCV64=1 -platform: Rocketchip -arch: RV64IMAFDC -virtualization: false -iommu: false -simulation_target: false -verification: [] -Contrib: Data61 -Maintained: seL4 Foundation -cpu: Rocket -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Rocketchip FPGA mapped to Zynq ZC706 - -The current rocketchip implementation only tested on ZC706 FPGA, it should work -for other Zynq FPGAs. Refer to -[https://github.com/ucb-bar/fpga-zynq](https://github.com/ucb-bar/fpga-zynq) for -details. - -{% include hw-info.html %} - -## Building the GCC toolchain - -{% include risc-v.md %} - -## Building seL4test - -{% include sel4test.md %} diff --git a/Hardware/rockpro64.html b/Hardware/rockpro64.html new file mode 100644 index 00000000000..d2c521d35b7 --- /dev/null +++ b/Hardware/rockpro64.html @@ -0,0 +1,716 @@ + + + + + + + ROCKPro64 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/rockpro64.md b/Hardware/rockpro64.md deleted file mode 100644 index d56287bc365..00000000000 --- a/Hardware/rockpro64.md +++ /dev/null @@ -1,118 +0,0 @@ ---- -arm_hardware: true -cmake_plat: rockpro64 -xcompiler_arg: -DAARCH64=1 -platform: ROCKPro64 -arch: ARMv8A, AArch64 -virtualization: true -iommu: false -soc: RK3399 hexa-core -cpu: Cortex-A53 Quad 1.8 GHz -verification: [AARCH64] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# ROCKPro64 - -{% include hw-info.html %} - -## Building seL4test - -{% include sel4test.md %} - -## Flashing the SPI with U-Boot - -**WARNING! DO NOT POWER OFF THE DEVICE FOR ANY REASON DURING SPI FLASH! YOU WILL GET A (soft-) BRICKED DEVICE** - -The first step is getting U-Boot onto the system. It is recommended, particularly for TFTP boot, to put U-Boot on the SPI flash. - -If you have a "dirty" (any previously used) SPI flash, first: -1. Download https://github.com/sigmaris/u-boot/releases/download/v2020.01-ci/erase_spi.img.gz -2. Write it to an SD card -3. Boot from the SD card (will be done automatically if you don't have a very weird setup). Once it completes (see this over serial or when white LED becomes stable), remove the SD card, but DO NOT reset. - -Then, to flash the actual image: -1. Get https://github.com/sigmaris/u-boot/releases/download/v2020.01-ci/flash_spi.img.gz and write it to an SD card. -2. Put the SD card into the ROCKPro64 and boot. Wait for completion (seen over serial or when white LED becomes stable). -3. Remove the SD card. -4. Reset and observe U-Boot come up. - -Compiling u-boot by oneself has not been done and has been left as an exercise to the reader if wanted. HINT: https://github.com/sigmaris/u-boot/blob/v2020.01-ci/.azure-pipelines.yml. This fork is used as it resolves a number of issues present in mainline U-Boot and has pre-built images. - -## Setting up with TFTP, DHCP, UEFI (recommended!) - -I assume you have: -- setup a TFTP server -- setup a DHCP server -- linked the TFTP and DHCP servers appropriately - -Luckily the U-Boot defconfig for ROCKPro64 includes UEFI support. We are not using EDK2 because no stable and tested implementations exist for ROCKPro64. - -Copy your seL4 image to the TFTP root under the name `sel4img` (or any other name of your choosing but you will have to adjust following commands). - -### Manual method (well tested) - -Drop into a U-Boot console when asked. Type in: - -``` -dhcp -tftpboot ${kernel_addr_r} sel4img -bootefi ${kernel_addr_r} -``` - -- Watch seL4 boot! - -### Automated method - -Create `pxelinux.cfg/default` in TFTP root: - -``` -menu title PXE! - -timeout 200 - -label sel4 -menu default -kernel /sel4img -``` - -Create `boot.scr`: - -``` -bootefi 0x2080000 -``` - -Significance of 0x2080000 being where seL4 image is loaded by U-Boot. - -Convert `boot.scr` to a uImage using `mkimage -A arm -T script -C none -n boot.scr -d boot.scr boot.scr.uimg`. Ensure `boot.scr.uimg` is in the TFTP root and `boot.scr` is removed. - - -## Setting up with UEFI, SD card - -This process is similar to above with TFTP. The SD card should have one or more partitions, the first one must be ext2 and have the file files on it. (If required, you can change the 1:1 in the below commands to 1:2, 1:3 etc for using 2nd, 3rd, partition, etc). - -Copy your `sel4img` aforementioned in UEFI section to SD card. - -### Manual - -Drop to a U-Boot console and type in: - -``` -ext2load mmc 1:1 ${kernel_addr_r} sel4img -bootefi ${kernel_addr_r} -``` - -### Automated - -Create `boot.scr`: - -``` -ext2load mmc 1:1 ${kernel_addr_r} sel4img -bootefi ${kernel_addr_r} -``` - -Convert to uImage using `mkimage -A arm -T script -C none -n boot.scr -d boot.scr boot.scr.uimg`. Put in SD card and boot. diff --git a/Hardware/sabreLite.html b/Hardware/sabreLite.html new file mode 100644 index 00000000000..b19450e284c --- /dev/null +++ b/Hardware/sabreLite.html @@ -0,0 +1,836 @@ + + + + + + + Sabre Lite | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/sabreLite.md b/Hardware/sabreLite.md deleted file mode 100644 index 9771cd1ae93..00000000000 --- a/Hardware/sabreLite.md +++ /dev/null @@ -1,199 +0,0 @@ ---- -arm_hardware: true -simulation_target: true -simulation_only: false -cmake_plat: sabre -xcompiler_arg: -DAARCH32=1 -platform: Sabre Lite -arch: ARMv7A -virtualization: false -iommu: false -soc: i.MX6 -cpu: Cortex-A9 -verification: [ARM] -Contrib: Data61 -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Sabre Lite - -For board details see -[Sabre Lite](https://boundarydevices.com/product/bd-sl-i-mx6/) - -{% include hw-info.html %} - -## Booting on the Sabre Lite - -### Hardware Requirements - -* 5V/3A power supply -* RS232 cable (or USB-RS232 adapter) -* USB OTG cable for Fastboot or Ethernet cable for TFTPboot - -### Board Setup - - The SabreLite can be configured to boot from either -USB or SPI flash. USB booting is typically only used when there is a -failure in the SPI flash resident bootloader. One may use USB boot to -temporarily boot u-boot and reflash the SPI memory. - -SPI flash contains a simple boot loader that will can boot from either -SPI flash, or from an image starting at block 2 of the SD or μSD card -depending on which boot loader has been flashed. - -### Booting U-Boot from USB - - USB booting offers a back door into the -system. This method is usually only used to reprogram the SPI flash boot -program. - -You will first need to acquire and compile the IMX USB loader tool from - -```bash -git clone git://github.com/boundarydevices/imx_usb_loader.git -``` - -NOTE 1: The Element14 Sabrelite platform has its DIP switch mounted -incorrectly. - -NOTE 2: The connection order is important. You may find that your -USB-TTY converter has locked up. - - 1. Move the DIP switch nearest the Ethernet port to the OFF position - 2. Move the DIP switch farthest from the Ethernet port to the - ON position. - 3. Plug the USB cable into the USB-OTG port located near the - HDMI port. - 4. Connect the RS232 port to your computer and open minicom. - 5. Power up the device. - -Now you are ready to load your image into memory and execute: - -```bash -$ lsusb -.... -Bus 001 Device 019: ID -15a2:0054 Freescale Semiconductor, Inc. -.... -$ sudo ./imx_usb image_file -``` - -The image file that is used will typically be named -u-boot.bin - -### Booting U-Boot from SPI Flash - -To boot from SPI flash: - - 1. Move the DIP switch nearest the Ethernet port to the OFF position - 2. Move the DIP switch farthest from the Ethernet port to the OFF - position - 3. Connect the RS232 port to your computer and open minicom. - 4. Insert an SD or μSD card depending on which boot loader is - resident in SPI flash - 5. Power up the device. - -Now you are ready to load your image into memory and execute: - -```bash -$ lsusb -.... -Bus 001 Device 019: ID 15a2:0054 Freescale Semiconductor, Inc. -.... -$ sudo ./imx_usb image_file -``` - -The image file that is used will typically be named -u-boot.bin - -### SD and μSD cards - -To boot U-Boot from an SD or μSD card, one must -install the appropriate boot loader into SPI flash. The method and boot -loader images are provided in the SPI flash programming section. U-Boot -must be located at block 2 of the SD or μSD card. This can be achieved -with the following command, assuming that the SD or μSD device is -`/dev/sdb`. - -```bash -dd if=u-boot.bin of=/dev/sdb seek=2 bs=512; sync -``` - -### U-Boot for the Sabre Lite - -#### Obtaining and Building - -There are many versions of U-Boot available for the Sabre -Lite. The ones for Android support Fastboot; the mainline ones do not. - -We use the one from - with these patches -applied: - -|Name |Purpose | -|-|-| -|[01_android-imx6-uboot-enable_bootelf.patch](https://sel4.systems/Info/Hardware/sabreLite/01_android-imx6-uboot-enable_bootelf.patch)|Enable bootelf command | -|[02_android-imx6-uboot-fastbootfix.patch](https://sel4.systems/Info/Hardware/sabreLite/02_android-imx6-uboot-fastbootfix.patch)|Fix fastboot to allow the booting of elf and u-boot images | -|[03_android-imx6-uboot-extra_fs_features.patch](https://sel4.systems/Info/Hardware/sabreLite/03_android-imx6-uboot-extra_fs_features.patch)|Add some extra file systems and associated features | -|[04_android-imx6-uboot-update_env.patch](https://sel4.systems/Info/Hardware/sabreLite/04_android-imx6-uboot-update_env.patch)|Setup default environment. In particular, bootsel4_mmc and bootsel4_net | - -Prebuilt: -[u-boot.bin](https://sel4.systems/Info/Hardware/sabreLite/u-boot.bin) - -The prebuilt version is for booting from SPI. - -To obtain and build U-Boot, do: - -```bash -git clone git://github.com/boundarydevices/u-boot-2009-08.git -cd u-boot-2009-08 -git checkout origin/boundary-imx_3.0.35_1.1.0 -b boundary-imx_3.0.35_1.1.0 -export ARCH=arm -export CROSS_COMPILE=arm-none-eabi- -make mx6q_sabrelite_android_config -make all -ls -l u-boot.bin -``` - -#### Installing U-Boot to SPI Flash - -To install U-Boot, put u-boot.bin onto the first partition (either FAT16 or -EXT2) of an SD card, boot into U-Boot then do this at the U-Boot prompt: - -```bash -# Initialise the SD card. Replace 1 with 0 for standard SD -mmc dev 1 - -# Load the file with name "u-boot.bin" from the 1st partition of the SD card to RAM at address 0x12000000 -ext2load mmc 1:1 12000000 u-boot.bin - -# Initialise the SPI flash subsystem -sf probe | sf probe 1 - -# Erase 0x100000 bytes from the SPI flash starting at address 0x00000000 -# This covers both U-Boot and its saved environment. -sf erase 0 0x100000 - -# Copy ${filesize} bytes from RAM at address 0x12000000 to SPI flash at address 0x00000000 -# Note that the filesize variable was set when the file was loaded into RAM -sf write 0x12000000 0 ${filesize} - -# Ensure that the boot select switches are set appropriately, then reboot the Sabrelite -``` - -## Booting seL4 applications - -This assumes that the U-Boot version above is installed in SPI flash. - -|Command|Operation| -|-|-| -|run bootsel4_mmc |Scans through the SD card and their partitions looking for an elf file named "sel4-image" in the root directory. This file will be loaded and executed. | -|run bootsel4_net |Performs a DHCP request followed by a TFTPBoot request and attempts to load a file named "sabre/sel4-image". | -|run bootsel4_fastboot|Simple alias for the fastboot command | - -## Running seL4 test - -{% include sel4test.md %} diff --git a/Hardware/spike.html b/Hardware/spike.html new file mode 100644 index 00000000000..9347e88f325 --- /dev/null +++ b/Hardware/spike.html @@ -0,0 +1,653 @@ + + + + + + + Spike | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/spike.md b/Hardware/spike.md deleted file mode 100644 index 907169ec712..00000000000 --- a/Hardware/spike.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -riscv_hardware: true -cmake_plat: spike -xcompiler_arg: -DRISCV64=1 -platform: Spike -arch: RV32GC, RV64IMAFDC -virtualization: false -iommu: false -simulation_target: true -verification: [] -Contrib: 'Data61, Hesham Almatary' -Maintained: "seL4 Foundation" -redirect_from: - - /Hardware/RISCV -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Spike - -{% include hw-info.html %} - -## Building the GCC toolchain - -{% include risc-v.md %} - -## Getting the Simulator - -You can use either [RISC-V ISA -Simulator](https://github.com/riscv/riscv-isa-sim) or QEMU >= v4.2 shipped with -your Linux distribution. - -If you prefer to build qemu from source, make sure you have the correct target -enabled. - -```sh -git clone https://git.qemu.org/git/qemu.git -cd qemu -mkdir build -cd build -../configure --prefix=/opt/riscv --target-list=riscv64-softmmu,riscv32-softmmu -make -``` - -## Building seL4test - -{% include sel4test.md %} - -You can also use run the tests on the 32-bit spike platform by replacing -the `-DRISCV64=TRUE` option with `-DRISCV32=TRUE`. diff --git a/Hardware/tqma8xqp1gb.html b/Hardware/tqma8xqp1gb.html new file mode 100644 index 00000000000..a7a74a39a8c --- /dev/null +++ b/Hardware/tqma8xqp1gb.html @@ -0,0 +1,629 @@ + + + + + + + TQMa8XQP 1GB | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/tqma8xqp1gb.md b/Hardware/tqma8xqp1gb.md deleted file mode 100644 index 10ef31bb23a..00000000000 --- a/Hardware/tqma8xqp1gb.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -arm_hardware: true -cmake_plat: tqma8xqp1gb -xcompiler_arg: -DAARCH64=1 -platform: TQMa8XQP 1GB -arch: ARMv8A, AArch64 -virtualization: false -iommu: false -soc: i.MX8X Quad Plus -cpu: Cortex-A35 -verification: [AARCH64] -Contrib: Breakaway Consulting -Maintained: seL4 Foundation -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. ---- - -# TQMa8XQP 1GB - -The -[TQMa8XQP](https://www.tq-group.com/en/products/tq-embedded/arm-architecture/tqma8xx/) -is a system-on-module designed by [TQ-Systems -GmbH](https://www.tq-group.com/en/). The modules incorporates an NXP i.MX8X Quad -Plus system-on-chip and 1GiB ECC memory. - -{% include hw-info.html %} - -The seL4 TQMa8XQP port currently only supports running the board in AArch64 -mode. Virtualization support is untested. - -## Building seL4test - -{% include sel4test.md %} diff --git a/Hardware/ultra96v2.html b/Hardware/ultra96v2.html new file mode 100644 index 00000000000..df5d287d469 --- /dev/null +++ b/Hardware/ultra96v2.html @@ -0,0 +1,644 @@ + + + + + + + Ultra96v2 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Hardware/ultra96v2.md b/Hardware/ultra96v2.md deleted file mode 100644 index a043bbe3b83..00000000000 --- a/Hardware/ultra96v2.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -cmake_plat: ultra96v2 -xcompiler_arg: -DAARCH64=1 -arm_hardware: true -platform: Ultra96v2 Evaluation Kit -arch: ARMv8A -virtualization: true -iommu: true -soc: Zynq UltraScale+ MPSoC -cpu: Cortex-A53 -verification: [AARCH64] -Contrib: 'DornerWorks' -Maintained: 'DornerWorks' -parent: /Hardware/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Ultra96v2 - -The Avnet Ultra96v2 is a low-cost Zynq MPSoC development platform developed by -AVNET. - -{% include hw-info.html %} - -AVNET maintains online material, including [designs and documentation](https://www.avnet.com/americas/product/avnet-engineering-services/aes-ultra96-v2-i-g/evolve-42136369/). - -## Building - -### seL4test - -{% include sel4test.md %} - -The Ultra96v2 also supports AArch32 mode. If you choose to build the AArch32 kernel, -please be sure to pass `-DAARCH32=1` instead of `-DAARCH64=1`. This requires modifications to u-boot -to execute in 32-bit mode. See the ZCU102 page for instructions. - -## Booting via SD Card - -The ultra96v2 comes with a pre-formatted SD card. Load the `sel4test-driver-image-arm-zynqmp` onto -the SD card, then insert the SD card into the Ultra96v2 and power on the board, dropping into the -U-boot prompt. When at the prompt, type the following to run sel4test: - -```bash -fatload mmc 0 0x10000000 sel4test-driver-image-arm-zynqmp -bootelf 0x10000000 -``` diff --git a/HardwareHacks.html b/HardwareHacks.html new file mode 100644 index 00000000000..b5ffd2d396a --- /dev/null +++ b/HardwareHacks.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/HostDependencies.html b/HostDependencies.html new file mode 100644 index 00000000000..d5f76db0935 --- /dev/null +++ b/HostDependencies.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/LICENSES/BSD-2-Clause.txt b/LICENSES/BSD-2-Clause.txt deleted file mode 100644 index baa80b56a29..00000000000 --- a/LICENSES/BSD-2-Clause.txt +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/LICENSES/CC-BY-NC-SA-4.0.txt b/LICENSES/CC-BY-NC-SA-4.0.txt deleted file mode 100644 index baee873b679..00000000000 --- a/LICENSES/CC-BY-NC-SA-4.0.txt +++ /dev/null @@ -1,170 +0,0 @@ -Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International - - Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. - -Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. - -Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. - -Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License - -By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. - -Section 1 – Definitions. - - a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. - - c. BY-NC-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, approved by Creative Commons as essentially the equivalent of this Public License. - - d. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. - - e. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. - - f. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. - - g. License Elements means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike. - - h. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. - - i. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. - - j. Licensor means the individual(s) or entity(ies) granting rights under this Public License. - - k. NonCommercial means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange. - - l. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. - - m. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. - - n. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. - -Section 2 – Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: - - A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and - - B. produce, reproduce, and Share Adapted Material for NonCommercial purposes only. - - 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. - - 3. Term. The term of this Public License is specified in Section 6(a). - - 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. - - 5. Downstream recipients. - - A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. - - B. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply. - - C. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. - - 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this Public License. - - 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes. - -Section 3 – License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified form), You must: - - A. retain the following if it is supplied by the Licensor with the Licensed Material: - - i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of warranties; - - v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; - - B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and - - C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. - - 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. - - b. ShareAlike.In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. - - 1. The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License. - - 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. - - 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. - -Section 4 – Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only; - - b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and - - c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. -For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. - -Section 5 – Disclaimer of Warranties and Limitation of Liability. - - a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. - - b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. - - c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. - -Section 6 – Term and Termination. - - a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. - -Section 7 – Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. - -Section 8 – Interpretation. - - a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. - - c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. - - d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. - -Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. - -Creative Commons may be contacted at creativecommons.org. diff --git a/LICENSES/CC-BY-SA-4.0.txt b/LICENSES/CC-BY-SA-4.0.txt deleted file mode 100644 index 4dfebb88f65..00000000000 --- a/LICENSES/CC-BY-SA-4.0.txt +++ /dev/null @@ -1,349 +0,0 @@ -Creative Commons Attribution-ShareAlike 4.0 International - -Creative Commons Corporation (“Creative Commons”) is not a law firm and does -not provide legal services or legal advice. Distribution of Creative Commons -public licenses does not create a lawyer-client or other relationship. Creative -Commons makes its licenses and related information available on an “as-is” -basis. Creative Commons gives no warranties regarding its licenses, any material -licensed under their terms and conditions, or any related information. Creative -Commons disclaims all liability for damages resulting from their use to the -fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and conditions -that creators and other rights holders may use to share original works of -authorship and other material subject to copyright and certain other rights -specified in the public license below. The following considerations are for -informational purposes only, are not exhaustive, and do not form part of our -licenses. - -Considerations for licensors: Our public licenses are intended for use by -those authorized to give the public permission to use material in ways otherwise -restricted by copyright and certain other rights. Our licenses are irrevocable. -Licensors should read and understand the terms and conditions of the license -they choose before applying it. Licensors should also secure all rights necessary -before applying our licenses so that the public can reuse the material as -expected. Licensors should clearly mark any material not subject to the license. -This includes other CC-licensed material, or material used under an exception -or limitation to copyright. More considerations for licensors. - -Considerations for the public: By using one of our public licenses, a licensor -grants the public permission to use the licensed material under specified -terms and conditions. If the licensor’s permission is not necessary for any -reason–for example, because of any applicable exception or limitation to copyright–then -that use is not regulated by the license. Our licenses grant only permissions -under copyright and certain other rights that a licensor has authority to -grant. Use of the licensed material may still be restricted for other reasons, -including because others have copyright or other rights in the material. A -licensor may make special requests, such as asking that all changes be marked -or described. - -Although not required by our licenses, you are encouraged to respect those -requests where reasonable. More considerations for the public. - -Creative Commons Attribution-ShareAlike 4.0 International Public License - -By exercising the Licensed Rights (defined below), You accept and agree to -be bound by the terms and conditions of this Creative Commons Attribution-ShareAlike -4.0 International Public License ("Public License"). To the extent this Public -License may be interpreted as a contract, You are granted the Licensed Rights -in consideration of Your acceptance of these terms and conditions, and the -Licensor grants You such rights in consideration of benefits the Licensor -receives from making the Licensed Material available under these terms and -conditions. - -Section 1 – Definitions. - -a. Adapted Material means material subject to Copyright and Similar Rights -that is derived from or based upon the Licensed Material and in which the -Licensed Material is translated, altered, arranged, transformed, or otherwise -modified in a manner requiring permission under the Copyright and Similar -Rights held by the Licensor. For purposes of this Public License, where the -Licensed Material is a musical work, performance, or sound recording, Adapted -Material is always produced where the Licensed Material is synched in timed -relation with a moving image. - -b. Adapter's License means the license You apply to Your Copyright and Similar -Rights in Your contributions to Adapted Material in accordance with the terms -and conditions of this Public License. - -c. BY-SA Compatible License means a license listed at creativecommons.org/compatiblelicenses, -approved by Creative Commons as essentially the equivalent of this Public -License. - -d. Copyright and Similar Rights means copyright and/or similar rights closely -related to copyright including, without limitation, performance, broadcast, -sound recording, and Sui Generis Database Rights, without regard to how the -rights are labeled or categorized. For purposes of this Public License, the -rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. - -e. Effective Technological Measures means those measures that, in the absence -of proper authority, may not be circumvented under laws fulfilling obligations -under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, -and/or similar international agreements. - -f. Exceptions and Limitations means fair use, fair dealing, and/or any other -exception or limitation to Copyright and Similar Rights that applies to Your -use of the Licensed Material. - -g. License Elements means the license attributes listed in the name of a Creative -Commons Public License. The License Elements of this Public License are Attribution -and ShareAlike. - -h. Licensed Material means the artistic or literary work, database, or other -material to which the Licensor applied this Public License. - -i. Licensed Rights means the rights granted to You subject to the terms and -conditions of this Public License, which are limited to all Copyright and -Similar Rights that apply to Your use of the Licensed Material and that the -Licensor has authority to license. - -j. Licensor means the individual(s) or entity(ies) granting rights under this -Public License. - -k. Share means to provide material to the public by any means or process that -requires permission under the Licensed Rights, such as reproduction, public -display, public performance, distribution, dissemination, communication, or -importation, and to make material available to the public including in ways -that members of the public may access the material from a place and at a time -individually chosen by them. - -l. Sui Generis Database Rights means rights other than copyright resulting -from Directive 96/9/EC of the European Parliament and of the Council of 11 -March 1996 on the legal protection of databases, as amended and/or succeeded, -as well as other essentially equivalent rights anywhere in the world. - -m. You means the individual or entity exercising the Licensed Rights under -this Public License. Your has a corresponding meaning. - -Section 2 – Scope. - - a. License grant. - -1. Subject to the terms and conditions of this Public License, the Licensor -hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, -irrevocable license to exercise the Licensed Rights in the Licensed Material -to: - -A. reproduce and Share the Licensed Material, in whole or in part; and - - B. produce, reproduce, and Share Adapted Material. - -2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions -and Limitations apply to Your use, this Public License does not apply, and -You do not need to comply with its terms and conditions. - -3. Term. The term of this Public License is specified in Section 6(a). - -4. Media and formats; technical modifications allowed. The Licensor authorizes -You to exercise the Licensed Rights in all media and formats whether now known -or hereafter created, and to make technical modifications necessary to do -so. The Licensor waives and/or agrees not to assert any right or authority -to forbid You from making technical modifications necessary to exercise the -Licensed Rights, including technical modifications necessary to circumvent -Effective Technological Measures. For purposes of this Public License, simply -making modifications authorized by this Section 2(a)(4) never produces Adapted -Material. - - 5. Downstream recipients. - -A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed -Material automatically receives an offer from the Licensor to exercise the -Licensed Rights under the terms and conditions of this Public License. - -B. Additional offer from the Licensor – Adapted Material. Every recipient -of Adapted Material from You automatically receives an offer from the Licensor -to exercise the Licensed Rights in the Adapted Material under the conditions -of the Adapter’s License You apply. - -C. No downstream restrictions. You may not offer or impose any additional -or different terms or conditions on, or apply any Effective Technological -Measures to, the Licensed Material if doing so restricts exercise of the Licensed -Rights by any recipient of the Licensed Material. - -6. No endorsement. Nothing in this Public License constitutes or may be construed -as permission to assert or imply that You are, or that Your use of the Licensed -Material is, connected with, or sponsored, endorsed, or granted official status -by, the Licensor or others designated to receive attribution as provided in -Section 3(a)(1)(A)(i). - - b. Other rights. - -1. Moral rights, such as the right of integrity, are not licensed under this -Public License, nor are publicity, privacy, and/or other similar personality -rights; however, to the extent possible, the Licensor waives and/or agrees -not to assert any such rights held by the Licensor to the limited extent necessary -to allow You to exercise the Licensed Rights, but not otherwise. - -2. Patent and trademark rights are not licensed under this Public License. - -3. To the extent possible, the Licensor waives any right to collect royalties -from You for the exercise of the Licensed Rights, whether directly or through -a collecting society under any voluntary or waivable statutory or compulsory -licensing scheme. In all other cases the Licensor expressly reserves any right -to collect such royalties. - -Section 3 – License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the following -conditions. - - a. Attribution. - -1. If You Share the Licensed Material (including in modified form), You must: - -A. retain the following if it is supplied by the Licensor with the Licensed -Material: - -i. identification of the creator(s) of the Licensed Material and any others -designated to receive attribution, in any reasonable manner requested by the -Licensor (including by pseudonym if designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of warranties; - -v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; - -B. indicate if You modified the Licensed Material and retain an indication -of any previous modifications; and - -C. indicate the Licensed Material is licensed under this Public License, and -include the text of, or the URI or hyperlink to, this Public License. - -2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner -based on the medium, means, and context in which You Share the Licensed Material. -For example, it may be reasonable to satisfy the conditions by providing a -URI or hyperlink to a resource that includes the required information. - -3. If requested by the Licensor, You must remove any of the information required -by Section 3(a)(1)(A) to the extent reasonably practicable. - -b. ShareAlike.In addition to the conditions in Section 3(a), if You Share -Adapted Material You produce, the following conditions also apply. - -1. The Adapter’s License You apply must be a Creative Commons license with -the same License Elements, this version or later, or a BY-SA Compatible License. - -2. You must include the text of, or the URI or hyperlink to, the Adapter's -License You apply. You may satisfy this condition in any reasonable manner -based on the medium, means, and context in which You Share Adapted Material. - -3. You may not offer or impose any additional or different terms or conditions -on, or apply any Effective Technological Measures to, Adapted Material that -restrict exercise of the rights granted under the Adapter's License You apply. - -Section 4 – Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that apply to -Your use of the Licensed Material: - -a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, -reuse, reproduce, and Share all or a substantial portion of the contents of -the database; - -b. if You include all or a substantial portion of the database contents in -a database in which You have Sui Generis Database Rights, then the database -in which You have Sui Generis Database Rights (but not its individual contents) -is Adapted Material, including for purposes of Section 3(b); and - -c. You must comply with the conditions in Section 3(a) if You Share all or -a substantial portion of the contents of the database. -For the avoidance of doubt, this Section 4 supplements and does not replace -Your obligations under this Public License where the Licensed Rights include -other Copyright and Similar Rights. - -Section 5 – Disclaimer of Warranties and Limitation of Liability. - -a. Unless otherwise separately undertaken by the Licensor, to the extent possible, -the Licensor offers the Licensed Material as-is and as-available, and makes -no representations or warranties of any kind concerning the Licensed Material, -whether express, implied, statutory, or other. This includes, without limitation, -warranties of title, merchantability, fitness for a particular purpose, non-infringement, -absence of latent or other defects, accuracy, or the presence or absence of -errors, whether or not known or discoverable. Where disclaimers of warranties -are not allowed in full or in part, this disclaimer may not apply to You. - -b. To the extent possible, in no event will the Licensor be liable to You -on any legal theory (including, without limitation, negligence) or otherwise -for any direct, special, indirect, incidental, consequential, punitive, exemplary, -or other losses, costs, expenses, or damages arising out of this Public License -or use of the Licensed Material, even if the Licensor has been advised of -the possibility of such losses, costs, expenses, or damages. Where a limitation -of liability is not allowed in full or in part, this limitation may not apply -to You. - -c. The disclaimer of warranties and limitation of liability provided above -shall be interpreted in a manner that, to the extent possible, most closely -approximates an absolute disclaimer and waiver of all liability. - -Section 6 – Term and Termination. - -a. This Public License applies for the term of the Copyright and Similar Rights -licensed here. However, if You fail to comply with this Public License, then -Your rights under this Public License terminate automatically. - -b. Where Your right to use the Licensed Material has terminated under Section -6(a), it reinstates: - -1. automatically as of the date the violation is cured, provided it is cured -within 30 days of Your discovery of the violation; or - - 2. upon express reinstatement by the Licensor. - -c. For the avoidance of doubt, this Section 6(b) does not affect any right -the Licensor may have to seek remedies for Your violations of this Public -License. - -d. For the avoidance of doubt, the Licensor may also offer the Licensed Material -under separate terms or conditions or stop distributing the Licensed Material -at any time; however, doing so will not terminate this Public License. - - e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. - -Section 7 – Other Terms and Conditions. - -a. The Licensor shall not be bound by any additional or different terms or -conditions communicated by You unless expressly agreed. - -b. Any arrangements, understandings, or agreements regarding the Licensed -Material not stated herein are separate from and independent of the terms -and conditions of this Public License. - -Section 8 – Interpretation. - -a. For the avoidance of doubt, this Public License does not, and shall not -be interpreted to, reduce, limit, restrict, or impose conditions on any use -of the Licensed Material that could lawfully be made without permission under -this Public License. - -b. To the extent possible, if any provision of this Public License is deemed -unenforceable, it shall be automatically reformed to the minimum extent necessary -to make it enforceable. If the provision cannot be reformed, it shall be severed -from this Public License without affecting the enforceability of the remaining -terms and conditions. - -c. No term or condition of this Public License will be waived and no failure -to comply consented to unless expressly agreed to by the Licensor. - -d. Nothing in this Public License constitutes or may be interpreted as a limitation -upon, or waiver of, any privileges and immunities that apply to the Licensor -or You, including from the legal processes of any jurisdiction or authority. - -Creative Commons is not a party to its public licenses. Notwithstanding, Creative -Commons may elect to apply one of its public licenses to material it publishes -and in those instances will be considered the “Licensor.” Except for the limited -purpose of indicating that material is shared under a Creative Commons public -license or as otherwise permitted by the Creative Commons policies published -at creativecommons.org/policies, Creative Commons does not authorize the use -of the trademark “Creative Commons” or any other trademark or logo of Creative -Commons without its prior written consent including, without limitation, in -connection with any unauthorized modifications to any of its public licenses -or any other arrangements, understandings, or agreements concerning use of -licensed material. For the avoidance of doubt, this paragraph does not form -part of the public licenses. - -Creative Commons may be contacted at creativecommons.org. diff --git a/LICENSES/GPL-2.0-only.txt b/LICENSES/GPL-2.0-only.txt deleted file mode 100644 index 3b6070fcd0c..00000000000 --- a/LICENSES/GPL-2.0-only.txt +++ /dev/null @@ -1,311 +0,0 @@ -GNU GENERAL PUBLIC LICENSE -Version 2, June 1991 - -Copyright (C) 1989, 1991 Free Software Foundation, Inc. -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - -Everyone is permitted to copy and distribute verbatim copies of this license -document, but changing it is not allowed. - -Preamble - -The licenses for most software are designed to take away your freedom to share -and change it. By contrast, the GNU General Public License is intended to -guarantee your freedom to share and change free software--to make sure the -software is free for all its users. This General Public License applies to -most of the Free Software Foundation's software and to any other program whose -authors commit to using it. (Some other Free Software Foundation software -is covered by the GNU Lesser General Public License instead.) You can apply -it to your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our -General Public Licenses are designed to make sure that you have the freedom -to distribute copies of free software (and charge for this service if you -wish), that you receive source code or can get it if you want it, that you -can change the software or use pieces of it in new free programs; and that -you know you can do these things. - -To protect your rights, we need to make restrictions that forbid anyone to -deny you these rights or to ask you to surrender the rights. These restrictions -translate to certain responsibilities for you if you distribute copies of -the software, or if you modify it. - -For example, if you distribute copies of such a program, whether gratis or -for a fee, you must give the recipients all the rights that you have. You -must make sure that they, too, receive or can get the source code. And you -must show them these terms so they know their rights. - -We protect your rights with two steps: (1) copyright the software, and (2) -offer you this license which gives you legal permission to copy, distribute -and/or modify the software. - -Also, for each author's protection and ours, we want to make certain that -everyone understands that there is no warranty for this free software. If -the software is modified by someone else and passed on, we want its recipients -to know that what they have is not the original, so that any problems introduced -by others will not reflect on the original authors' reputations. - -Finally, any free program is threatened constantly by software patents. We -wish to avoid the danger that redistributors of a free program will individually -obtain patent licenses, in effect making the program proprietary. To prevent -this, we have made it clear that any patent must be licensed for everyone's -free use or not licensed at all. - -The precise terms and conditions for copying, distribution and modification -follow. - -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - -0. This License applies to any program or other work which contains a notice -placed by the copyright holder saying it may be distributed under the terms -of this General Public License. The "Program", below, refers to any such program -or work, and a "work based on the Program" means either the Program or any -derivative work under copyright law: that is to say, a work containing the -Program or a portion of it, either verbatim or with modifications and/or translated -into another language. (Hereinafter, translation is included without limitation -in the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not covered -by this License; they are outside its scope. The act of running the Program -is not restricted, and the output from the Program is covered only if its -contents constitute a work based on the Program (independent of having been -made by running the Program). Whether that is true depends on what the Program -does. - -1. You may copy and distribute verbatim copies of the Program's source code -as you receive it, in any medium, provided that you conspicuously and appropriately -publish on each copy an appropriate copyright notice and disclaimer of warranty; -keep intact all the notices that refer to this License and to the absence -of any warranty; and give any other recipients of the Program a copy of this -License along with the Program. - -You may charge a fee for the physical act of transferring a copy, and you -may at your option offer warranty protection in exchange for a fee. - -2. You may modify your copy or copies of the Program or any portion of it, -thus forming a work based on the Program, and copy and distribute such modifications -or work under the terms of Section 1 above, provided that you also meet all -of these conditions: - -a) You must cause the modified files to carry prominent notices stating that -you changed the files and the date of any change. - -b) You must cause any work that you distribute or publish, that in whole or -in part contains or is derived from the Program or any part thereof, to be -licensed as a whole at no charge to all third parties under the terms of this -License. - -c) If the modified program normally reads commands interactively when run, -you must cause it, when started running for such interactive use in the most -ordinary way, to print or display an announcement including an appropriate -copyright notice and a notice that there is no warranty (or else, saying that -you provide a warranty) and that users may redistribute the program under -these conditions, and telling the user how to view a copy of this License. -(Exception: if the Program itself is interactive but does not normally print -such an announcement, your work based on the Program is not required to print -an announcement.) - -These requirements apply to the modified work as a whole. If identifiable -sections of that work are not derived from the Program, and can be reasonably -considered independent and separate works in themselves, then this License, -and its terms, do not apply to those sections when you distribute them as -separate works. But when you distribute the same sections as part of a whole -which is a work based on the Program, the distribution of the whole must be -on the terms of this License, whose permissions for other licensees extend -to the entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest your -rights to work written entirely by you; rather, the intent is to exercise -the right to control the distribution of derivative or collective works based -on the Program. - -In addition, mere aggregation of another work not based on the Program with -the Program (or with a work based on the Program) on a volume of a storage -or distribution medium does not bring the other work under the scope of this -License. - -3. You may copy and distribute the Program (or a work based on it, under Section -2) in object code or executable form under the terms of Sections 1 and 2 above -provided that you also do one of the following: - -a) Accompany it with the complete corresponding machine-readable source code, -which must be distributed under the terms of Sections 1 and 2 above on a medium -customarily used for software interchange; or, - -b) Accompany it with a written offer, valid for at least three years, to give -any third party, for a charge no more than your cost of physically performing -source distribution, a complete machine-readable copy of the corresponding -source code, to be distributed under the terms of Sections 1 and 2 above on -a medium customarily used for software interchange; or, - -c) Accompany it with the information you received as to the offer to distribute -corresponding source code. (This alternative is allowed only for noncommercial -distribution and only if you received the program in object code or executable -form with such an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for making -modifications to it. For an executable work, complete source code means all -the source code for all modules it contains, plus any associated interface -definition files, plus the scripts used to control compilation and installation -of the executable. However, as a special exception, the source code distributed -need not include anything that is normally distributed (in either source or -binary form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component itself -accompanies the executable. - -If distribution of executable or object code is made by offering access to -copy from a designated place, then offering equivalent access to copy the -source code from the same place counts as distribution of the source code, -even though third parties are not compelled to copy the source along with -the object code. - -4. You may not copy, modify, sublicense, or distribute the Program except -as expressly provided under this License. Any attempt otherwise to copy, modify, -sublicense or distribute the Program is void, and will automatically terminate -your rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses terminated -so long as such parties remain in full compliance. - -5. You are not required to accept this License, since you have not signed -it. However, nothing else grants you permission to modify or distribute the -Program or its derivative works. These actions are prohibited by law if you -do not accept this License. Therefore, by modifying or distributing the Program -(or any work based on the Program), you indicate your acceptance of this License -to do so, and all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - -6. Each time you redistribute the Program (or any work based on the Program), -the recipient automatically receives a license from the original licensor -to copy, distribute or modify the Program subject to these terms and conditions. -You may not impose any further restrictions on the recipients' exercise of -the rights granted herein. You are not responsible for enforcing compliance -by third parties to this License. - -7. If, as a consequence of a court judgment or allegation of patent infringement -or for any other reason (not limited to patent issues), conditions are imposed -on you (whether by court order, agreement or otherwise) that contradict the -conditions of this License, they do not excuse you from the conditions of -this License. If you cannot distribute so as to satisfy simultaneously your -obligations under this License and any other pertinent obligations, then as -a consequence you may not distribute the Program at all. For example, if a -patent license would not permit royalty-free redistribution of the Program -by all those who receive copies directly or indirectly through you, then the -only way you could satisfy both it and this License would be to refrain entirely -from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply and -the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any patents -or other property right claims or to contest validity of any such claims; -this section has the sole purpose of protecting the integrity of the free -software distribution system, which is implemented by public license practices. -Many people have made generous contributions to the wide range of software -distributed through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing to -distribute software through any other system and a licensee cannot impose -that choice. - -This section is intended to make thoroughly clear what is believed to be a -consequence of the rest of this License. - -8. If the distribution and/or use of the Program is restricted in certain -countries either by patents or by copyrighted interfaces, the original copyright -holder who places the Program under this License may add an explicit geographical -distribution limitation excluding those countries, so that distribution is -permitted only in or among countries not thus excluded. In such case, this -License incorporates the limitation as if written in the body of this License. - -9. The Free Software Foundation may publish revised and/or new versions of -the General Public License from time to time. Such new versions will be similar -in spirit to the present version, but may differ in detail to address new -problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies -a version number of this License which applies to it and "any later version", -you have the option of following the terms and conditions either of that version -or of any later version published by the Free Software Foundation. If the -Program does not specify a version number of this License, you may choose -any version ever published by the Free Software Foundation. - -10. If you wish to incorporate parts of the Program into other free programs -whose distribution conditions are different, write to the author to ask for -permission. For software which is copyrighted by the Free Software Foundation, -write to the Free Software Foundation; we sometimes make exceptions for this. -Our decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing and reuse -of software generally. - -NO WARRANTY - -11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR -THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE -STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM -"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE -OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE -OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA -OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES -OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH -HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -END OF TERMS AND CONDITIONS - -How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible -use to the public, the best way to achieve this is to make it free software -which everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach -them to the start of each source file to most effectively convey the exclusion -of warranty; and each file should have at least the "copyright" line and a -pointer to where the full notice is found. - -one line to give the program's name and an idea of what it does. Copyright -(C) yyyy name of author - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 51 Franklin -Street, Fifth Floor, Boston, MA 02110-1301, USA. Also add information on how -to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this when -it starts in an interactive mode: - -Gnomovision version 69, Copyright (C) year name of author Gnomovision comes -with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, -and you are welcome to redistribute it under certain conditions; type `show -c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may be -called something other than `show w' and `show c'; they could even be mouse-clicks -or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your school, -if any, to sign a "copyright disclaimer" for the program, if necessary. Here -is a sample; alter the names: - -Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' -(which makes passes at compilers) written by James Hacker. - -signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice diff --git a/LICENSES/GPL-2.0-or-later.txt b/LICENSES/GPL-2.0-or-later.txt deleted file mode 100644 index 3b6070fcd0c..00000000000 --- a/LICENSES/GPL-2.0-or-later.txt +++ /dev/null @@ -1,311 +0,0 @@ -GNU GENERAL PUBLIC LICENSE -Version 2, June 1991 - -Copyright (C) 1989, 1991 Free Software Foundation, Inc. -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - -Everyone is permitted to copy and distribute verbatim copies of this license -document, but changing it is not allowed. - -Preamble - -The licenses for most software are designed to take away your freedom to share -and change it. By contrast, the GNU General Public License is intended to -guarantee your freedom to share and change free software--to make sure the -software is free for all its users. This General Public License applies to -most of the Free Software Foundation's software and to any other program whose -authors commit to using it. (Some other Free Software Foundation software -is covered by the GNU Lesser General Public License instead.) You can apply -it to your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our -General Public Licenses are designed to make sure that you have the freedom -to distribute copies of free software (and charge for this service if you -wish), that you receive source code or can get it if you want it, that you -can change the software or use pieces of it in new free programs; and that -you know you can do these things. - -To protect your rights, we need to make restrictions that forbid anyone to -deny you these rights or to ask you to surrender the rights. These restrictions -translate to certain responsibilities for you if you distribute copies of -the software, or if you modify it. - -For example, if you distribute copies of such a program, whether gratis or -for a fee, you must give the recipients all the rights that you have. You -must make sure that they, too, receive or can get the source code. And you -must show them these terms so they know their rights. - -We protect your rights with two steps: (1) copyright the software, and (2) -offer you this license which gives you legal permission to copy, distribute -and/or modify the software. - -Also, for each author's protection and ours, we want to make certain that -everyone understands that there is no warranty for this free software. If -the software is modified by someone else and passed on, we want its recipients -to know that what they have is not the original, so that any problems introduced -by others will not reflect on the original authors' reputations. - -Finally, any free program is threatened constantly by software patents. We -wish to avoid the danger that redistributors of a free program will individually -obtain patent licenses, in effect making the program proprietary. To prevent -this, we have made it clear that any patent must be licensed for everyone's -free use or not licensed at all. - -The precise terms and conditions for copying, distribution and modification -follow. - -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - -0. This License applies to any program or other work which contains a notice -placed by the copyright holder saying it may be distributed under the terms -of this General Public License. The "Program", below, refers to any such program -or work, and a "work based on the Program" means either the Program or any -derivative work under copyright law: that is to say, a work containing the -Program or a portion of it, either verbatim or with modifications and/or translated -into another language. (Hereinafter, translation is included without limitation -in the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not covered -by this License; they are outside its scope. The act of running the Program -is not restricted, and the output from the Program is covered only if its -contents constitute a work based on the Program (independent of having been -made by running the Program). Whether that is true depends on what the Program -does. - -1. You may copy and distribute verbatim copies of the Program's source code -as you receive it, in any medium, provided that you conspicuously and appropriately -publish on each copy an appropriate copyright notice and disclaimer of warranty; -keep intact all the notices that refer to this License and to the absence -of any warranty; and give any other recipients of the Program a copy of this -License along with the Program. - -You may charge a fee for the physical act of transferring a copy, and you -may at your option offer warranty protection in exchange for a fee. - -2. You may modify your copy or copies of the Program or any portion of it, -thus forming a work based on the Program, and copy and distribute such modifications -or work under the terms of Section 1 above, provided that you also meet all -of these conditions: - -a) You must cause the modified files to carry prominent notices stating that -you changed the files and the date of any change. - -b) You must cause any work that you distribute or publish, that in whole or -in part contains or is derived from the Program or any part thereof, to be -licensed as a whole at no charge to all third parties under the terms of this -License. - -c) If the modified program normally reads commands interactively when run, -you must cause it, when started running for such interactive use in the most -ordinary way, to print or display an announcement including an appropriate -copyright notice and a notice that there is no warranty (or else, saying that -you provide a warranty) and that users may redistribute the program under -these conditions, and telling the user how to view a copy of this License. -(Exception: if the Program itself is interactive but does not normally print -such an announcement, your work based on the Program is not required to print -an announcement.) - -These requirements apply to the modified work as a whole. If identifiable -sections of that work are not derived from the Program, and can be reasonably -considered independent and separate works in themselves, then this License, -and its terms, do not apply to those sections when you distribute them as -separate works. But when you distribute the same sections as part of a whole -which is a work based on the Program, the distribution of the whole must be -on the terms of this License, whose permissions for other licensees extend -to the entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest your -rights to work written entirely by you; rather, the intent is to exercise -the right to control the distribution of derivative or collective works based -on the Program. - -In addition, mere aggregation of another work not based on the Program with -the Program (or with a work based on the Program) on a volume of a storage -or distribution medium does not bring the other work under the scope of this -License. - -3. You may copy and distribute the Program (or a work based on it, under Section -2) in object code or executable form under the terms of Sections 1 and 2 above -provided that you also do one of the following: - -a) Accompany it with the complete corresponding machine-readable source code, -which must be distributed under the terms of Sections 1 and 2 above on a medium -customarily used for software interchange; or, - -b) Accompany it with a written offer, valid for at least three years, to give -any third party, for a charge no more than your cost of physically performing -source distribution, a complete machine-readable copy of the corresponding -source code, to be distributed under the terms of Sections 1 and 2 above on -a medium customarily used for software interchange; or, - -c) Accompany it with the information you received as to the offer to distribute -corresponding source code. (This alternative is allowed only for noncommercial -distribution and only if you received the program in object code or executable -form with such an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for making -modifications to it. For an executable work, complete source code means all -the source code for all modules it contains, plus any associated interface -definition files, plus the scripts used to control compilation and installation -of the executable. However, as a special exception, the source code distributed -need not include anything that is normally distributed (in either source or -binary form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component itself -accompanies the executable. - -If distribution of executable or object code is made by offering access to -copy from a designated place, then offering equivalent access to copy the -source code from the same place counts as distribution of the source code, -even though third parties are not compelled to copy the source along with -the object code. - -4. You may not copy, modify, sublicense, or distribute the Program except -as expressly provided under this License. Any attempt otherwise to copy, modify, -sublicense or distribute the Program is void, and will automatically terminate -your rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses terminated -so long as such parties remain in full compliance. - -5. You are not required to accept this License, since you have not signed -it. However, nothing else grants you permission to modify or distribute the -Program or its derivative works. These actions are prohibited by law if you -do not accept this License. Therefore, by modifying or distributing the Program -(or any work based on the Program), you indicate your acceptance of this License -to do so, and all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - -6. Each time you redistribute the Program (or any work based on the Program), -the recipient automatically receives a license from the original licensor -to copy, distribute or modify the Program subject to these terms and conditions. -You may not impose any further restrictions on the recipients' exercise of -the rights granted herein. You are not responsible for enforcing compliance -by third parties to this License. - -7. If, as a consequence of a court judgment or allegation of patent infringement -or for any other reason (not limited to patent issues), conditions are imposed -on you (whether by court order, agreement or otherwise) that contradict the -conditions of this License, they do not excuse you from the conditions of -this License. If you cannot distribute so as to satisfy simultaneously your -obligations under this License and any other pertinent obligations, then as -a consequence you may not distribute the Program at all. For example, if a -patent license would not permit royalty-free redistribution of the Program -by all those who receive copies directly or indirectly through you, then the -only way you could satisfy both it and this License would be to refrain entirely -from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply and -the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any patents -or other property right claims or to contest validity of any such claims; -this section has the sole purpose of protecting the integrity of the free -software distribution system, which is implemented by public license practices. -Many people have made generous contributions to the wide range of software -distributed through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing to -distribute software through any other system and a licensee cannot impose -that choice. - -This section is intended to make thoroughly clear what is believed to be a -consequence of the rest of this License. - -8. If the distribution and/or use of the Program is restricted in certain -countries either by patents or by copyrighted interfaces, the original copyright -holder who places the Program under this License may add an explicit geographical -distribution limitation excluding those countries, so that distribution is -permitted only in or among countries not thus excluded. In such case, this -License incorporates the limitation as if written in the body of this License. - -9. The Free Software Foundation may publish revised and/or new versions of -the General Public License from time to time. Such new versions will be similar -in spirit to the present version, but may differ in detail to address new -problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies -a version number of this License which applies to it and "any later version", -you have the option of following the terms and conditions either of that version -or of any later version published by the Free Software Foundation. If the -Program does not specify a version number of this License, you may choose -any version ever published by the Free Software Foundation. - -10. If you wish to incorporate parts of the Program into other free programs -whose distribution conditions are different, write to the author to ask for -permission. For software which is copyrighted by the Free Software Foundation, -write to the Free Software Foundation; we sometimes make exceptions for this. -Our decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing and reuse -of software generally. - -NO WARRANTY - -11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR -THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE -STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM -"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE -OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE -OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA -OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES -OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH -HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -END OF TERMS AND CONDITIONS - -How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible -use to the public, the best way to achieve this is to make it free software -which everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach -them to the start of each source file to most effectively convey the exclusion -of warranty; and each file should have at least the "copyright" line and a -pointer to where the full notice is found. - -one line to give the program's name and an idea of what it does. Copyright -(C) yyyy name of author - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 2 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 51 Franklin -Street, Fifth Floor, Boston, MA 02110-1301, USA. Also add information on how -to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this when -it starts in an interactive mode: - -Gnomovision version 69, Copyright (C) year name of author Gnomovision comes -with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, -and you are welcome to redistribute it under certain conditions; type `show -c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may be -called something other than `show w' and `show c'; they could even be mouse-clicks -or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your school, -if any, to sign a "copyright disclaimer" for the program, if necessary. Here -is a sample; alter the names: - -Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' -(which makes passes at compilers) written by James Hacker. - -signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice diff --git a/LICENSES/LicenseRef-Trademark.txt b/LICENSES/LicenseRef-Trademark.txt deleted file mode 100644 index 03cb00b4d79..00000000000 --- a/LICENSES/LicenseRef-Trademark.txt +++ /dev/null @@ -1,5 +0,0 @@ -For license and usage guidelines on the seL4 trademark and logo, -including the seL4 Foundation logo, see -https://sel4.systems/Foundation/Trademark/ - -No further license is granted from use in this repository. diff --git a/LICENSES/MIT.txt b/LICENSES/MIT.txt deleted file mode 100644 index f0fd20ab686..00000000000 --- a/LICENSES/MIT.txt +++ /dev/null @@ -1,20 +0,0 @@ -MIT License - -Copyright (c) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished -to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS -OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF -OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/LICENSES/MPL-2.0.txt b/LICENSES/MPL-2.0.txt deleted file mode 100644 index d0a1fa1482e..00000000000 --- a/LICENSES/MPL-2.0.txt +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at https://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/LevelConverter.html b/LevelConverter.html new file mode 100644 index 00000000000..2a33d84355f --- /dev/null +++ b/LevelConverter.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/Makefile b/Makefile deleted file mode 100644 index fbd1625c7f3..00000000000 --- a/Makefile +++ /dev/null @@ -1,451 +0,0 @@ -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. -# SPDX-License-Identifier: BSD-2-Clause - -.PHONY: default -default: help - -.PHONY: help -help: - @echo "Makefile for the seL4 docsite" - @echo "Useful targets:" - @echo " serve - Serve a preview the site locally using Jekyll" - @echo " build - Build the site for production in _site" - @echo " preview - Build the site for externally hosted preview in _preview" - @echo " docker_serve - Serve a preview of the site using Docker" - @echo " docker_build - Build the site using Docker" - @echo " check_conformance_errors - Check for conformance and show errors" - @echo " check_liquid_syntax - Check the liquid syntax of the templates" - @echo " check_html_output - Check the HTML output using tidy" - @echo " checklinks - Runs html-proofer to check for broken links." - @echo " validate - Runs html5validator to check for HTML5 compliance." - -.PHONY: ruby_deps -ruby_deps: .jekyll-cache/ruby_deps - -.jekyll-cache/ruby_deps: Gemfile Gemfile.lock - bundle install - @mkdir -p .jekyll-cache/ - @touch $@ - -.npm_deps: package.json package-lock.json - npm install - @touch $@ - -# The following rules generate a yaml file that contains file modification metadata -# provided by git. The format is: -# -# date: Tue Mar 13 19:11:51 2018 +1100 -# timestamps: -# - page: BuildSystemAnatomy/index.md -# date: Tue Mar 13 19:11:51 2018 +1100 -# - page: CAmkESDifferences.md -# date: Tue Mar 13 19:11:51 2018 +1100 -# ... -# If this prebuild _data generation step gets more complicated then it should -# probably be moved to a python script. - -FILE_NAME=_data/generated.yml - -UPDATE_DATE:= $(shell git log -1 --format='%cd %h') -FILES:= $(shell find . -iname "*.md" | grep -ve "./README.md" | grep -ve "^./_repos/"| sed 's/.\///') - -.PHONY: _data/generated.yml -_data/generated.yml: - echo "date: $(UPDATE_DATE)" > $(FILE_NAME) - echo timestamps: >> $(FILE_NAME) && \ - for i in $(FILES); do \ - echo " - page: $$i" >> $(FILE_NAME) &&\ - echo " date: `git log -1 --format='%cd %h' -- $$i`" >> $(FILE_NAME); \ - done - -.PHONY: generate_data_files -generate_data_files: _data/generated.yml - -GIT_REPOS:=$(shell (cd _data/projects && for i in `ls *.yml`; do cat $$i | ../../tools/get_repos.py ; done) | sort -u) -REPOSITORIES = $(GIT_REPOS:%=_repos/%) - -$(REPOSITORIES): - mkdir -p $@ - git clone --depth=1 --recursive https://github.com/$(@:_repos/%=%) $@ - -.PHONY: repos -repos: $(REPOSITORIES) - -# Microkit - -MICROKIT_REPO = _repos/sel4/microkit -$(MICROKIT_REPO)/platforms.yml: $(MICROKIT_REPO) - -_data/microkit_platforms.yml: $(MICROKIT_REPO)/platforms.yml - cp $< $@ - -.PHONY: microkit -microkit: _data/microkit_platforms.yml - -# Tutorials - -TUTES_DST = _processed/tutes -TUTES_REPO = _repos/sel4/sel4-tutorials -TUTES_SRC = $(TUTES_REPO)/tutorials - -$(TUTES_DST): - mkdir -p $@ - -TUTORIAL_FILES := \ - hello-world \ - capabilities \ - untyped \ - ipc \ - interrupts \ - mapping \ - threads \ - notifications \ - mcs \ - fault-handlers \ - hello-camkes-0 \ - hello-camkes-1 \ - hello-camkes-2 \ - hello-camkes-timer \ - camkes-vm-crossvm \ - camkes-vm-linux \ - libraries-1 \ - libraries-2 \ - libraries-3 \ - libraries-4 - -$(TUTES_DST)/hello-world.md: $(TUTES_SRC)/hello-world/hello-world.md -$(TUTES_DST)/capabilities.md: $(TUTES_SRC)/capabilities/capabilities.md -$(TUTES_DST)/untyped.md: $(TUTES_SRC)/untyped/untyped.md -$(TUTES_DST)/ipc.md: $(TUTES_SRC)/ipc/ipc.md -$(TUTES_DST)/mapping.md: $(TUTES_SRC)/mapping/mapping.md -$(TUTES_DST)/threads.md: $(TUTES_SRC)/threads/threads.md -$(TUTES_DST)/notifications.md: $(TUTES_SRC)/notifications/notifications.md -$(TUTES_DST)/mcs.md: $(TUTES_SRC)/mcs/mcs.md -$(TUTES_DST)/fault-handlers.md: $(TUTES_SRC)/fault-handlers/fault-handlers.md -$(TUTES_DST)/hello-camkes-0.md: $(TUTES_SRC)/hello-camkes-0/hello-camkes-0.md -$(TUTES_DST)/hello-camkes-1.md: $(TUTES_SRC)/hello-camkes-1/hello-camkes-1.md -$(TUTES_DST)/hello-camkes-2.md: $(TUTES_SRC)/hello-camkes-2/hello-camkes-2.md -$(TUTES_DST)/hello-camkes-timer.md: $(TUTES_SRC)/hello-camkes-timer/hello-camkes-timer.md -$(TUTES_DST)/camkes-vm-crossvm.md: $(TUTES_SRC)/camkes-vm-crossvm/camkes-vm-crossvm.md -$(TUTES_DST)/camkes-vm-linux.md: $(TUTES_SRC)/camkes-vm-linux/camkes-vm-linux.md -$(TUTES_DST)/interrupts.md: $(TUTES_SRC)/interrupts/interrupts.md -$(TUTES_DST)/libraries-1.md: $(TUTES_SRC)/libraries-1/libraries-1.md -$(TUTES_DST)/libraries-2.md: $(TUTES_SRC)/libraries-2/libraries-2.md -$(TUTES_DST)/libraries-3.md: $(TUTES_SRC)/libraries-3/libraries-3.md -$(TUTES_DST)/libraries-4.md: $(TUTES_SRC)/libraries-4/libraries-4.md - -TUTORIALS := $(TUTORIAL_FILES:%=$(TUTES_DST)/%.md) -$(TUTORIALS): - @if [ -z "$<" ]; then echo "No dependency specified for $@"; exit 1; fi - @echo "$< ==> $@" - @PYTHONPATH=_repos/sel4/capdl/python-capdl-tool \ - $(TUTES_REPO)/template.py --docsite --out-dir $(TUTES_DST) --tut-file $< - -.PHONY: tutorials -tutorials: $(TUTES_DST) $(TUTORIALS) - -PROCESS_MDBOOK = tools/process-mdbook.py -MICROKIT_TUT_DST = _processed/microkit-tutorial -MICROKIT_TUT_DOC = projects/microkit/tutorial -MICROKIT_TUT_REPO = _repos/au-ts/microkit_tutorial -MICROKIT_TUT_SRC = $(MICROKIT_TUT_REPO)/website/src -# wildcard on files in this repo under projects/microkit to avoid empty wildcard -# when _repos does not exist yet -MICROKIT_TUT_DOC_FILES = $(wildcard $(MICROKIT_TUT_DOC)/*.md) -MICROKIT_TUT_SRC_FILES = $(patsubst $(MICROKIT_TUT_DOC)/%, $(MICROKIT_TUT_SRC)/%, $(MICROKIT_TUT_DOC_FILES)) -MICROKIT_TUT_DST_FILES = $(patsubst $(MICROKIT_TUT_DOC)/%, $(MICROKIT_TUT_DST)/%, $(MICROKIT_TUT_DOC_FILES)) - -# Make sure `make` knows how to build $(MICROKIT_TUT_DST)/%.md if _repos does not exist yet. -# It is not enough for the repos to be cloned before the rule fires -- the implicit rule will only -# fire if it has a complete path to the source when the Makefile is first invoked. -$(MICROKIT_TUT_SRC_FILES) $(MICROKIT_TUT_SRC)/../build.sh: $(MICROKIT_TUT_REPO) - -$(MICROKIT_TUT_DST)/%.md: $(MICROKIT_TUT_SRC)/%.md - @echo "$< ==> $@" - @$(PROCESS_MDBOOK) $< $(dir $@) - -_data/microkit_tutorial.yml: $(MICROKIT_TUT_SRC)/../build.sh - @tools/mk_tutorial_vars.sh $< $@ - -.PHONY: microkit-tutorial -microkit-tutorial: $(MICROKIT_TUT_DST_FILES) _data/microkit_tutorial.yml - -RUST_TUT_REPO = _repos/sel4/sel4-rust-tutorial -RUST_TUT_BOOK = $(RUST_TUT_REPO)/book -RUST_TUT_BUILD = $(RUST_TUT_BOOK)/build -RUST_TUT_DST = _processed/rust/tutorial -RUST_TUT_FINAL_DST = projects/rust/tutorial - -$(RUST_TUT_DST): $(RUST_TUT_REPO) - SITE_URL="/projects/rust/tutorial/" \ - RUSTDOC_URL="https://sel4.github.io/seL4-rust-tutorial/rustdoc" \ - make -C $(RUST_TUT_BOOK) build - rm -rf $(RUST_TUT_DST) - mkdir -p $(dir $(RUST_TUT_DST)) - cp -rL $(RUST_TUT_BUILD) $(RUST_TUT_DST) - tools/inject_backlink.sh $(RUST_TUT_DST) - -.PHONY: rust-tutorial -rust-tutorial: $(RUST_TUT_DST) - -.PHONY: _generate_api_pages -_generate_api_pages: _repos/sel4/sel4 - $(MAKE) markdown -C _repos/sel4/sel4/manual - -PROJECT_LIBS_REPO = _repos/sel4/sel4_projects_libs -LIBSEL4VM_SRC = $(PROJECT_LIBS_REPO)/libsel4vm/docs -LIBSEL4VM_DST = projects/virtualization/docs/api -# Does not use wildcard, because _repos may not exist yet and the wildcard would then be empty. -LIBSEL4VM_FILES = \ - libsel4vm_arm_guest_vm.md \ - libsel4vm_boot.md \ - libsel4vm_guest_arm_context.md \ - libsel4vm_guest_iospace.md \ - libsel4vm_guest_irq_controller.md \ - libsel4vm_guest_memory_helpers.md \ - libsel4vm_guest_memory.md \ - libsel4vm_guest_ram.md \ - libsel4vm_guest_vcpu_fault.md \ - libsel4vm_guest_vm_util.md \ - libsel4vm_guest_vm.md \ - libsel4vm_guest_x86_context.md \ - libsel4vm_x86_guest_vm.md \ - libsel4vm_x86_ioports.md \ - libsel4vm_x86_vmcall.md -LIBSEL4VM_SRC_FILES = $(patsubst %, $(LIBSEL4VM_SRC)/%, $(LIBSEL4VM_FILES)) -LIBSEL4VM_DST_FILES = $(patsubst %, $(LIBSEL4VM_DST)/%, $(LIBSEL4VM_FILES)) - -$(LIBSEL4VM_SRC_FILES): $(PROJECT_LIBS_REPO) - -$(LIBSEL4VM_DST)/%.md: $(LIBSEL4VM_SRC)/%.md - @echo "$< ==> $@" - @tools/gen_markdown_api_doc.py -f $< -o $@ -p libsel4vm.html - -$(LIBSEL4VM_DST): - mkdir -p $@ - -.PHONY: generate_libsel4vm_api -generate_libsel4vm_api: $(LIBSEL4VM_DST) $(LIBSEL4VM_DST_FILES) - -LIBSEL4VMM_SRC = $(PROJECT_LIBS_REPO)/libsel4vmmplatsupport/docs -# Does not use wildcard, because _repos may not exist yet and the wildcard would then be empty. -LIBSEL4VMM_FILES = \ - libsel4vmmplatsupport_arm_ac_device.md \ - libsel4vmmplatsupport_arm_generic_forward_device.md \ - libsel4vmmplatsupport_arm_guest_boot_init.md \ - libsel4vmmplatsupport_arm_guest_reboot.md \ - libsel4vmmplatsupport_arm_guest_vcpu_fault.md \ - libsel4vmmplatsupport_arm_guest_vcpu_util.md \ - libsel4vmmplatsupport_arm_vpci.md \ - libsel4vmmplatsupport_arm_vusb.md \ - libsel4vmmplatsupport_cross_vm_connection.md \ - libsel4vmmplatsupport_device_utils.md \ - libsel4vmmplatsupport_device.md \ - libsel4vmmplatsupport_guest_image.md \ - libsel4vmmplatsupport_guest_memory_util.md \ - libsel4vmmplatsupport_guest_vcpu_util.md \ - libsel4vmmplatsupport_ioports.md \ - libsel4vmmplatsupport_pci_helper.md \ - libsel4vmmplatsupport_pci.md \ - libsel4vmmplatsupport_virtio_con.md \ - libsel4vmmplatsupport_virtio_net.md \ - libsel4vmmplatsupport_x86_acpi.md \ - libsel4vmmplatsupport_x86_guest_boot_init.md \ - libsel4vmmplatsupport_x86_vmm_pci_helper.md -LIBSEL4VMM_SRC_FILES = $(patsubst %, $(LIBSEL4VMM_SRC)/%, $(LIBSEL4VMM_FILES)) -# same destination dir as libsel4vm -LIBSEL4VMM_DST_FILES = $(patsubst %, $(LIBSEL4VM_DST)/%, $(LIBSEL4VMM_FILES)) - -$(LIBSEL4VMM_SRC_FILES): $(PROJECT_LIBS_REPO) - -$(LIBSEL4VM_DST)/%.md: $(LIBSEL4VMM_SRC)/%.md - @echo "$< ==> $@" - @tools/gen_markdown_api_doc.py -f $< -o $@ -p libsel4vmm.html - -.PHONY: generate_libsel4vmmplatsupport_api -generate_libsel4vmmplatsupport_api: $(LIBSEL4VM_DST) $(LIBSEL4VMM_DST_FILES) - -.PHONY: generate_api -generate_api: _generate_api_pages generate_libsel4vm_api generate_libsel4vmmplatsupport_api - -# Rules for local serving of the site using jekyll. -# Supports docker or running using local environment. -# The _production versions run with JEKYLL_ENV=production which will show additional content. -# The _production versions require `generate_data_files` to have been run separately. -JEKYLL_ENV:=development -DOCKER_IMG:=docs_builder -.PHONY: docker_serve -docker_serve: docker_build - docker run -p 4000:4000 -v $(PWD):/docs -w /docs -it $(DOCKER_IMG) bash -c 'make serve JEKYLL_ENV=$(JEKYLL_ENV)' - -.PHONY: docker_build -docker_build: - docker build -t $(DOCKER_IMG) tools/ - -# --host 0.0.0.0 serves on all interfaces, so that docker can export -# the connection; also works locally -.PHONY: serve -serve: generate - JEKYLL_ENV=$(JEKYLL_ENV) bundle exec jekyll serve - -.PHONY: generate -generate: repos ruby_deps .npm_deps generate_api microkit microkit-tutorial rust-tutorial tutorials -ifeq ($(JEKYLL_ENV),production) - $(MAKE) generate_data_files -endif - mkdir -p $(JEKYLL_OUT)/$(RUST_TUT_FINAL_DST) - rsync -a $(RUST_TUT_DST)/ $(JEKYLL_OUT)/$(RUST_TUT_FINAL_DST)/ - -JEKYLL_OUT = _site - -.PHONY: build -build: generate - JEKYLL_ENV=$(JEKYLL_ENV) bundle exec jekyll build $(BUILD_OPTS) - -.PHONY: preview -preview: JEKYLL_ENV := production -preview: BUILD_OPTS := --config "_config.yml,_preview.yml" $(BUILD_OPTS) -preview: JEKYLL_OUT := _preview -preview: build - -.PHONY: clean -clean: - rm -rf _site - rm -rf _preview - rm -rf _data/generated.yml - rm -rf _processed/microkit-tutorial - rm -rf _processed/tutes - rm -rf projects/virtualization/docs/api - rm -rf $(RUST_TUT_DST) $(RUST_TUT_FINAL_DST) - rm -f _data/microkit_tutorial.yml - rm -f _data/microkit_platforms.yml - -.PHONY: repoclean -repoclean: clean - rm -rf _repos - -.PHONY: realclean -realclean: repoclean - rm -rf .jekyll-cache - rm -rf vendor - rm -rf node_modules - rm -f .npm_deps - -# Check conformance for Web Content Accessibility Guidelines (WCAG) 2.0, AA -# This relies on Automated Accessibility Testing Tool (AATT) (https://github.com/paypal/AATT) -# to be running and listening on http://localhose:3000 -# The resulting conformance_results.xml file can be viewed with `make check_conformance_errors` or using a junit xml viewer -.PHONY: check_conformance -check_conformance: build - find _site -iname "*.html"| sed "s/_site.//" | python tools/testWCAG.py > conformance_results.xml - -.PHONY: check_conformance_errors -check_conformance_errors: conformance_results.xml - grep -B1 'type="failure"' conformance_results.xml || true - -LIQUID_CUSTOM_TAGS := continue - -LIQUID_LINTER_CMDLINE := liquid-linter $(LIQUID_CUSTOM_TAGS:%=--custom-tag %) - -# Liquid syntax linting check. -# If it is complaining about unknown custom tags -> add them to the list above. -# Requires `liquid-linter` to be installed. -# git ls-files won't list any files that are untracked -.PHONY: check_liquid_syntax -check_liquid_syntax: - git ls-files "*.html" | xargs $(LIQUID_LINTER_CMDLINE) - git ls-files "*.md" | xargs $(LIQUID_LINTER_CMDLINE) - -# Output html checking using tidy. -# Any warnings or errors will be printed to stdout -# Requires `tidy` to be installed. -.PHONY: check_html_output -check_html_output: build - find _site/ -iname "*.html"| xargs -l tidy -q --drop-empty-elements n -e - -# list of URL regexps to ignore when checking links -# font preload/preconnect URLS give 404 on link check, but work; -IGNORE_URLS = fonts.gstatic.com -IGNORE_URLS += fonts.googleapis.com -# avoid spamming GitHub too much -IGNORE_URLS += github.com.seL4.rfcs.pulls\?q -IGNORE_URLS += https://github.com/seL4/.*/edit/ -# fail even though they work manually -IGNORE_URLS += https://dl.acm.org/citation.cfm\?id=917665 -IGNORE_URLS += https://www.avnet.com/americas/product/avnet-engineering-services/aes-ultra96-v2-i-g/evolve-42136369/ -IGNORE_URLS += https://www.microchip.com/en-us/products/fpgas-and-plds/fpga-and-soc-design-tools/soc-fpga/softconsole -IGNORE_URLS += https://wiki.odroid.com/odroid-c2/odroid-c2 -IGNORE_URLS += https://wiki.odroid.com/odroid-c4/odroid-c4 -IGNORE_URLS += http://ww1.microchip.com/downloads/en/DeviceDoc/9514.pdf -IGNORE_URLS += https://digilent.com/reference/programmable-logic/genesys-2/reference-manual -IGNORE_URLS += https://reference.digilentinc.com/reference/programmable-logic/genesys-2/reference-manual -IGNORE_URLS += https://www.microchip.com/en-us/development-tool/MPFS-ICICLE-KIT-ES -IGNORE_URLS += https://www.microchip.com/en-us/products/fpgas-and-plds/system-on-chip-fpgas/polarfire-soc-fpgas.* -IGNORE_URLS += https://www.amd.com/en/products/adaptive-socs-and-fpgas/evaluation-boards/ek-z7-zc706-g.html -IGNORE_URLS += https://www.amd.com/en/products/adaptive-socs-and-fpgas/evaluation-boards/ek-u1-zcu102-g.html -IGNORE_URLS += https://www.amd.com/en/products/adaptive-socs-and-fpgas/evaluation-boards/zcu106.html -# link checker complains about missing #target, but it exists and works -IGNORE_URLS += https://releases.llvm.org/8.0.0/tools/clang/docs/CrossCompilation.html -# link checker chrashes on #target reference for PPF in rust tutorial -IGNORE_URLS += https://sel4.systems/Info/Docs/seL4-manual-13.0.0.pdf - -# GitHub links with dynamic internal targets such as #L12 fail in the target link check -# The #target is interpreted as comment by "make", which is what we want -- the link checker has no option -# to ignore specific targets, but we still want to know what the original target was. -IGNORE_URLS += https://github.com/seL4/seL4/blob/master/libsel4/sel4_arch_include/ia32/sel4/sel4_arch/syscalls.h#L621 -IGNORE_URLS += https://github.com/seL4/seL4/blob/master/libsel4/mode_include/32/sel4/shared_types.bf#L11 -IGNORE_URLS += https://github.com/seL4/seL4/blob/master/src/arch/arm/config.cmake#L21 -IGNORE_URLS += https://github.com/seL4/seL4/blob/master/src/arch/x86/config.cmake#L15 -IGNORE_URLS += https://github.com/seL4/seL4/blob/master/src/arch/riscv/config.cmake#L15 -IGNORE_URLS += https://github.com/sel4/camkes-vm-apps/blob/master/apps/Arm/vm_minimal/tx2/devices.camkes#L40 -IGNORE_URLS += https://github.com/seL4/camkes-vm-examples/blob/master/apps/x86/optiplex9020/optiplex9020.camkes#L46 -IGNORE_URLS += https://github.com/u-boot/u-boot/blob/8937bb265a7f2251c1bd999784a4ef10e9c6080d/board/xilinx/zynqmp/zynqmp.c#L234 -IGNORE_URLS += https://github.com/u-boot/u-boot/blob/8937bb265a7f2251c1bd999784a4ef10e9c6080d/board/xilinx/zynqmp/zynqmp.c#L234 -IGNORE_URLS += https://github.com/seL4/microkit/blob/main/docs/manual.md#limits -IGNORE_URLS += https://github.com/seL4/rust-sel4/blob/main//support/targets#readme -IGNORE_URLS += https://github.com/seL4/rust-sel4/tree/main/support/targets#readme -IGNORE_URLS += https://github.com/seL4/microkit/blob/b8cf3094ba08b37198b1943ec832c3a1168f4409/libmicrokit/include/microkit.h#L14C22-L14C38 -IGNORE_URLS += https://github.com/seL4/microkit/blob/b8cf3094ba08b37198b1943ec832c3a1168f4409/libmicrokit/include/microkit.h#L16C28-L16C44 -IGNORE_URLS += https://github.com/seL4/seL4-rust-tutorial-code/blob/42d026476c7da08aa84ce17b99ab56dae37ff227/docker/Dockerfile#L94-L108 -IGNORE_URLS += https://github.com/seL4/seL4-rust-tutorial-code/blob/42d026476c7da08aa84ce17b99ab56dae37ff227/mk/root-task.mk#L31-L36 -IGNORE_URLS += https://github.com/seL4/seL4-rust-tutorial-code/blob/42d026476c7da08aa84ce17b99ab56dae37ff227/.cargo/config.toml#L8 -IGNORE_URLS += https://github.com/seL4/seL4/blob/b63043c41a5db1f64253ea98b104eab54c256c56/include/benchmark/benchmark.h#L63 -IGNORE_URLS += https://github.com/seL4/camkes-tool/blob/camkes-3.0.0/docs/index.md#cache-accelerator - -sep:= /,/ -empty:= -space:= $(empty) $(empty) -IGNORE_URLS:= $(subst /,\/,$(IGNORE_URLS)) -IGNORE_EXP:= $(subst $(space),$(sep),$(IGNORE_URLS)) - -HTMLPROOFEROPT := --swap-urls '^https\://docs.sel4.systems:http\://localhost\:4000' -HTMLPROOFEROPT += --enforce-https=false --disable-external=false -HTMLPROOFEROPT += --ignore-urls '/$(IGNORE_EXP)/' -HTMLPROOFEROPT += --ignore-files "/.*rustdoc.*/,/rust\/tutorial\/404|print/,/projects.rust.tutorial.microkit.shared-memory.*/" -HTMLPROOFEROPT += --assume-extension "" -HTMLPROOFEROPT += --ignore-status-codes 429 -# HTMLPROOFEROPT += --log-level debug -# HTMLPROOFEROPT += --disable-external=true - -checklinks: build - @bundle exec htmlproofer $(HTMLPROOFEROPT) _site - -validate: -# ignore errors from inline SVG files - @html5validator --root _site \ - --ignore 'is not a "color" value' \ - 'not allowed on element "svg"' \ - 'The "font" element is obsolete' \ - 'xmlns:svg' \ - 'sodipodi:namedview' \ - 'xmlns:inkscape' \ - 'sodipodi:role' \ - 'inkscape:label' \ - 'inkscape:groupmode' \ - 'xmlns:sodipodi' \ - 'Element "g" not allowed as child of element "clipPath"' \ - 'error: Duplicate ID "layer1".' - -update: - bundle update - npm update diff --git a/PortingSeL4.html b/PortingSeL4.html new file mode 100644 index 00000000000..aba5c9ed579 --- /dev/null +++ b/PortingSeL4.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/README.md b/README.md deleted file mode 100644 index da383ca2de3..00000000000 --- a/README.md +++ /dev/null @@ -1,160 +0,0 @@ - - -# seL4 Documentation site - -These are the sources for the seL4 Documentation site located at -. It is for cooperatively developing and sharing -documentation on [seL4](https://sel4.systems). - -See [CONTRIBUTING.md](processes/docs-contributing.md) for information on how to -contribute. _TL;DR click edit on the page in GitHub, make your changes and then -submit a pull request._ - -Ask on the [mailing list][mailing-list] or open an issue if something doesn't -make sense. - -We've tried to make sure the hosted site is [WCAG 2.0 -AA](https://www.w3.org/TR/WCAG20/) compliant. Please let us know if we have -missed something. - -[mailing-list]: https://lists.sel4.systems/postorius/lists/ - -## Building the site - -### Install - -#### Ruby - -We recommend using [rbenv](https://github.com/rbenv/rbenv) to install the -correct Ruby version. - -On Mac, using [homebrew](https://brew.sh): - -```sh -brew install ruby-build rbenv -# follow the instructions this command shows, and start a new shell afterwards -rbenv init -# in the docs directory (root of this repo): -rbenv install -``` - -On apt-based Linux distributions (e.g. Ubuntu, Debian): - -```sh -apt install rbenv -# follow the instructions this command shows, and start a new shell afterwards -rbenv init -# in the docs directory (root of this repo): -rbenv install -``` - -After these, you should be able to forget about `rbenv`, the `Makefile` will now -see the correct Ruby version. - -#### Node/JS - -The doc site needs `node` version 20 or later at build time. The default -`node` and `npm` of recent distribution should work fine: - -```sh -apt install node -``` - -or on Mac: - -```sh -brew install node -``` - -The Makefile does the rest of the JS dependency installation. - -#### Rust - -For building the Rust tutorials we need `cargo`. The easiest way to get Rust -installed is via . Follow the instructions there. A default -install for your platform will work for the doc site. - -You can test if `cargo` is available after the installation by trying - -```sh -cargo --version -``` - -#### Python - -The build is tested with Python 3.9. More recent versions are likely to work as -well. After installing Python via e.g. `homebrew` or `apt`, you can install the -Python build dependencies with: - -```sh -pip3 install --user camkes-deps -``` - -#### Linters - -If you are using the lint checks, they require `tidy` and `liquid-linter`. If -you just want to build the site, you can skip these. - -- HTML output checking using `tidy`: `make check_html_output` -- Liquid syntax checking using `liquid-linter`: `make check_liquid_syntax` - -### Build - -To build and host locally: - -```sh -make serve -# Server address: http://127.0.0.1:4000/ -# Server running... press ctrl-c to stop. -``` - -Or using Docker (you need [Docker -installed](https://docs.docker.com/get-docker/) and running for this): - -```sh -make docker_serve -``` - -### Makefile and JEKYLL_ENV=production version - -Jekyll environment flags can be used to provide some content only in a -production environment. - -One way we use this is to show data generated by rules in the Makefile and saved -in `\_data/generated.yml`. If you want to serve the site locally in production -mode there are `make` rules for this. You will need to call the make rule to -generate the `\_data/generated.yml` also. - -## How the site is set up - -Our documentation is contained in a collection of Markdown files stored in this -repository. We use [Jekyll](https://jekyllrb.com/) to generate a static html -website that is then hosted on GitHub pages. Our continuous integration is -configured to regenerate and update the live site whenever a pull request is -merged. There is a timestamp in the source that indicates when it was last -generated. Additionally, each page has a timestamp and revision hash from when -it was last updated located in the footer based on the git history. - -The markdown pages are rendered using -[Kramdown](https://kramdown.gettalong.org/), a ruby-based markdown converter -that is configured to interpret the markdown files (`.md`) as GitHub flavoured -markdown. - -## Compliance, style and formatting checks - -### WCAG 2.0 AA conformance - -There is a make rule to check conformance to all testable statements from the -guidelines. `make check_conformance`. It requires the site to be hosted locally -(using `make serve`) and a local server of [Automated Accessibility Testing Tool -(AATT)](https://github.com/paypal/AATT). - -`make check_conformance` will output a file named `conformance_results.xml` -which is a junit test suite output file that will contain a test case for each -generated html file of the site. A make rule `make check_conformance_errors` -will grep for failing test cases and output the html page name. The idea here is -to detect if any pages are failing and then manually using the AATT tool's -web interface to check what parts of the page violate the guidelines. diff --git a/RepoCheatsheet.html b/RepoCheatsheet.html new file mode 100644 index 00000000000..0c8ddc37e40 --- /dev/null +++ b/RepoCheatsheet.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/Resources.html b/Resources.html new file mode 100644 index 00000000000..d5f76db0935 --- /dev/null +++ b/Resources.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/Resources.md b/Resources.md deleted file mode 100644 index 7197cc9afad..00000000000 --- a/Resources.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -redirect_to: /projects/buildsystem/host-dependencies.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- diff --git a/Rust.html b/Rust.html new file mode 100644 index 00000000000..14d9169beed --- /dev/null +++ b/Rust.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/SeL4Libraries.html b/SeL4Libraries.html new file mode 100644 index 00000000000..8e9c58dd86f --- /dev/null +++ b/SeL4Libraries.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/Tutorials/camkes-vm-crossvm.html b/Tutorials/camkes-vm-crossvm.html new file mode 100644 index 00000000000..3a131570eb3 --- /dev/null +++ b/Tutorials/camkes-vm-crossvm.html @@ -0,0 +1,1069 @@ + + + + + + + CAmkES cross-VM connectors | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/camkes-vm-crossvm.md b/Tutorials/camkes-vm-crossvm.md deleted file mode 100644 index 8712c0056a9..00000000000 --- a/Tutorials/camkes-vm-crossvm.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: CAmkES cross-VM connectors -tutorial: camkes-vm-crossvm -layout: tutorial -description: walkthrough of adding communication between Linux guests in separate VMs -nav_prev: camkes-vm-linux.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} \ No newline at end of file diff --git a/Tutorials/camkes-vm-linux.html b/Tutorials/camkes-vm-linux.html new file mode 100644 index 00000000000..138677b16a1 --- /dev/null +++ b/Tutorials/camkes-vm-linux.html @@ -0,0 +1,1127 @@ + + + + + + + CAmkES VM Linux | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/camkes-vm-linux.md b/Tutorials/camkes-vm-linux.md deleted file mode 100644 index 86981adfe66..00000000000 --- a/Tutorials/camkes-vm-linux.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: CAmkES VM Linux -tutorial: camkes-vm-linux -tutorial-order: vm-1 -layout: tutorial -nav_prev: hello-camkes-timer.html -nav_next: camkes-vm-crossvm.html -description: using Linux as a guest in the CAmkES VM -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} diff --git a/Tutorials/capabilities.html b/Tutorials/capabilities.html new file mode 100644 index 00000000000..e3473891eca --- /dev/null +++ b/Tutorials/capabilities.html @@ -0,0 +1,986 @@ + + + + + + + Capabilities | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/capabilities.md b/Tutorials/capabilities.md deleted file mode 100644 index 6338bfa4ff6..00000000000 --- a/Tutorials/capabilities.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Capabilities -tutorial: capabilities -layout: tutorial -nav_prev: hello-world.html -nav_next: untyped.html -description: an introduction to capabilities in the seL4 kernel API -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -{% include tutorial.md %} diff --git a/Tutorials/fault-handlers.html b/Tutorials/fault-handlers.html new file mode 100644 index 00000000000..25aba8d8821 --- /dev/null +++ b/Tutorials/fault-handlers.html @@ -0,0 +1,979 @@ + + + + + + + Faults | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/fault-handlers.md b/Tutorials/fault-handlers.md deleted file mode 100644 index f36766c19eb..00000000000 --- a/Tutorials/fault-handlers.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Faults -tutorial: fault-handlers -layout: tutorial -description: fault (e.g virtual memory fault) handling and fault endpoints -nav_prev: interrupts.html -nav_next: mcs.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} diff --git a/Tutorials/get-the-tutorials.html b/Tutorials/get-the-tutorials.html new file mode 100644 index 00000000000..37832850ba0 --- /dev/null +++ b/Tutorials/get-the-tutorials.html @@ -0,0 +1,634 @@ + + + + + + + Getting the tutorials | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/get-the-tutorials.md b/Tutorials/get-the-tutorials.md deleted file mode 100644 index 0de2e333f49..00000000000 --- a/Tutorials/get-the-tutorials.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -layout: tutorial -description: steps and code for getting tutorials -nav_next: hello-world.html -nav_prev: setting-up.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2024 seL4 Project a Series of LF Projects, LLC. ---- - -# Getting the tutorials - -{% include note.html %} -The steps on this page only need to be done once, before doing your first tutorial. -{% include endnote.html %} - -## Python Dependencies - -The CAmkES python dependencies are required to build the seL4 tutorials. To install you can run: - -```sh -pip3 install --user camkes-deps -``` - -{% include pip-instructions.md %} - -## Get the code - -The collection of code needed for the tutorials is defined in the [sel4-tutorials-manifest]. Get the code with: - -```bash -mkdir tutorials -cd tutorials -repo init -u https://github.com/seL4/sel4-tutorials-manifest -repo sync -``` - -`repo sync` may take a few moments to run - -[sel4-tutorials-manifest]: https://github.com/seL4/sel4-tutorials-manifest diff --git a/Tutorials/hello-camkes-0.html b/Tutorials/hello-camkes-0.html new file mode 100644 index 00000000000..235fe8b6b2a --- /dev/null +++ b/Tutorials/hello-camkes-0.html @@ -0,0 +1,756 @@ + + + + + + + Hello CAmkES | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/hello-camkes-0.md b/Tutorials/hello-camkes-0.md deleted file mode 100644 index 7120d0a081d..00000000000 --- a/Tutorials/hello-camkes-0.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Hello CAmkES -tutorial: hello-camkes-0 -layout: tutorial -description: an introduction to CAmkES concepts -nav_next: hello-camkes-1.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} diff --git a/Tutorials/hello-camkes-1.html b/Tutorials/hello-camkes-1.html new file mode 100644 index 00000000000..956658c93e2 --- /dev/null +++ b/Tutorials/hello-camkes-1.html @@ -0,0 +1,858 @@ + + + + + + + Introduction to CAmkES | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/hello-camkes-1.md b/Tutorials/hello-camkes-1.md deleted file mode 100644 index 558cbed0274..00000000000 --- a/Tutorials/hello-camkes-1.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Introduction to CAmkES -tutorial: hello-camkes-1 -layout: tutorial -description: an introduction to CAmkES concepts -nav_prev: hello-camkes-0.html -nav_next: hello-camkes-2.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} diff --git a/Tutorials/hello-camkes-2.html b/Tutorials/hello-camkes-2.html new file mode 100644 index 00000000000..94983a53501 --- /dev/null +++ b/Tutorials/hello-camkes-2.html @@ -0,0 +1,1243 @@ + + + + + + + Events in CAmkES | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/hello-camkes-2.md b/Tutorials/hello-camkes-2.md deleted file mode 100644 index 34d2e5aa65d..00000000000 --- a/Tutorials/hello-camkes-2.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Events in CAmkES -tutorial: hello-camkes-2 -layout: tutorial -description: an introduction to CAmkES concepts -nav_prev: hello-camkes-1.html -nav_next: hello-camkes-timer.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} diff --git a/Tutorials/hello-camkes-timer.html b/Tutorials/hello-camkes-timer.html new file mode 100644 index 00000000000..232e458753c --- /dev/null +++ b/Tutorials/hello-camkes-timer.html @@ -0,0 +1,1121 @@ + + + + + + + CAmkES timer tutorial | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/hello-camkes-timer.md b/Tutorials/hello-camkes-timer.md deleted file mode 100644 index d4c4b0f88e0..00000000000 --- a/Tutorials/hello-camkes-timer.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: CAmkES timer tutorial -tutorial: hello-camkes-timer -layout: tutorial -description: introduce CAmkES hardware components -nav_prev: hello-camkes-2.html -nav_next: camkes-vm-linux.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} diff --git a/Tutorials/hello-world.html b/Tutorials/hello-world.html new file mode 100644 index 00000000000..8078633f8e9 --- /dev/null +++ b/Tutorials/hello-world.html @@ -0,0 +1,805 @@ + + + + + + + Hello, World! | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/hello-world.md b/Tutorials/hello-world.md deleted file mode 100644 index de97ab7fbde..00000000000 --- a/Tutorials/hello-world.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Hello, World! -tutorial: hello-world -layout: tutorial -nav_prev: get-the-tutorials.html -nav_next: capabilities.html -description: an introduction to seL4 projects and tutorials -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -{% include tutorial.md %} diff --git a/Tutorials/how-to-CAmkES.html b/Tutorials/how-to-CAmkES.html new file mode 100644 index 00000000000..49164c44def --- /dev/null +++ b/Tutorials/how-to-CAmkES.html @@ -0,0 +1,623 @@ + + + + + + + How-to guide for CAmkES | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Tutorials/how-to-CAmkES.md b/Tutorials/how-to-CAmkES.md deleted file mode 100644 index 8825a7c48fb..00000000000 --- a/Tutorials/how-to-CAmkES.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2024 seL4 Project a Series of LF Projects, LLC. ---- - -# How-to guide for CAmkES - -This guide provides links to CAmkES tutorial solutions as quick how-to reference guide. - -{% assign url = "hello-camkes-1.html?tut_expand" %} - -## [A basic CAmkES application]({{ url }}) - -- [Define an instance in the composition section of the ADL]({{ url }}#define-an-instance-in-the-composition-section-of-the-adl) -- [Add a connection]({{ url }}#add-a-connection) -- [Define an interface]({{ url }}#define-an-interface) -- [Implement an RPC function]({{ url }}#implement-an-rpc-function) -- [Invoke an RPC function]({{ url }}#invoke-an-rpc-function) - -{% assign url = "hello-camkes-2.html?tut_expand" %} - -## [Events in CAmkES]({{ url }}) - -- [Specify an events interface]({{ url }}#specify-an-events-interface) -- [Add connections]({{ url }}#add-connections) -- [Wait for data to become available]({{ url }}#wait-for-data-to-become-available) -- [Signal that data is available]({{ url }}#signal-that-data-is-available) -- [Register a callback handler]({{ url }}#register-a-callback-handler) -- [Specify dataport interfaces]({{ url }}#specify-dataport-interfaces) -- [Specify dataport connections]({{ url }}#specify-dataport-connections) -- [Copy strings to an untyped dataport]({{ url }}#copy-strings-to-an-untyped-dataport) -- [Read the reply data from a typed dataport]({{ url }}#read-the-reply-data-from-a-typed-dataport) -- [Send data using dataports]({{ url }}#send-data-using-dataports) -- [Read data from an untyped dataport]({{ url }}#read-data-from-an-untyped-dataport) -- [Put data into a typed dataport]({{ url }}#put-data-into-a-typed-dataport) -- [Read data from a typed dataport]({{ url }}#read-data-from-a-typed-dataport) -- [Set component priorities]({{ url }}#set-component-priorities) -- [Restrict access to dataports]({{ url }}#restrict-access-to-dataports) -- [Test the read and write permissions on the dataport]({{ url }}#test-the-read-and-write-permissions-on-the-dataport) - -{% assign url = "hello-camkes-timer.html?tut_expand" %} - -## [CAmkES Timer]({{ url }}) - -- [Instantiate a Timer and Timerbase]({{ url }}#instantiate-a-timer-and-timerbase) -- [Connect a timer driver component]({{ url }}#connect-a-timer-driver-component) -- [Configure a timer hardware component instance]({{ url }}#configure-a-timer-hardware-component-instance) -- [Call into a supplied driver to handle the interrupt]({{ url }}#call-into-a-supplied-driver-to-handle-the-interrupt) -- [Stop a timer]({{ url }}#stop-a-timer) -- [Acknowledge an interrupt]({{ url }}#acknowledge-an-interrupt) -- [Get a timer handler]({{ url }}#get-a-timer-handler) -- [Start a timer]({{ url }}#start-a-timer) -- [Implement an RPC interface]({{ url }}#implement-an-rpc-interface) -- [Set a timer interrupt]({{ url }}#set-a-timer-interrupt) -- [Instantiate a TimerDTB component]({{ url }}#instantiate-a-timerdtb-component) -- [Connect interfaces using the seL4DTBHardware connector]({{ url }}#connect-interfaces-using-the-sel4dtbhardware-connector) -- [Configure the TimerDTB component]({{ url }}#configure-the-timerdtb-component) -- [Handle the interrupt]({{ url }}#handle-the-interrupt) -- [Stop the timer]({{ url }}#stop-a-timer-1) - -{% assign url = "camkes-vm-linux.html?tut_expand" %} - -## [CAmkES VM Linux]({{ url }}) - -- [Add a program]({{ url }}#adding-a-program) -- [Add a kernel module]({{ url }}#adding-a-kernel-module) -- [Create a hypercall]({{ url }}#creating-a-hypercall) - -{% assign url = "camkes-vm-crossvm.html?tut_expand" %} - -## [CAmkeES Cross VM Connectors]({{ url }}) - -- [Add modules to the guest]({{ url }}#add-modules-to-the-guest) -- [Define interfaces in the VMM]({{ url }}#define-interfaces-in-the-vmm) -- [Define the component interface]({{ url }}#define-the-component-interface) -- [Instantiate the print server]({{ url }}#instantiate-the-print-server) -- [Implement the print server]({{ url }}#implement-the-print-server) -- [Implement the VMM side of the connection]({{ url }}#implement-the-vmm-side-of-the-connection) -- [Update the build system]({{ url }}#update-the-build-system) -- [Add interfaces to the Guest]({{ url }}#add-interfaces-to-the-guest) -- [Create a process]({{ url }}#create-a-process) diff --git a/Tutorials/how-to-libs.html b/Tutorials/how-to-libs.html new file mode 100644 index 00000000000..df00f27d219 --- /dev/null +++ b/Tutorials/how-to-libs.html @@ -0,0 +1,612 @@ + + + + + + + How-to guide for the seL4 C libraries | seL4 docs + + + + + + + + + + + + + + + diff --git a/Tutorials/how-to-libs.md b/Tutorials/how-to-libs.md deleted file mode 100644 index 4177df4e8e8..00000000000 --- a/Tutorials/how-to-libs.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2024 seL4 Project a Series of LF Projects, LLC. ---- - -# How-to guide for the seL4 C libraries - -This guide provides links to tutorial solutions as quick references for the seL4 -C prototyping libraries. - -{% assign url = "libraries-1.html?tut_expand" %} - -## [Initialisation & threading]({{ url }}) - -- [Obtain BootInfo]({{ url }}#obtain-bootinfo) -- [Initialise simple]({{ url }}#initialise-simple) -- [Use simple to print BootInfo]({{ url }}#use-simple-to-print-bootinfo) -- [Initialise an allocator]({{ url }}#initialise-an-allocator) -- [Obtain a generic allocation interface (vka)]({{ url }}#obtain-a-generic-allocation-interface-vka) -- [Find the CSpace root cap]({{ url }}#find-the-cspace-root-cap) -- [Find the VSpace root cap]({{ url }}#find-the-vspace-root-cap) -- [Allocate a TCB Object]({{ url }}#allocate-a-tcb-object) -- [Configure the new TCB]({{ url }}#configure-the-new-tcb) -- [Name the new TCB]({{ url }}#name-the-new-tcb) -- [Set the instruction pointer]({{ url }}#set-the-instruction-pointer) -- [Set the stack pointer]({{ url }}#set-the-stack-pointer) -- [Write the registers]({{ url }}#write-the-registers) -- [Start the new thread]({{ url }}#start-the-new-thread) -- [Print]({{ url }}#print-something) - -{% assign url = "libraries-2.html?tut_expand" %} - -## [IPC]({{ url }}) - -- [Allocate an IPC buffer]({{ url }}#allocate-an-ipc-buffer) -- [Allocate a page table]({{ url }}#allocate-a-page-table) -- [Map a page table]({{ url }}#map-a-page-table) -- [Map a page]({{ url }}#map-a-page) -- [Allocate an endpoint]({{ url }}#allocate-an-endpoint) -- [Badge an endpoint]({{ url }}#badge-an-endpoint) -- [Set a message register]({{ url }}#message-registers) -- [Send and wait for a reply]({{ url }}#ipc) -- [Receive a reply]({{ url }}#receive-a-reply) -- [Receive an IPC]({{ url }}#receive-an-ipc) -- [Validate a message]({{ url }}#validate-the-message) -- [Write the message registers]({{ url }}#write-the-message-registers) -- [Reply to a message]({{ url }}#reply-to-a-message) - -{% assign url = "libraries-3.html?tut_expand" %} - -## [Processes & Elf loading]({{ url }}) - -- [Create a VSpace object]({{ url }}#virtual-memory-management) -- [Configure a process]({{ url }}#configure-a-process) -- [Get a CSpace path]({{ url }}#get-a-cspacepath) -- [Badge a capability]({{ url }}#badge-a-capability) -- [Spawn a process]({{ url }}#spawn-a-process) -- [Receive a message]({{ url }}#receive-a-message) -- [Send a reply]({{ url }}#send-a-reply) -- [Initiate communications by using seL4_Call]({{ url }}#client-call) - -{% assign url = "libraries-4.html?tut_expand" %} - -## [Timer]({{ url }}) - -- [Allocate a notification object]({{ url }}#allocate-a-notification-object) -- [Initialise a timer]({{ url }}#initialise-the-timer) -- [Use a timer]({{ url }}#use-the-timer) -- [Handle an interrupt]({{ url }}#handle-the-interrupt) -- [Destroy a timer]({{ url }}#destroy-the-timer) diff --git a/Tutorials/how-to-seL4.html b/Tutorials/how-to-seL4.html new file mode 100644 index 00000000000..e119271c0a1 --- /dev/null +++ b/Tutorials/how-to-seL4.html @@ -0,0 +1,635 @@ + + + + + + + How-to guide for seL4 | seL4 docs + + + + + + + + + + + + +
+ + + + +
+ + diff --git a/Tutorials/how-to-seL4.md b/Tutorials/how-to-seL4.md deleted file mode 100644 index a378d27772f..00000000000 --- a/Tutorials/how-to-seL4.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2024 seL4 Project a Series of LF Projects, LLC. ---- - -# How-to guide for seL4 - -This guide provides links to the seL4 tutorial solutions as a quick references -for seL4 calls and methods. - -{% assign url = "capabilities.html?tut_expand" %} - -## [Capabilities]({{ url }}) - -- [Calculate the size of a CSpace]({{ url }}#how-big-is-your-cspace) -- [Copy a capability between CSlots]({{ url }}#copy-a-capability-between-cslots) -- [Delete a capability]({{ url }}#how-do-you-delete-capabilities) -- [Suspend a thread]({{ url }}#suspend-a-thread) - -{% assign url = "untyped.html?tut_expand" %} - -## [Untyped]({{ url }}) - -- [Create an untyped capability]({{ url }}#create-an-untyped-capability) -- [Create a TCB object]({{ url }}#create-a-tcb-object) -- [Create an endpoint object]({{ url }}#create-an-endpoint-object) -- [Create a notification object]({{ url }}#create-a-notification-object) -- [Delete an object]({{ url }}#delete-the-objects) - -{% assign url = "mapping.html?tut_expand" %} - -## [Mapping]({{ url }}) - -- [Map a page directory]({{ url }}#map-a-page-directory) -- [Map a page table]({{ url }}#map-a-page-table) -- [Remap a page]({{ url }}#remap-a-page) -- [Unmap a page]({{ url }}#unmapping-pages) - -{% assign url = "threads.html?tut_expand" %} - -## [Threads]({{ url }}) - -- [Configure a TCB]({{ url }}#configure-a-tcb) -- [Change the priority of a thread]({{ url }}#change-priority-via-sel4_tcb_setpriority) -- [Set initial register state]({{ url }}#set-initial-register-state) -- [Start the thread]({{ url }}#start-the-thread) -- [Set the arguments of a thread]({{ url }}#passing-arguments) -- [Resolve a fault]({{ url }}#resolving-a-fault) - -{% assign url = "ipc.html?tut_expand" %} - -## [IPC]({{ url }}) - -- [Use capability transfer to send the badged capability]({{ url }}#use-capability-transfer-to-send-the-badged-capability) -- [Get a message]({{ url }}#get-a-message) -- [Reply and wait]({{ url }}#reply-and-wait) -- [Save a reply and store reply capabilities]({{ url }}#save-a-reply-and-store-reply-capabilities) - -{% assign url = "notifications.html?tut_expand" %} - -## [Notifications]({{ url }}) - -- [Set up shared memory]({{ url }}#set-up-shared-memory) -- [Signalling]({{ url }}#signal-the-producers-to-go) -- [Differentiate signals]({{ url }}#differentiate-signals) - -{% assign url = "interrupts.html?tut_expand" %} - -## [Interrupts]({{ url }}) - -- [Invoke IRQ control]({{ url }}#invoke-irq-control) -- [Set NTFN]({{ url }}#set-ntfn) -- [Acknowledge an interrupt]({{ url }}#acknowledge-an-interrupt) - -{% assign url = "fault-handlers.html?tut_expand" %} - -### [Fault handling]({{ url }}) - -- [Set up an endpoint for thread fault IPC messages]({{ url }}#setting-up-the-endpoint-to-be-used-for-thread-fault-ipc-messages) -- [Receive an IPC message from the kernel]({{ url }}#receiving-the-ipc-message-from-the-kernel) -- [Get information about a thread fault]({{ url }}#finding-out-information-about-the-generated-thread-fault) -- [Handle a thread fault]({{ url }}#handling-a-thread-fault) -- [Resume a faulting thread]({{ url }}#resuming-a-faulting-thread) - -{% assign url = "mcs.html?tut_expand" %} - -## [MCS]({{ url }}) - -- [Set up a periodic thread]({{ url }}#periodic-threads) -- [Unbind a scheduling context]({{ url }}#unbinding-scheduling-contexts) -- [Experiment with sporadic tasks]({{ url }}#sporadic-threads) -- [Use passive servers]({{ url }}#passive-servers) -- [Configure fault endpoints]({{ url }}#configuring-a-fault-endpoint-on-the-mcs-kernel) diff --git a/Tutorials/index.html b/Tutorials/index.html new file mode 100644 index 00000000000..a68987d3cca --- /dev/null +++ b/Tutorials/index.html @@ -0,0 +1,622 @@ + + + + + + + Tutorial Overview | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/Tutorials/index.md b/Tutorials/index.md deleted file mode 100644 index 701be93f397..00000000000 --- a/Tutorials/index.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -redirect_from: - - /projects/sel4-tutorials.html - - /projects/sel4-tutorials/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Tutorial Overview - -The seL4 docsite provides a set of tutorials that introduce seL4 and show how to -develop systems on seL4. They are split into the following categories. - -- The [Microkit tutorial] tutorial is an easy way to get started with seL4. - The seL4 Microkit is a software development kit (SDK) for building systems - with a statically described architecture on top of seL4. It provides simple, - high-performance abstractions that manage much of the complexity of the seL4 - API. - -- The [seL4 tutorials](setting-up.html) are for people keen to learn about the - base mechanisms provided by the seL4 kernel. It explains the kernel API with - short exercises that show basic usage examples. - -- The [CAmkES tutorial](hello-camkes-0.html) introduces the CAmkES component platform - on top of seL4. CAmkES provides abstractions for component on top of seL4 and - communication glue code between them. It is designed for building - high-assurance systems with a static software architecture. CAmkES is being - superseded by Microkit and we recommend starting with the [Microkit tutorial] - instead if you are starting a new project. - -- The [Rust on seL4 tutorial] introduces the basic Rust crates for seL4 and - shows how to get started writing root tasks and Microkit components in the - Rust programming language. - -- The [C library tutorials](libraries-1.html) provide walkthroughs and exercises for - using the libraries provided in `seL4_libs`. These libraries were developed - for rapidly prototyping systems on seL4. They are not meant for production - code, but for experimenting with the seL4 API. - -[Microkit tutorial]: {% link projects/microkit/tutorial/welcome.md %} -[Rust on seL4 tutorial]: ../projects/rust/tutorial/introduction.html - -## Recommended reading - -Note that most of these tutorials require C programming experience and some -understanding of operating systems and computer architecture. Suggested -resources for these topics include: - -- C programming language - - [C tutorial](https://www.cprogramming.com/tutorial/c-tutorial.html) -- Operating Systems: - - [Modern Operating Systems (book)](https://www.amazon.com/Modern-Operating-Systems-Andrew-Tanenbaum/dp/013359162X) - - [COMP3231 slides at UNSW](http://www.cse.unsw.edu.au/~cs3231) - -## Further Resources - -Additional learning resources that may be helpful: - -- The [seL4 manual](https://sel4.systems/Info/Docs/seL4-manual-latest.pdf) -- The [seL4 API reference](../projects/sel4/api-doc.html) -- The How-to pages for [seL4](how-to-seL4.html), [CAmkES](how-to-CAmkES.html), - and [C libraries](how-to-libs.html) provide links to tutorial solutions as - quick reference. -- The [seL4 white paper](https://sel4.systems/About/seL4-whitepaper.pdf) for a - high-level overview of what seL4 is and what it can do. -- [FAQs](https://sel4.systems/About/FAQ.html) -- [Debugging guide](../projects/sel4-tutorials/debugging-guide.html) -- [Help & Support](https://sel4.systems/support.html) diff --git a/Tutorials/interrupts.html b/Tutorials/interrupts.html new file mode 100644 index 00000000000..b35b41d3e66 --- /dev/null +++ b/Tutorials/interrupts.html @@ -0,0 +1,815 @@ + + + + + + + Interrupts | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/interrupts.md b/Tutorials/interrupts.md deleted file mode 100644 index ad92988c458..00000000000 --- a/Tutorials/interrupts.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Interrupts -tutorial: interrupts -layout: tutorial -description: receiving and handling interrupts -nav_prev: notifications.html -nav_next: fault-handlers.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} diff --git a/Tutorials/ipc.html b/Tutorials/ipc.html new file mode 100644 index 00000000000..511ec197202 --- /dev/null +++ b/Tutorials/ipc.html @@ -0,0 +1,972 @@ + + + + + + + IPC | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/ipc.md b/Tutorials/ipc.md deleted file mode 100644 index dec8ab30b2f..00000000000 --- a/Tutorials/ipc.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: IPC -tutorial: ipc -layout: tutorial -description: overview of interprocess communication (IPC) -nav_prev: threads.html -nav_next: notifications.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} diff --git a/Tutorials/libraries-1.html b/Tutorials/libraries-1.html new file mode 100644 index 00000000000..727ad48399f --- /dev/null +++ b/Tutorials/libraries-1.html @@ -0,0 +1,1196 @@ + + + + + + + Libraries initialisation & threading | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/libraries-1.md b/Tutorials/libraries-1.md deleted file mode 100644 index 30535ade526..00000000000 --- a/Tutorials/libraries-1.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Libraries initialisation & threading -tutorial: libraries-1 -layout: tutorial -description: system initialisation & threading with seL4_libs. -nav_next: libraries-2.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} diff --git a/Tutorials/libraries-2.html b/Tutorials/libraries-2.html new file mode 100644 index 00000000000..37a11b72ff9 --- /dev/null +++ b/Tutorials/libraries-2.html @@ -0,0 +1,1343 @@ + + + + + + + Libraries IPC | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/libraries-2.md b/Tutorials/libraries-2.md deleted file mode 100644 index d8c61b0d05b..00000000000 --- a/Tutorials/libraries-2.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Libraries IPC -tutorial: libraries-2 -layout: tutorial -description: IPC with seL4_libs -nav_prev: libraries-1.html -nav_next: libraries-3.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} diff --git a/Tutorials/libraries-3.html b/Tutorials/libraries-3.html new file mode 100644 index 00000000000..08e5e3b0aa3 --- /dev/null +++ b/Tutorials/libraries-3.html @@ -0,0 +1,1040 @@ + + + + + + + Libraries processes & ELF loading | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/libraries-3.md b/Tutorials/libraries-3.md deleted file mode 100644 index a5edd4f259d..00000000000 --- a/Tutorials/libraries-3.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Libraries processes & ELF loading -tutorial: libraries-3 -layout: tutorial -description: process management with seL4_libs -nav_prev: libraries-2.html -nav_next: libraries-4.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} diff --git a/Tutorials/libraries-4.html b/Tutorials/libraries-4.html new file mode 100644 index 00000000000..681a99b1936 --- /dev/null +++ b/Tutorials/libraries-4.html @@ -0,0 +1,804 @@ + + + + + + + Libraries timer tutorial | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/libraries-4.md b/Tutorials/libraries-4.md deleted file mode 100644 index 59a1ca0cc64..00000000000 --- a/Tutorials/libraries-4.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Libraries timer tutorial -tutorial: libraries-4 -layout: tutorial -description: timers and timeouts with seL4_libs -nav_prev: libraries-3.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} diff --git a/Tutorials/mapping.html b/Tutorials/mapping.html new file mode 100644 index 00000000000..728ae264f94 --- /dev/null +++ b/Tutorials/mapping.html @@ -0,0 +1,870 @@ + + + + + + + Mapping | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/mapping.md b/Tutorials/mapping.md deleted file mode 100644 index 604cc4c8fbf..00000000000 --- a/Tutorials/mapping.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Mapping -tutorial: mapping -layout: tutorial -description: virtual memory in seL4 -nav_prev: untyped.html -nav_next: threads.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} diff --git a/Tutorials/mcs.html b/Tutorials/mcs.html new file mode 100644 index 00000000000..0af8548afcd --- /dev/null +++ b/Tutorials/mcs.html @@ -0,0 +1,1041 @@ + + + + + + + MCS | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/mcs.md b/Tutorials/mcs.md deleted file mode 100644 index 431a4f361ad..00000000000 --- a/Tutorials/mcs.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: MCS -tutorial: mcs -layout: tutorial -description: An introduction to the seL4 MCS extensions. -nav_prev: fault-handlers.html -nav_next: seL4-end.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} diff --git a/Tutorials/notifications.html b/Tutorials/notifications.html new file mode 100644 index 00000000000..4bf94a49bcb --- /dev/null +++ b/Tutorials/notifications.html @@ -0,0 +1,828 @@ + + + + + + + Notifications | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/notifications.md b/Tutorials/notifications.md deleted file mode 100644 index 49f54183149..00000000000 --- a/Tutorials/notifications.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Notifications -tutorial: notifications -layout: tutorial -description: using notification objects and signals -nav_prev: ipc.html -nav_next: interrupts.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} diff --git a/Tutorials/pathways.html b/Tutorials/pathways.html new file mode 100644 index 00000000000..f985becebd8 --- /dev/null +++ b/Tutorials/pathways.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/Tutorials/pathways.md b/Tutorials/pathways.md deleted file mode 100644 index cb192ad520b..00000000000 --- a/Tutorials/pathways.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -redirect_to: /Tutorials/index.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- diff --git a/Tutorials/seL4-end.html b/Tutorials/seL4-end.html new file mode 100644 index 00000000000..78bc96ac7b1 --- /dev/null +++ b/Tutorials/seL4-end.html @@ -0,0 +1,720 @@ + + + + + + + End of the seL4 Tutorial | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/seL4-end.md b/Tutorials/seL4-end.md deleted file mode 100644 index 3551f27d2f6..00000000000 --- a/Tutorials/seL4-end.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -layout: tutorial -nav_prev: mcs.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# End of the seL4 Tutorial - -## That's all for the seL4 kernel tutorial. - -You might want to check out some of the following tutorials as well. - -
- {% include card.html - icon="puzzle-piece" - title="Microkit tutorial" - body="Tutorial on building static systems on Microkit. Building a simple Wordle server with drivers and a VM." - link="/projects/microkit/tutorial/welcome.html" - %} - {% include card.html - icon="other/C" - title="C library tutorials" - body="Tutorials on the no-assurance C prototyping libraries for seL4. Initialisation, threading, ELF loading." - link="/Tutorials/libraries-1.html" - %} - {% include card.html - icon="other/rust-logo-blk" - title="Rust on seL4 tutorial" - body="Tutorial on running the Rust language on seL4." - link="/projects/rust/tutorial/introduction.html" - %} - {% include card.html - icon="puzzle-piece" - title="CAmkES tutorial" - body="Tutorials for the CAmkES component framework." - link="/Tutorials/hello-camkes-0.html" - %} -
diff --git a/Tutorials/setting-up.html b/Tutorials/setting-up.html new file mode 100644 index 00000000000..e68ccadd820 --- /dev/null +++ b/Tutorials/setting-up.html @@ -0,0 +1,712 @@ + + + + + + + Setting up your machine | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/setting-up.md b/Tutorials/setting-up.md deleted file mode 100644 index 5acb134508f..00000000000 --- a/Tutorials/setting-up.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -layout: tutorial -description: guide to machine set-up for tutorials -nav_next: get-the-tutorials.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Setting up your machine - -## Welcome to the seL4 tutorials! - -The first step is to set up your machine with the development tools that the -tutorials will use. - -## Google's Repo tool - -The primary way of obtaining and managing seL4 project sources is through the use of Google's Repo tool. - -To install run: -```sh - sudo apt-get update - sudo apt-get install repo -``` - -
-More on Repo - -[More details about on installing Repo](https://gerrit.googlesource.com/git-repo#install). - -[seL4 Repo cheatsheet](../projects/buildsystem/repo-cheatsheet.html) -
- -## Docker - -To compile and use seL4, it is recommended that you use Docker to isolate the dependencies from your machine. - -These instructions assume you are using Debian (or a derivative, such as Ubuntu), and are using Bash for your shell. However, it should be informative enough for users of other distros/shells to adapt. - -These instructions are intended for Ubuntu LTS versions 20.04 and 22.04. - -To begin, you will need at least these two programs: - - * make (`sudo apt install make`) - * docker (See [Docker Engine - Installation](https://docs.docker.com/engine/installation) for installation - instructions or the [get.docker.com](https://get.docker.com) script. - You can also install [Docker Desktop](https://docs.docker.com/get-started/get-docker/)). - -For convenience, add your account to the docker group: - -```bash -sudo usermod -aG docker $(whoami) -``` - -
- More on Docker - - **Available images** - - All the prebuilt docker images are available on [DockerHub here](https://hub.docker.com/u/trustworthysystems) - - These images are used by the Trustworthy Systems Continuous Integration (CI) software, and so represent a standard software setup we use. - The CI software always uses the `latest` docker image, but images are also tagged with the date they were built. - - **More information** - - You can find the dockerfiles and supporting Makefile [here](https://github.com/seL4/seL4-CAmkES-L4v-dockerfiles) - -
- - -### Getting a build environment -To get a running build environment for seL4 and CAmkES, run: - -```bash -git clone https://github.com/seL4/seL4-CAmkES-L4v-dockerfiles.git -cd seL4-CAmkES-L4v-dockerfiles -make user -``` - -This will give you a terminal inside a container that has all the relevant tools to build, simulate, and test seL4 & CAmkES programs. - -The first time you run this, docker will fetch the relevant images, which may take a while. - -The last line will say something like: - -``` -Hello, welcome to the seL4/CAmkES/L4v docker build environment -``` - -### Mapping a container -To run the container from other directories (e.g. starting a container for the [Hello World](hello-world.md) tutorial, which we'll do next), you can setup a bash alias such as this: - -```bash -echo $'alias container=\'make -C ///seL4-CAmkES-L4v-dockerfiles user HOST_DIR=$(pwd)\'' >> ~/.bashrc -# now open a new terminal, or run `source ~/.bashrc` -``` - -Replace `///` to match where you cloned the git repo of the docker files. - -*Reminder:* Include the absolute path to your `seL4-CAmkES-L4v-dockerfiles` folder, e.g. - -```bash -echo $'alias container=\'make -C /~/seL4-CAmkES-L4v-dockerfiles user HOST_DIR=$(pwd)\'' >> ~/.bashrc -# now open a new terminal, or run `source ~/.bashrc` - -``` - -This then allows you to run `container` from any directory. - -*Reminder:* start a new terminal for the changes in `.bashrc` to take effect or run `source ~/.bashrc`. - - -## An example workflow - -A good workflow is to run two terminals: - - - Terminal A is just a normal terminal, and is used for git operations, editing (e.g., vim, emacs, vscode), and other non-build operations. - - Terminal B is running in a container, and is only used for compilation. - -This gives you the flexibility to use all the normal tools you are used to, while having the seL4 dependencies separated from your machine. - -### Compiling seL4 test - -Start two terminals (terminal A and terminal B). - -In terminal A, run these commands: - -```bash -jblogs@host:~$ mkdir ~/seL4test -jblogs@host:~$ cd ~/seL4test -jblogs@host:~/seL4test$ repo init -u https://github.com/seL4/seL4test-manifest.git -jblogs@host:~/seL4test$ repo sync -``` - -In terminal B, run these commands: - -```bash -jblogs@host:~$ cd ~/seL4test -jblogs@host:~/seL4test$ container # using the bash alias defined above -jblogs@in-container:/host$ mkdir build-x86 -jblogs@in-container:/host$ cd build-x86 -jblogs@in-container:/host/build-x86$ ../init-build.sh -DPLATFORM=x86_64 -DSIMULATION=TRUE -jblogs@in-container:/host/build-x86$ ninja -jblogs@in-container:/host/build-x86$ ./simulate -``` - -If you need to make any code modifications or commit things to git, use terminal A. If you need to recompile or simulate an image, use terminal B. - -`./simulate` is run using [QEMU](https://www.qemu.org/), and will take a few minutes to run. If QEMU works, you'll see something like - -``` -Test suite passed. 121 tests passed. 57 tests disabled. -All is well in the universe -``` - -Note, if QEMU fails when trying to simulate the image, try configuring your Docker host to give the container more memory using [Docker Desktop](https://docs.docker.com/desktop/use-desktop/). - -That's it! seL4 is running. - -To quit QEMU: `Ctrl+a, x` diff --git a/Tutorials/threads.html b/Tutorials/threads.html new file mode 100644 index 00000000000..ba8bfa3eff6 --- /dev/null +++ b/Tutorials/threads.html @@ -0,0 +1,1131 @@ + + + + + + + Threads | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/threads.md b/Tutorials/threads.md deleted file mode 100644 index b5fa3f3b7a1..00000000000 --- a/Tutorials/threads.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Threads -tutorial: threads -layout: tutorial -description: how to start a thread using the seL4 API -nav_prev: mapping.html -nav_next: ipc.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} diff --git a/Tutorials/untyped.html b/Tutorials/untyped.html new file mode 100644 index 00000000000..84ed421be58 --- /dev/null +++ b/Tutorials/untyped.html @@ -0,0 +1,993 @@ + + + + + + + Untyped | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + + + +
+
+ + + +
+ +
+
+ + diff --git a/Tutorials/untyped.md b/Tutorials/untyped.md deleted file mode 100644 index 5537107f8d4..00000000000 --- a/Tutorials/untyped.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Untyped -tutorial: untyped -layout: tutorial -description: user-level memory management -nav_prev: capabilities.html -nav_next: mapping.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -{% include tutorial.md %} diff --git a/VM/CAmkESVMCentOS.html b/VM/CAmkESVMCentOS.html new file mode 100644 index 00000000000..d3fbd6dfb04 --- /dev/null +++ b/VM/CAmkESVMCentOS.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/VM/CAmkESX86VM.html b/VM/CAmkESX86VM.html new file mode 100644 index 00000000000..88ec105e289 --- /dev/null +++ b/VM/CAmkESX86VM.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/VM/index.html b/VM/index.html new file mode 100644 index 00000000000..ffcbcc22104 --- /dev/null +++ b/VM/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/VerifiedConfigurations.html b/VerifiedConfigurations.html new file mode 100644 index 00000000000..67c120b24d6 --- /dev/null +++ b/VerifiedConfigurations.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/VisualCAmkES/index.html b/VisualCAmkES/index.html new file mode 100644 index 00000000000..c0a3d916f13 --- /dev/null +++ b/VisualCAmkES/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/_config.yml b/_config.yml deleted file mode 100644 index f0aae9320f8..00000000000 --- a/_config.yml +++ /dev/null @@ -1,124 +0,0 @@ -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. -# SPDX-License-Identifier: BSD-2-Clause -# -# Welcome to Jekyll! -# -# This config file is meant for settings that affect your whole blog, values -# which you are expected to set up once and rarely edit after that. If you find -# yourself editing this file very often, consider using Jekyll's data files -# feature for the data you need to update frequently. -# -# For technical reasons, this file is *NOT* reloaded automatically when you use -# 'bundle exec jekyll serve'. If you change this file, please restart the server process. - -# Site settings -# These are used to personalize your new site. If you look in the HTML files, -# you will see them accessed via {{ site.title }}, {{ site.email }}, and so on. -# You can create any custom variable you would like, and they will be accessible -# in the templates via {{ site.myvariable }}. -title: seL4 docs - -baseurl: "" # the subpath of your site, e.g. /blog - -git_repo: https://github.com/seL4/docs -url: "https://docs.sel4.systems" -static_url: "https://docs.sel4.systems" - -description: "This site is for displaying seL4 related documentation. Pull requests are welcome." -github_username: "sel4" - -collections_dir: content_collections - -collections: - releases: - output: true - updates: - output: true - status: - output: true - -sel4: "14.0.0" -camkes: "camkes-3.11.1" -capdl: "0.4.0" -microkit: "2.1.0" - -# Front matter defaults: -defaults: - - scope: - path: "" - type: releases - values: - layout: "release" - - scope: - path: "" - type: updates - values: - layout: "release" - - scope: - path: "" - values: - layout: "default" - - -# Build/plugin settings. These settings configure plugins. -# Themes and plugins transparently add files to the site project. To see what plugins -# are being used run `bundle show`. To see what files are contributed by each plugin: -# ls `bundle show $plugin_name` -markdown: Kramdown - -plugins: - # Sets the page title to the first heading. Removes need for title to be set in every file - - jekyll-titles-from-headings - # Converts markdown relative links to valid html urls. - - jekyll-relative-links - # Default includes .md files to be templated without needing the --- front matter. - - jekyll-optional-front-matter - # Adds a sitemap.xml to site for webcrawlers - - jekyll-sitemap - # Adds a table of contents to top of page if toc: true is set in the front matter. - - jekyll-toc - # Allow multiple urls to redirect to a single page - - jekyll-redirect-from - # For tailwind postcss - - jekyll-postcss-v2 - # For icons - - jekyll-inline-svg - -toc: - min_level: 2 # default: 1 - max_level: 5 # default: 6 - -kramdown: - input: GFM - -breadcrumbs: - root: - hide: false # show breadcrumbs on root/home page - image: false # Show image or title text - -optional_front_matter: -# Set this to false if you want .md files to be accessible also - remove_originals: true - -# Exclude files from processing. dotfiles don't seem to be included by default -exclude: - - Gemfile - - Gemfile.lock - - dependencies - - Makefile - - README.md - - LICENSES/ - - tools/ - - package.json - - postcss.config.js - - package-lock.json - - node_modules/ - - "**/*.license" - - .github/ - - .reuse/ - - _processed/ - - vendor/ - - _repos/ - -keep_files: - - projects/rust/tutorial diff --git a/_data/maintained.yml b/_data/maintained.yml deleted file mode 100644 index b6d53576af8..00000000000 --- a/_data/maintained.yml +++ /dev/null @@ -1,59 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -github: - - name: seL4 - repos: - - l4v - - seL4 - - seL4_tools - - seL4_libs - - seL4-CAmkES-L4v-dockerfiles - - musllibc - - util_libs - - sel4test - - sel4bench - - sel4bench-manifest - - sel4test-manifest - - sel4-tutorials - - sel4-tutorials-manifest - - seL4-CAmkES-L4v-dockerfiles - - seL4_projects_libs - - global-components - - cakeml_libs - - capdl - - camkes - - camkes-manifest - - camkes-tool - - camkes-vm - - camkes-vm-apps - - camkes-vm-examples - - camkes-vm-examples-manifest - - camkes-vm-linux - - camkes-vm-images - - rumprun-sel4-demoapps - - rumprun-packages - - pruner - - verification-manifest - - projects_libs - - sel4webserver - - sel4webserver-manifest - - sel4runtime - - rumprun - - graph-refine - - picotcp - - picotcp-bsd - - isabelle - - HOL - - polyml - - repo_projects: - - sel4test-manifest - - sel4bench-manifest - - camkes-manifest - - camkes-vm-examples-manifest - - sel4webserver-manifest - - sel4-tutorials-manifest - - rumprun-sel4-demoapps - - verification-manifest - diff --git a/_data/projects/buildsystem.yml b/_data/projects/buildsystem.yml deleted file mode 100644 index a35b0a66f75..00000000000 --- a/_data/projects/buildsystem.yml +++ /dev/null @@ -1,12 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: buildsystem -display_name: seL4 Buildsystem -description: System configuration and building using mostly CMake -project_order: 5 -repositories: - - org: sel4 - repo: sel4 - - org: sel4 - repo: sel4_tools diff --git a/_data/projects/camkes-vm.yml b/_data/projects/camkes-vm.yml deleted file mode 100644 index 66f70ffd6a0..00000000000 --- a/_data/projects/camkes-vm.yml +++ /dev/null @@ -1,180 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: camkes-vm -display_name: camkes-vm -description: x86 or Arm Virtual Machine build as a CAmkES component -project_order: 8 - -repositories: - - org: seL4 - repo: camkes-vm - - org: seL4 - repo: camkes-vm-examples - - org: seL4 - repo: camkes-vm-examples-manifest - - -components: - - name: odroid_vm - display_name: odroid_vm - description: "Legacy exynos5410 flight computer application." - maintainer: "maintainer wanted" - status: "active" - component_type: camkes-arm-vm-application - - name: vm_minimal - display_name: vm_minimal - description: "A simple VMM application, launching a single guest Linux with a buildroot RAM-based file system" - maintainer: "maintainer wanted" - status: "active" - component_type: camkes-arm-vm-application - - name: vm_cross_connector - display_name: vm_cross_connector - description: "Application demonstrating communication between a Linux guest user-level process and a native seL4 component. This leveraging cross vm communication channels established between the VMM and the seL4 component" - maintainer: "maintainer wanted" - status: "active" - component_type: camkes-arm-vm-application - - name: vm_multi - display_name: vm_multi - description: "Application demonstrating running multiple guest VM's. This is achieved through having multiple VMM components, each managing a single Linux guest (1-1 model)." - maintainer: "maintainer wanted" - status: "active" - component_type: camkes-arm-vm-application - - name: vm_serial_server - display_name: vm_serial_server - description: "Application demonstrating the use of Virtio Console, where a VM's serial I/O is forwarded to/from a serial server." - maintainer: "maintainer wanted" - status: "active" - component_type: camkes-arm-vm-application - - name: vm_virtio_net - display_name: vm_virtio_net - description: "Application demonstrating the use of Virtio Net, where a virtual network interface is presented to a VM and subsequent network traffic on the virtual network interface is sent to/from other native seL4 components." - maintainer: "maintainer wanted" - status: "active" - component_type: camkes-arm-vm-application - - name: camkes-arm-vm-component - display_name: "camkes-arm-vm VM component" - description: "CAmkES `VM` component that contains a VMM + guest instance" - maintainer: "maintainer wanted" - status: "active" - component_type: camkes-arm-vm-application - - name: camkes-connector-seL4VMDTBPassthrough - display_name: "seL4VMDTBPassthrough" - description: "CAmkES connector for specifying nodes of a device tree for VM device passthrough." - maintainer: "maintainer wanted" - status: "active" - component_type: camkes-connector - - name: libvirtio - display_name: "libvirtio" - description: "Utility library for installing virtio devices (virtio-cons, virtio-net) from VM modules." - maintainer: "maintainer wanted" - status: "active" - component_type: camkes-arm-vm-library - - name: exynos5410_init - display_name: exynos5410_init - description: "Platform init VMM module for exynos5410" - maintainer: "maintainer wanted" - status: "active" - component_type: camkes-arm-vmm-module - - name: tk1_init - display_name: tk1_init - description: "Platform init VMM module for tk1" - maintainer: "maintainer wanted" - status: "active" - component_type: camkes-arm-vmm-module - - name: device_fwd - display_name: device_fwd - description: "tk1 module for installing virtual UART and Clock/Reset devices that forward access to a separate CAmkES component." - maintainer: "maintainer wanted" - status: "active" - component_type: camkes-arm-vmm-module - - name: map_frame_hack - display_name: map_frame_hack - description: "VMM module from SMACCM project to provide an insecure shared memory connection between a VM and untrusted CAmkES component for insecure system demonstration." - maintainer: "maintainer wanted" - status: "active" - component_type: camkes-arm-vmm-module - - name: virtio_con - display_name: virtio_con - description: "VMM module for installing virtio console device into guest with backend provided by connection to a CAmkES serial server component." - maintainer: "maintainer wanted" - status: "active" - component_type: camkes-arm-vmm-module - - name: virtio_net_arping - display_name: virtio_net_arping - description: "VMM module for installing a test virtio-net device into guest which only responds to arping requests." - maintainer: "maintainer wanted" - status: "active" - component_type: camkes-arm-vmm-module - - name: virtio_net_virtqueue - display_name: virtio_net_virtqueue - description: "VMM module for installing a virtio-net device into the guest backed by virtqueues for sending and receiving ethernet packets between a separate CAmkES component." - maintainer: "maintainer wanted" - status: "active" - component_type: camkes-arm-vmm-module - - name: libvirtio - display_name: "libvirtio" - description: "Utility library for installing virtio devices (virtio-cons, virtio-net) from VM modules." - maintainer: "maintainer wanted" - status: "active" - component_type: camkes-connector - - name: Findcamkes-arm-vm - display_name: "Findcamkes-arm-vm" - description: "CMake module for camkes-arm-vm components" - maintainer: "maintainer wanted" - status: "active" - component_type: cmake-module - - name: arm_vmConfig - display_name: "arm_vm Configuration library" - description: "Configuration library containing camkes-arm-vm build configuration values." - maintainer: "maintainer wanted" - status: "active" - component_type: config-library - - name: linux - display_name: linux - description: "exynos5410 Linux kernel guest image." - maintainer: "maintainer wanted" - status: "active" - component_type: guest-vm-kernel-image - - name: linux-secure-dtb - display_name: linux-secure-dtb - description: "exynos5410 device tree binary (dtb) for Linux kernel guest image." - maintainer: "maintainer wanted" - status: "active" - component_type: guest-vm-device-tree - - name: linux-secure-vusb-dtb - display_name: linux-secure-vusb-dtb - description: "exynos5410 device tree binary (dtb) with virtual USB device for Linux kernel guest image." - maintainer: "maintainer wanted" - status: "active" - component_type: guest-vm-device-tree - - name: linux-tk1-debian - display_name: linux-tk1-debian - description: "tk1 Buildroot Linux kernel guest image for Debian distro user level installed on emmc." - maintainer: "maintainer wanted" - status: "active" - component_type: guest-vm-kernel-image - - name: linux-tk1-initrd - display_name: linux-tk1-initrd - description: "tk1 Buildroot Linux kernel guest image containing rootfs.cpio user level" - maintainer: "maintainer wanted" - status: "active" - component_type: guest-vm-kernel-image - - name: linux-tk1-nonsecured.dts - display_name: linux-tk1-nonsecured.dts - description: "tk1 device tree source (dts) with most devices given to guest to manage via device passthrough." - maintainer: "maintainer wanted" - status: "active" - component_type: guest-vm-device-tree - - name: linux-tk1-secire.dts - display_name: linux-tk1-secure.dts - description: "tk1 device tree source (dts) with most devices not given to guest vm and instead marked as disabled." - maintainer: "maintainer wanted" - status: "active" - component_type: guest-vm-device-tree - - name: rootfs-tk1.cpio - display_name: rootfs-tk1.cpio - description: "A in-memory buildroot filesystem for tk1." - maintainer: "maintainer wanted" - status: "active" - component_type: guest-vm-rootfs diff --git a/_data/projects/camkes.yml b/_data/projects/camkes.yml deleted file mode 100644 index d6726f0e0fd..00000000000 --- a/_data/projects/camkes.yml +++ /dev/null @@ -1,919 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: camkes -display_name: CAmkES -description: Component Architecture for microkernel-based Embedded Systems -useful_urls: - - label: "CAmkES Manual" - url: "/projects/camkes/manual.html" - - label: "Trustworthy Systems CAmkES project" - url: "https://trustworthy.systems/projects/TS/camkes.pml" -project_order: 3 - -repositories: - - org: sel4 - repo: camkes-tool - - org: sel4 - repo: camkes - - org: sel4 - repo: camkes-manifest - - org: sel4 - repo: global-components - - -features: - - name: assembly - display_name: Assembly - description: "An assembly is a top level component system description. It contains a complete description of a full system." - maintainer: "maintainer wanted" - status: "Supported" - component_type: adl-feature - - name: composition - display_name: Composition - description: "A container for the component and connector instantiations that form a system." - maintainer: "maintainer wanted" - status: "Supported" - component_type: adl-feature - - name: configuration - display_name: Configuration - description: "A container for describing settings. This is a syntactic element to hold the assignment of attributes for a given system.\ - It is expressed inside an assembly block." - maintainer: "maintainer wanted" - status: "Supported" - component_type: adl-feature - - name: component-definitions - display_name: Component definition - description: "A `type` of functional entity. 'Component' is used colloquially to refer to both types and instances, but in a formal sense 'component' refers only to the type." - maintainer: "maintainer wanted" - status: "Supported" - component_type: adl-feature - - name: hierarchical-components - display_name: Hierarchical components - description: "A component can contain its own composition and configuration sections that can define components and connections that are in a different namespace from the toplevel - composition and configuration namespaces. Each component instance is still a separate component. The top level component type can then select internal interfaces to export as its own interfaces." - maintainer: "maintainer wanted" - status: "Mostly supported. There are some known template bugs where a component exporting dataport interfaces is also required to have a connection to the dataport." - component_type: adl-feature - - name: grouped-components - display_name: Component Groups - description: "A `Group` combines components into a single underlying process so they share an address space. This can reduce communication costs due to reduced context switching - requirements, but components in a group are required to mutually trust each other." - maintainer: "maintainer wanted" - status: "Mostly supported. Connector implementations need to be aware that they are being used in a group component context. There are also issues with variable storage as some - global variables will be defined for each component instance in the group, and threads that call across component boundaries may access incorrect variable instances." - component_type: adl-feature - - name: hardware-components - display_name: Hardware components - description: "A hardware component represents an interface to hardware in the form of a component. Declaring a component with the hardware keyword creates a hardware component." - maintainer: "maintainer wanted" - status: "Supported" - component_type: adl-feature - - name: interfaces - display_name: Component Interfaces - description: "An abstract exposed interaction point of a component. The subcategories of interface are procedure, event and dataport." - maintainer: "maintainer wanted" - status: "Supported" - component_type: adl-feature - - name: exported-interfaces - display_name: Exported Interfaces - description: "An interface of a compound component that is not implemented by that component, but is an alias for internal instance’s interface." - maintainer: "maintainer wanted" - status: "Supported" - component_type: adl-feature - - name: optional-interfaces - display_name: Optional Interfaces - description: "Interfaces of components can be made optional using the `maybe` keyword. Optional interfaces do not need to be connected to any other interfaces." - maintainer: "maintainer wanted" - status: "Supported" - component_type: adl-feature - - name: procedure-definition - display_name: Procedure IDL - description: "An interface with function call semantics use procedures which consist of a series of methods that can be invoked independently. Procedures are defined - within the ADL which has a IDL subset for defining methods and parameters." - maintainer: "maintainer wanted" - status: "Supported" - component_type: adl-feature - - name: attributes - display_name: Attributes - description: "An attribute is a configuration option that can be set on a component, connection or procedure definition. \ - It is used to pass configuration information through to the underlying implementations." - maintainer: "maintainer wanted" - status: "Supported" - component_type: adl-feature - - name: structs - display_name: Structured attributes - description: "Attribute types support struct- and array-like declarations that support bundling and variable length attribute definitions." - maintainer: "maintainer wanted" - status: "Supported" - component_type: adl-feature - - name: attribute-defaults - display_name: Default attribute values - description: "Attribute definitions can also provide default settings. These defaults are used in the absence attribute settings." - maintainer: "maintainer wanted" - status: "Supported for component and connection attributes" - component_type: adl-feature - - name: synchronization-primitives - display_name: Synchronization Primitives - description: "CAmkES provides three primitives for intra-component mutual exclusion and synchronization. Mutexes, semaphores, and binary semaphores are declared similarly to attributes of a component definition." - maintainer: "maintainer wanted" - status: "Supported" - component_type: adl-feature - - name: includes - display_name: "`include` statements" - description: "`include` statements are used to declare source language include dependencies on component and procedure definitions. These are used when CAmkES is using types defined by another language." - maintainer: "maintainer wanted" - status: "Supported, but only used with C header files." - component_type: adl-feature - - name: connector-types - display_name: Connector definitions - description: "A type of link between instances. A connector implements the transportation for the interfaces it is connected between." - maintainer: "maintainer wanted" - status: "Supported." - component_type: adl-feature - - name: connections - display_name: Connections - description: "An instantiation of a connector. Connections connect two or more instances together via their interfaces." - maintainer: "maintainer wanted" - status: "Supported." - component_type: adl-feature - - name: imports - display_name: Imports - description: "`import` statements are used to define an assembly over multiple `.camkes` files and combine them together into a single AST." - maintainer: "maintainer wanted" - status: "Supported. It is possible to provide an import path argument to the camkes tool for where to search for files to import." - component_type: adl-feature - - name: cpreprocessor - display_name: "C-Preprocessed ADL files" - description: "The C Preprocessor is run over the ADL files before the parser starts parsing them." - maintainer: "maintainer wanted" - status: "Supported. Because of the C-Preprocessor, the ADL ignores lines starting with #. This is not a valid comment syntax." - component_type: adl-feature - - name: query-plugins - display_name: "Query syntax and plugins" - description: "The parser supports adding plugins that can provide configuration values via a setting querying syntax. A plugin is able - to respond to a query with a valid configuration value." - maintainer: "maintainer wanted" - status: "Supported. Currently only 1 plugin exists, fdtQueryEngine, for querying values out of a Flattened device tree (FDT)." - component_type: adl-feature - -# Build definitions - -components: - # - # camkes - # - - name: adder - display_name: adder - description: "A simple 'Hello world' CAmkES application which demonstrates some basics of the CAmkES framework." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: aeroplage - display_name: aeroplage - description: "A CAmkES application which implements a prototype of a previous multi-level terminal for seL4." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: alignment - display_name: alignment - description: "A CAmkES application which tests if the stack is aligned properly by crashing on an unaligned stack." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: attributes - display_name: attributes - description: "A CAmkES application which demonstrates the use of aliasing attributes." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: binary-semaphore - display_name: binary-semaphore - description: "A CAmkES application which demonstrates how to use a binary semaphore to turn an asynchronous interface into a synchronous one." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: cakeml_hello - display_name: cakeml_hello - description: "A 'Hello world' CAmkES application which demonstrates the ability to run CakeML-based CAmkES components inside CAmkES." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: cakeml_regex - display_name: cakeml_regex - description: "A CAmkES application which demonstrates the use of CakeML to implement a CAmkES component which filters data between two different components." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: cakeml_tipc - display_name: cakeml_tipc - description: "A CAmkES application which demonstrates the Transparent IPC protocol (TIPC) and the use of CakeML to implement a CAmkES component to filter data between two different CAmkES components." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: cms-donate - display_name: cms-donate - description: "A CAmkES application which demonstrates the donation of a scheduling context between a client and server via an intermediary under a Mixed Criticality Scheduling (MCS) environment." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: cs-donate - display_name: cs-donate - description: "A CAmkES application which demonstrates the donation of a scheduling context between a client and server under a Mixed Criticality Scheduling (MCS) environment." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: cs-nodonate - display_name: cs-nodonate - description: "A CAmkES application which demonstrates two CAmkES components running using their own scheduling contexts under a Mixed Criticality Scheduling (MCS) environment." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: dataport - display_name: dataport - description: "A CAmkES application which demonstrates an example of the usage of CAmkES dataports." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: debug-simple - display_name: debug-simple - description: "A CAmkES application which demonstrates the use of the seL4GDB connector to debug CAmkES components." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: dhcp - display_name: dhcp - description: "A CAmkES application which demonstrates an example DHCP server." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: dma-example - display_name: dma-example - description: "A CAmkES application which demonstrates the use of a CAmKES-allocated DMA pool." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: epit - display_name: epit - description: "A CAmkES application which demonstrates a simple hardware driver CAmkES component for the EPIT timers on the KZM platform." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: event - display_name: event - description: "A CAmkES application which demonstrates an example of CAmkES events." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: event-driven - display_name: event-driven - description: "A CAmkES application which demonstrates an example of a CAmkES event-driven application." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: exchangestring - display_name: exchangestring - description: "A CAmkES application which demonstrates how to pass string arguments between CAmkES components." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: fdtgen - display_name: fdtgen - description: "A CAmkES application which demonstrates an example on how to include a DTB blob and how to modify it." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: filter - display_name: filter - description: "A CAmkES application which demonstrates the use of a CAmkES component to filter communication between two other CAmkES components." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: global-imports - display_name: global-imports - description: "A CAmkES application which demonstrates an example of allowing CAmkES components to be globally imported using specific CMake macros." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: hellorust - display_name: hellorust - description: "A CAmkES application which demonstrates an example of running a Rust application inside CAmkES." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: hierarchical-attributes - display_name: hierarchical-attributes - description: "A CAmkES application which demonstrates an example of hierarchical attributes in CAmKES." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: hierarchical-components - display_name: hierarchical-components - description: "A CAmkES application which demonstrates an example of hierarhical CAmkES components in CAmkES." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: keyboard - display_name: keyboard - description: "A CAmkES application which demonstrates an example keyboard driver for x86 platforms." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: lockserver - display_name: lockserver - description: "A CAmkES application which demonstrates an example system which contains a CAmkES component that manages a lock." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: mcs-donate - display_name: mcs-donate - description: "A CAmkES application which demonstrates the donation of scheduling contexts betwen two clients and a server under a Mixed Criticality Scheduling (MCS) environment." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: mcs-nodonate - display_name: mcs-nodonate - description: "A CAmkES application which demonstrates the three CAmkES components running using their own scheduling contexts under a Mixed Criticality Scheduling (MCS) environment." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: multiassembly - display_name: multiassembly - description: "A CAmkES application which demonstrates the ability to have two different 'assembly' blocks." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: multiclient - display_name: multiclient - description: "A CAmkES application which demonstrates the ability to allow multiple clients to share one connection." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: multiplier - display_name: multiplier - description: "A CAmkES application which demonstrates an example of using arrays as arguments for RPC functions between CAmkES components." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: mutex - display_name: mutex - description: "A CAmkES application which demonstrates the use of user-defined connectors in CAmkES to implement a lock." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: periodic - display_name: periodic - description: "A CAmkES application which demonstrates the periodic timeslices of CAmkES components under a Mixed Criticality Scheduling (MCS) environment." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: picoserver - display_name: picoserver - description: "A CAmkES application which demonstrates a simple networking example which uses the PicoServer in the global-components repository." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: pit - display_name: pit - description: "A CAmkES application which demonstrates a timer driver CAmkES component for the Programmable Interval Timer on x86 platforms." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: reversestring - display_name: reversestring - description: "A CAmkES application which demonstrates dataport release and acquire semantics." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: rotate - display_name: rotate - description: "A CAmkES application which demonstrates the use of user-defined types as arguments of a RPC interface." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: RPCOverMultiSharedData - display_name: RPCOverMultiSharedData - description: "A CAmkES application which demonstrates the use of the seL4RPCOverMultiSharedData connector to perform RPC using shared memory buffers between the client and server." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: rumprun_ethernet - display_name: rumprun_ethernet - description: "A CAmkES application which demonstrates a single TCP echo program that runs in a Rumprun unikernel instance on CAmkES." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: rumprun_pthreads - display_name: rumprun_pthreads - description: "A CAmKES application which demonstrates a simple pthreads program that runs in a Rumprun unikernel instance on CAmKES." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: rumprun_rust - display_name: rumprun_rust - description: "A CAmkES application which demonstrates a simple Rust 'Hello world' program that runs in a Rumprun unikernel instance on CAmkES." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: serialserver - display_name: serialserver - description: "A CAmkES application which demonstrates the use of the SerialServer component in the global-components repository." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: serialserver_loopback - display_name: serialserver_loopback - description: "A CAmkES application which demonstrates the use of the SerialServer component in the global-components repository looping back characters that it reads in from the serial device." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: simple - display_name: simple - description: "A CAmkES application which demonstrates an example of a CAmkES RPC connection." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: simplesingleaddressspace - display_name: simplesingleaddressspace - description: "A CAmkES application which demonstrates an example of a single address space CAmkES system which contains a RPC connection between its two components." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: socket - display_name: socket - description: "A CAmkES application which demonstrates a user-defined dataport." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: structs - display_name: structs - description: "A CAmkES application which demonstrates the use of structs and arrays for CAmkES component attribute types." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: swapcounter - display_name: swapcounter - description: "A CAmkES application which was used for demonstration purposes for a paper submission to Formal Methods 2015 but has since been modified." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: terminal - display_name: terminal - description: "A CAmkES application which serves as a prototype for a secure terminal system." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testbufvariant - display_name: testbufvariant - description: "A CAmkES application which is used to test dataports." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testcamkes438 - display_name: testcamkes438 - description: "A CAmkES application that is used to test a specific function of the CAmkES framework." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testcontrolname - display_name: testcontrolname - description: "A CAmkES application that is used to test if interfaces could be named with a particular suffix." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testdataportbifurcate - display_name: testdataportbifurcate - description: "A CAmkES application that tests if we can have multiple dataports within a single component that maps to the same underlying physical memory." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testdataportmux - display_name: testdataportmux - description: "A CAmkES application that tests the ability to have multiple CAmkES components connected to the same dataport." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testdataportmuxflat - display_name: testdataportmuxflat - description: "A CAmkES application that tests the ability to have N-to-M dataport connections in a single address space." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testdataportptrwrap - display_name: testdataportptrwrap - description: "A CAmkES application that tests if dataport pointer wrapping and unwrapping functionality works on multiplexed dataports." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testdataportrpc - display_name: testdataportrpc - description: "A CAmkES application that tests if we can back an seL4RPCCall connection with various types of dataports." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testfaulthandlers - display_name: testfaulthandlers - description: "A CAmkES application that tests if the fault handlers work correctly as intended." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testgrouping - display_name: testgrouping - description: "A CAmkES application which tests for the various edge cases in grouping CAmkES components into single address spaces." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testgroupingcontrol - display_name: testgroupingcontrol - description: "A CAmkES application which tests whether CAmkES components with a control thread work correctly when grouped in a single address spaces." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testhardwareinterrupt - display_name: testhardwareinterrupt - description: "A CAmkES application which tests if an application containing an seL4HardwareInterrupt successfully compiles." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testhwdataportlrgpages - display_name: testhwdataportlrgpages - description: "A CAmkES application which tests whether or not large pages will be used to back a large dataport." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testnto1mmio - display_name: testnto1mmio - description: "A CAmkES application that tests if an N-to-1 MMIO connection to a piece of hardware functions correctly." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testnto1overload - display_name: testnto1overload - description: "A CAmKES application that tests if N-to-1 connections involving multiple ends from a single CAmkES component uses distinct caps." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testrefin - display_name: testrefin - description: "A CAmKES application that tests the 'refin' parameter function in CAmkES procedure interfaces." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testreplycapprotection - display_name: testreplycapprotection - description: "A CAmkES application that tests the reply cap protection functionality." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testsel4notification - display_name: testsel4notification - description: "A CAmkES application that tests the seL4Notification connector." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testsingleaddressspaceheap - display_name: testsingleaddressspaceheap - description: "A CAmkES application that tests that the heaps of CAmkES components that share a single address space do not overlap." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: teststringarrays - display_name: teststringarrays - description: "A CAmkES application that tests some unusual usages of string array parameters in procedure interfaces." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testsyscalls - display_name: testsyscalls - description: "A CAmkES application that serves as a testing sandbox for POSIX syscall functionality on CAmkES." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: testunderscorename - display_name: testunderscorename - description: "A CAmkES application that tests if CAmkES components can have interface names prefixed with an underscore." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: timeserver - display_name: timeserver - description: "A CAmkES application which demonstrates the use of the TimeServer componen fromthe global-components repository." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: uart - display_name: uart - description: "A CAmkES application which demonstrates a UART driver CAmkES component for the KZM platform." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - - name: vgatest - display_name: vgatest - description: "A CAmkES application which demonstrates a minimal implementation for a text mode VGA terminal." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-application - # - # global-components - # - - name: ClockServer - display_name: ClockServer - description: "A CAmkES component which abstracts over and multiplexes client accesses to clock devices on a platform." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-component - - name: Ethdriver - display_name: Ethdriver - description: "A CAmkES component which abstracts over and multiplexes client accesses to an Ethernet device." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-component - - name: FileServer - display_name: FileServer - description: "A CAmkES component which abstracts over and multiplexes client accesses to a CPIO-based file system." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-component - - name: GPIOMUXServer - display_name: GPIOMUXServer - description: "A CAmkES component which abstracts over and multiplexes client accesses to a GPIO and pin multiplexer controller." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-component - - name: PCIConfigIO - display_name: PCIConfigIO - description: "A CAmkES component which abstracts over and multiplexes client accesses to the PCI configuration space of a platform." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-component - - name: PicoServer - display_name: PicoServer - description: "A CAmkES component which abstracts over and multiplexes client accesses to an IP stack, specifically, the PicoTCP TCP/IP stack." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-component - - name: ResetServer - display_name: ResetServer - description: "A CAmkES component which abstracts over and multiplexes client accesses to a reset line controller." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-component - - name: RTC - display_name: RTC - description: "A CAmkES component which abstracts over and multiplexes client accesses to a real-time clock device." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-component - - name: SerialServer - display_name: SerialServer - description: "A CAmkES component which abstracts over and multiplexes client accesses to a serial device." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-component - - name: TimeServer - display_name: TimeServer - description: "A CAmkES component which abstracts over and multiplexes client accesses to a timer device." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-component - - name: VirtQueue - display_name: VirtQueue - description: "A stub CAmkES component which is used to help initialise virtqueue connections." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-component - - name: camkes-connector-seL4Ethdriver - display_name: seL4Ethdriver - description: "CAmkES connector which is used to connect clients to the Ethdriver component's procedure interface." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4GlobalAsynchCallback - display_name: seL4GlobalAsynchCallback - description: "CAmkES connector which is used to make the underlying seL4 notification\ - capability available to the consuming side of the Event interface. \ - This also allows the coupling of callback function that is called upon\ - receiving an Event." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4GlobalAsync - display_name: seL4GlobalAsync - description: "CAmkES connector which is used to make the underlying seL4 notification capability available to the consuming side of the Event interface." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4MessageQueue - display_name: seL4MessageQueue - description: "CAmkES connector which allows the sending and queueing of user-defined messages from one component to another." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4MultiSharedData - display_name: seL4MultiSharedData - description: "CAmkES connector which allows multiple dataports to be connected to a single components and also provides multiplexed access across the dataports." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4RPCCallSignal - display_name: seL4RPCCallSignal - description: "CAmkES connector which bundles a procedure interface with an event interface." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4RPCDataport - display_name: seL4RPCDataport - description: "CAmkES connector which bundles a procedure interface with a dataport interface." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4RPCDataportSignal - display_name: seL4RPCDataportSignal - description: "CAmkES connector which bundles a procedure interface, event interface, and a dataport interface." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4RPCOverMultiSharedData - display_name: seL4RPCOverMultiSharedData - description: "CAmkES connector which uses shared memory to transfer data instead of the IPC buffer for procedure interfaces." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4SharedDataWithCaps - display_name: seL4SharedDataWithCaps - description: "CAmkES connector which allocates a shared memory region between components and also exposes the underlying frame caps." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4VirtQueues - display_name: seL4VirtQueues - description: "CAmkES connector which initialises a virtqueue connection between two components." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: Findglobal-components - display_name: Findglobal-components - description: "CMake module for including the global-components components." - maintainer: "maintainer wanted" - status: "Supported" - component_type: cmake-module - # - # camkes-tool - # - - name: camkes - display_name: camkes - description: "The implementation of the CAmkES framework." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-implementation - - name: libsel4camkes - display_name: libsel4camkes - description: "Supporting library for CAmkES components to access and manipulate CAmkES-allocated resources." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-library - - name: libcamkescakeml - display_name: libcamkescakeml - description: "Utility library for CakeML-based CAmkES components that contains functions and interfaces to allow interaction with a CAmkES system." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-library - - name: pc99-Serial - display_name: Serial - description: "Stub hardware CAmkES component that abstracts over a pc99-based serial device." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-component - - name: pc99-Pit - display_name: PIT - description: "Stub hardware CAmkES component that abstracts over the x86 Programmable Interval Timer." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-component - - name: camkes-connector-seL4DirectCall - display_name: "seL4DirectCall" - description: "Used for RPC interfaces between grouped components. Each call becomes a direct function call." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4Notification - display_name: "seL4Notification" - description: "Event connector where an seL4 Notification object is used for sending events. On the receiving end, a callback handler can be registerd or a thread can block waiting for events." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4NotificationBind - display_name: "seL4NotificationBind" - description: "Similar event connector to seL4Notification but the receiver has bound the Notification to its TCB." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4NotificationNative - display_name: "seL4NotificationNative" - description: "Similar event connector to seL4Notification but the receiver end can only call Poll or Wait on notification object." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4NotificationQueue - display_name: "seL4NotificationQueue" - description: "seL4Endpoint object is used to queue notifications so that if the sender is sending faster than the receiver is receiving, unreceived events will accumulate in a counter." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4RPCCall - display_name: "seL4RPCCall" - description: "Used for RPC interfaces where parameters will be marshalled into and out of IPC buffers and calls ocurr over seL4Endpoint objects." - maintainer: "maintainer wanted" - status: "Supported. There is also a CakeML implementation for the receiving end." - component_type: camkes-connector - - name: camkes-connector-seL4DTBHardware - display_name: "seL4DTBHardware" - description: "Hardware connector to hardware component specified by a Device tree node. This will extract MMIO and potentially IRQ information for creating connections to the component." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4RPCCallNoType - display_name: "seL4RPCCallNoType" - description: "seL4 RPCCall connector but without requirement of single procedure interface. This allows a single receiver thread to handle multiple senders with different interfaces." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4SharedData - display_name: "seL4SharedData" - description: "seL4 Dataport connector. Creates a shared memory connection between components." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4HardwareMMIO - display_name: "seL4HardwareMMIO" - description: "seL4 Dataport connector to MMIO region. Creates a MMIO mapping for device registers into a component." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4HardwareIOPort - display_name: "seL4HardwareIOPort" - description: "seL4 Procedure connector for x86 IOPorts. Provides functions for performing IOPort instructions via seL4 invocations." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4HardwareInterrupt - display_name: "seL4HardwareInterrupt" - description: "seL4 event connector for hardware interrupts. Provides interface for polling or blocking on interrupts and also for acknowledging IRQs." - maintainer: "maintainer wanted" - status: "Supported" - component_type: camkes-connector - - name: camkes-connector-seL4IOAPICHardwareInterrupt - display_name: "seL4IOAPICHardwareInterrupt" - description: "seL4 event connector for IOAPIC hardware interrupts. Specialised connector for dealing with IOAPIC interrupts." - maintainer: "maintainer wanted" - status: "Supported on x86" - component_type: camkes-connector - - - - name: Findcamkes-tool - display_name: Findcamkes-tool - description: "CMake module for including the camkes-tool components." - maintainer: "maintainer wanted" - status: "Supported" - component_type: cmake-module - # Manifests - - name: master.xml - display_name: master.xml - description: "CAmkES project manifest with all repositories from master branches." - maintainer: "maintainer wanted" - status: "Supported. Updated whenever project repository structure changes." - component_type: repo-manifest - - name: default.xml - display_name: default.xml - description: "CAmkES project manifest with all repositories pinned to last versions that passed all tests." - maintainer: "maintainer wanted" - status: "Supported. This gets updated automatically by continuous integration." - component_type: repo-manifest - - - -configurations: - - name: CAMKES_APP - display_name: "CAMKES_APP (STRING)" - description: "CAmkES application to build" - maintainer: "maintainer wanted" - status: "(Default: adder)" - component_type: camkes-option - - name: SIMULATION - display_name: "SIMULATION (BOOL)" - description: "Try and use simulable features" - maintainer: "maintainer wanted" - status: "(Default: ON)" - component_type: camkes-option - - name: RELEASE - display_name: "RELEASE (BOOL)" - description: "Performance optimized build" - maintainer: "maintainer wanted" - status: "(Default: OFF)" - component_type: camkes-option - - name: PLATFORM - display_name: "PLATFORM (STRING)" - description: "Platform to use" - maintainer: "maintainer wanted" - status: "(Default: x86_64)" - component_type: camkes-option diff --git a/_data/projects/capdl.yml b/_data/projects/capdl.yml deleted file mode 100644 index b9b66b11181..00000000000 --- a/_data/projects/capdl.yml +++ /dev/null @@ -1,173 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: capdl -display_name: CapDL -description: Collection of tools for generating, parsing and loading capdl specifications of systems -project_order: 4 - -repositories: - - org: seL4 - repo: capdl - -components: - # - # capdl-loader-app - # - - name: capdl-loader-app - display_name: capdl-loader-app - description: "The capDL initialiser for seL4." - maintainer: "seL4 Foundation" - status: "active" - component_type: capdl-loader-app - - # - # python-capdl-tool - # - - name: capdl - display_name: capdl - description: "The source code of the Python CapDL module." - maintainer: "seL4 Foundation" - status: "active" - component_type: python-capdl-tool - - # - # python-capdl-tool-example - # - - name: allocation - display_name: allocation - description: "The module contains an object and CSpace allocator. This example shows how these can be used for convenience." - status: "active" - component_type: python-capdl-tool-example - - - name: capdl-manipulation - display_name: capdl-manipulation - description: "An example of how to use the Python CapDL module" - status: "active" - component_type: python-capdl-tool-example - - - name: construct-address-space - display_name: construct-address-space - description: "An example of how to use the Python CapDL module" - status: "active" - component_type: python-capdl-tool-example - - - name: to-capdl - display_name: to-capdl - description: "An example of how to use the Python CapDL module" - status: "active" - component_type: python-capdl-tool-example - - # - # python-capdl-tool-test - # - - name: allocator - display_name: allocator - description: "A basic test of the functionality of the Python CapDL module" - status: "active" - component_type: python-capdl-tool-test - - - name: runall - display_name: runall - description: "A basic test of the functionality of the Python CapDL module" - status: "active" - component_type: python-capdl-tool-test - - - name: testelf - display_name: testelf - description: "A basic test of the functionality of the Python CapDL module" - status: "active" - component_type: python-capdl-tool-test - - - name: testmerge - display_name: testmerge - description: "A basic test of the functionality of the Python CapDL module" - status: "active" - component_type: python-capdl-tool-test - - # - # capDL-tool - # - - name: CapDL - display_name: CapDL - description: "Haskell source code of the capDL-tool" - status: "active" - component_type: capDL-tool - - # - # capDL-tool-example - # - - name: camkes-adder-arm - display_name: camkes-adder-arm - description: "One of the capDL-tool examples used as test files" - status: "active" - component_type: capDL-tool-example - - - name: cap-dist-elf-simpleserver - display_name: cap-dist-elf-simpleserver - description: "One of the capDL-tool examples used as test files" - status: "active" - component_type: capDL-tool-example - - - name: example-arm - display_name: example-arm - description: "One of the capDL-tool examples used as test files" - status: "active" - component_type: capDL-tool-example - - - name: example-ia32 - display_name: example-ia32 - description: "One of the capDL-tool examples used as test files" - status: "active" - component_type: capDL-tool-example - - - name: example - display_name: example - description: "One of the capDL-tool examples used as test files" - status: "active" - component_type: capDL-tool-example - - - name: hello-dump - display_name: hello-dump - description: "One of the capDL-tool examples used as test files" - status: "active" - component_type: capDL-tool-example - - - name: iwana-ia32 - display_name: iwana-ia32 - description: "One of the capDL-tool examples used as test files" - status: "active" - component_type: capDL-tool-example - # - # cdl_utils - # - - name: capdl_linker - display_name: capdl_linker - description: "The capdl_linker generates a final capDL spec from a input list of ELF files, and a record of which resources via objects and capabilities that the ELF file applications require." - status: "active" - component_type: cdl_utils - - - name: untyped_gen - display_name: untyped_gen - description: "The untyped_gen takes a description of the memory layout in a system from an seL4 build system artifact and generates the list of untyped objects that the kernel is expected to create." - status: "active" - component_type: cdl_utils - - # - # cdl_utils-templates - # - - name: cspace.template - display_name: cspace.template - description: "" - status: "active" - component_type: cdl_utils-templates - - # - # object_sizes - # - - name: object_sizes - display_name: object_sizes - description: "" - status: "active" - component_type: cmake-target-runs - diff --git a/_data/projects/dockerfiles.yml b/_data/projects/dockerfiles.yml deleted file mode 100644 index f810fe7ce54..00000000000 --- a/_data/projects/dockerfiles.yml +++ /dev/null @@ -1,11 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: dockerfiles -display_name: Dockerfiles -description: Dockerfiles defining the dependencies required to build seL4, CAmkES, and L4v -project_order: 9 - -repositories: - - org: sel4 - repo: seL4-CAmkES-L4v-dockerfiles diff --git a/_data/projects/docsite.yml b/_data/projects/docsite.yml deleted file mode 100644 index 9aa1fd8f48d..00000000000 --- a/_data/projects/docsite.yml +++ /dev/null @@ -1,7 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: docsite -display_name: seL4 Documentation website -description: For cooperatively developing and sharing documentation on seL4 -project_order: 9 diff --git a/_data/projects/elfloader.yml b/_data/projects/elfloader.yml deleted file mode 100644 index 42a84718c6f..00000000000 --- a/_data/projects/elfloader.yml +++ /dev/null @@ -1,103 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: elfloader -display_name: Elfloader -description: For preparing the hardware for seL4 on ARM and RISC-V -project_order: 5 - -repositories: - - org: seL4 - repo: sel4_tools - -components: - - name: arch-arm - display_name: arch-arm - description: "Bootstrapping and image loading for seL4 kernel and user applications on ARM" - maintainer: "seL4 Foundation" - status: "active" - component_type: elfloader-architecture - - name: arch-riscv - display_name: arch-riscv - description: "Bootstrapping and image loading for seL4 kernel and user applications on RISC-V" - maintainer: "seL4 Foundation" - status: "active" - component_type: elfloader-architecture - - name: ELF - display_name: "ELF file parser" - description: "Utility for parsing and getting information out of an ELF file" - maintainer: "seL4 Foundation" - status: "active" - component_type: elfloader-binary - - name: EFI - display_name: "UEFI boot loading" - description: "Utility for parsing and getting information out of an EFI file" - maintainer: "seL4 Foundation" - status: "active" - component_type: elfloader-binary - - name: drivers - display_name: Driver framework - description: "Device driver framework for the elfloader supported platforms" - maintainer: "seL4 Foundation" - status: "active" - component_type: elfloader-driver - - name: uart - display_name: UART - description: "UART drivers for various ARM platforms" - maintainer: "seL4 Foundation" - status: "active" - component_type: elfloader-driver - - name: smp - display_name: SMP - description: "SMP support on ARM using driver model" - maintainer: "seL4 Foundation" - status: "active" - component_type: elfloader-driver - - name: exynos5 - display_name: exynos5 - description: "Platform specific code for Samsung Exynos 5 SoCs" - maintainer: "seL4 Foundation" - status: "active" - component_type: elfloader-platform - - name: fvp - display_name: fvp - description: "Platform specific code for ARM Fixed Virtual Platforms" - maintainer: "seL4 Foundation" - status: "active" - component_type: elfloader-platform - - name: imx6 - display_name: imx6 - description: "Platform specific code for NXP i.MX6 Processors" - maintainer: "seL4 Foundation" - status: "active" - component_type: elfloader-platform - - name: imx7 - display_name: imx7 - description: "Platform specific code for NXP i.MX7 Processors" - maintainer: "seL4 Foundation" - status: "active" - component_type: elfloader-platform - - name: tk1 - display_name: tk1 - description: "Platform specific code for Nvidia Jatson TK1" - maintainer: "seL4 Foundation" - status: "active" - component_type: elfloader-platform - - name: tx2 - display_name: tx2 - description: "Platform specific code for Nvidia Jatson TX2" - maintainer: "seL4 Foundation" - status: "active" - component_type: elfloader-platform - - name: zynq7000 - display_name: zynq7000 - description: "Platform specific code for Xilinx Zynq-7000 SoC" - maintainer: "seL4 Foundation" - status: "active" - component_type: elfloader-platform - - name: utils - display_name: utils - description: "A set of MD5 and SHA256 cryptographic hash functions" - maintainer: "DornerWorks" - status: "inactive" - component_type: elfloader-utils diff --git a/_data/projects/hardware_hacks.yml b/_data/projects/hardware_hacks.yml deleted file mode 100644 index 74d862f41e9..00000000000 --- a/_data/projects/hardware_hacks.yml +++ /dev/null @@ -1,7 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: hardware_hacks -display_name: Hardware Hacks -description: Various bits and pieces to enable easier use of our hardware -project_order: 10 diff --git a/_data/projects/l4v.yml b/_data/projects/l4v.yml deleted file mode 100644 index 9d7d7b33786..00000000000 --- a/_data/projects/l4v.yml +++ /dev/null @@ -1,31 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: l4v -display_name: L4.verified -description: seL4 specification and proofs -project_order: 2 - -repositories: - - org: seL4 - repo: l4v - -useful_urls: - - label: "Trustworthy Systems seL4 verification project" - url: "https://trustworthy.systems/projects/seL4-verification/" - - label: "Commercial verification services (Proofcraft)" - url: "https://proofcraft.systems" - -roadmap: - - name: MCS - display_name: MCS Kernel extensions - description: Functional correctness proofs for a new scheduling model to support trustworthy mixed-criticality real-time systems. - assigned: Proofcraft - status: C verification ongoing - roadmap_type: in-progress - - name: AARCH64 - display_name: AArch64 port - description: Functional correctness proofs for the AArch64 port of seL4 completed. Integrity (access control) ongoing. - assigned: Proofcraft - status: Integrity verification to complete Q1/25 - roadmap_type: in-progress diff --git a/_data/projects/microkit.yml b/_data/projects/microkit.yml deleted file mode 100644 index 0c1715448fd..00000000000 --- a/_data/projects/microkit.yml +++ /dev/null @@ -1,110 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: microkit -display_name: Microkit -description: A simple operating system framework for developing systems on top of seL4 - -repositories: - - org: sel4 - repo: microkit - - org: au-ts - repo: microkit_tutorial - -sdk_downloads: - - version: 2.1.0 - sdks: - - label: "microkit-sdk-2.1.0-linux-x86-64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/2.1.0/microkit-sdk-2.1.0-linux-x86-64.tar.gz" - os: Linux - arch: x86-64 - - label: "microkit-sdk-2.1.0-linux-aarch64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/2.1.0/microkit-sdk-2.1.0-linux-aarch64.tar.gz" - os: Linux - arch: AArch64 - - label: "microkit-sdk-2.1.0-macos-x86-64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/2.1.0/microkit-sdk-2.1.0-macos-x86-64.tar.gz" - os: macOS - arch: x86-64 - - label: "microkit-sdk-2.1.0-macos-aarch64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/2.1.0/microkit-sdk-2.1.0-macos-aarch64.tar.gz" - os: macOS - arch: AArch64 - - version: 2.0.1 - sdks: - - label: "microkit-sdk-2.0.1-linux-x86-64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/2.0.1/microkit-sdk-2.0.1-linux-x86-64.tar.gz" - os: Linux - arch: x86-64 - - label: "microkit-sdk-2.0.1-linux-aarch64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/2.0.1/microkit-sdk-2.0.1-linux-aarch64.tar.gz" - os: Linux - arch: AArch64 - - label: "microkit-sdk-2.0.1-macos-x86-64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/2.0.1/microkit-sdk-2.0.1-macos-x86-64.tar.gz" - os: macOS - arch: x86-64 - - label: "microkit-sdk-2.0.1-macos-aarch64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/2.0.1/microkit-sdk-2.0.1-macos-aarch64.tar.gz" - os: macOS - arch: AArch64 - - version: 2.0.0 - sdks: - - label: "microkit-sdk-2.0.0-linux-x86-64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/2.0.0/microkit-sdk-2.0.0-linux-x86-64.tar.gz" - os: Linux - arch: x86-64 - - label: "microkit-sdk-2.0.0-linux-aarch64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/2.0.0/microkit-sdk-2.0.0-linux-aarch64.tar.gz" - os: Linux - arch: AArch64 - - label: "microkit-sdk-2.0.0-macos-x86-64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/2.0.0/microkit-sdk-2.0.0-macos-x86-64.tar.gz" - os: macOS - arch: x86-64 - - label: "microkit-sdk-2.0.0-macos-aarch64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/2.0.0/microkit-sdk-2.0.0-macos-aarch64.tar.gz" - os: macOS - arch: AArch64 - - version: 1.4.1 - sdks: - - label: "microkit-sdk-1.4.1-linux-x86-64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/1.4.1/microkit-sdk-1.4.1-linux-x86-64.tar.gz" - os: Linux - arch: x86-64 - - label: "microkit-sdk-1.4.1-macos-x86-64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/1.4.1/microkit-sdk-1.4.1-macos-x86-64.tar.gz" - os: macOS - arch: x86-64 - - label: "microkit-sdk-1.4.1-macos-aarch64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/1.4.1/microkit-sdk-1.4.1-macos-aarch64.tar.gz" - os: macOS - arch: AArch64 - - version: 1.4.0 - sdks: - - label: "microkit-sdk-1.4.0-linux-x86-64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/1.4.0/microkit-sdk-1.4.0-linux-x86-64.tar.gz" - os: Linux - arch: x86-64 - - label: "microkit-sdk-1.4.0-macos-x86-64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/1.4.0/microkit-sdk-1.4.0-macos-x86-64.tar.gz" - os: macOS - arch: x86-64 - - label: "microkit-sdk-1.4.0-macos-aarch64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/1.4.0/microkit-sdk-1.4.0-macos-aarch64.tar.gz" - os: macOS - arch: AArch64 - - version: 1.3.0 - sdks: - - label: "microkit-sdk-1.3.0-linux-x86-64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/1.3.0/microkit-sdk-1.3.0-linux-x86-64.tar.gz" - os: Linux - arch: x86-64 - - label: "microkit-sdk-1.3.0-macos-x86-64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/1.3.0/microkit-sdk-1.3.0-macos-x86-64.tar.gz" - os: macOS - arch: x86-64 - - label: "microkit-sdk-1.3.0-macos-aarch64.tar.gz" - url: "https://github.com/seL4/microkit/releases/download/1.3.0/microkit-sdk-1.3.0-macos-aarch64.tar.gz" - os: macOS - arch: aarch64 diff --git a/_data/projects/rust.yml b/_data/projects/rust.yml deleted file mode 100644 index c8a20569f7e..00000000000 --- a/_data/projects/rust.yml +++ /dev/null @@ -1,27 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: rust -display_name: Rust -description: seL4 Rust support -project_order: 11 - -repositories: - - org: sel4 - repo: rust-sel4 - - org: sel4 - repo: seL4-rust-tutorial - -releases: - - version: 1.0.0 - url: "https://github.com/seL4/rust-sel4/releases/tag/v1.0.0" - kernel_version: 13.0.0 - microkit_version: 1.3.0 - - version: 2.0.0 - url: "https://github.com/seL4/rust-sel4/releases/tag/v2.0.0" - kernel_version: 13.0.0 - microkit_version: 2.0.1 - - version: 3.0.0 - url: "https://github.com/seL4/rust-sel4/releases/tag/v3.0.0" - kernel_version: 14.0.0 - microkit_version: 2.1.0 diff --git a/_data/projects/sel4-tutorials.yml b/_data/projects/sel4-tutorials.yml deleted file mode 100644 index e4d45e8d74e..00000000000 --- a/_data/projects/sel4-tutorials.yml +++ /dev/null @@ -1,203 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: sel4-tutorials -display_name: seL4 tutorials -description: Collection of tutorials for learning to use seL4 and its ecosystem -project_order: 7 - -repositories: - - org: sel4 - repo: sel4-tutorials - - org: sel4 - repo: sel4-tutorials-manifest - -# The order of the components list determines the order of the tutorials in the -# tutorial nav side bar. The field section is used there to include groups of -# tutorials. - -components: - - name: hello-world - display_name: "Hello world" - description: "The first seL4 application to run" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: sel4 - - - name: capabilities - display_name: "Capabilities" - description: "seL4 capabilities tutorial" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: sel4 - - - name: untyped - display_name: "Untyped" - description: "Physical memory management tutorial" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: sel4 - - - name: mapping - display_name: "Mapping" - description: "Virtual memory management tutorial" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: sel4 - - - name: threads - display_name: "Threads" - description: "Threads on seL4 tutorial" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: sel4 - - - name: ipc - display_name: "IPC" - description: "seL4 IPC tutorial" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: sel4 - - - name: notifications - display_name: "Notifications" - description: "seL4 notification tutorial" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: sel4 - - - name: interrupts - display_name: "Interrupts" - description: "Tutorial for accessing interrupts on seL4" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: sel4 - - - name: fault-handlers - display_name: "Fault handling" - description: "Fault handling tutorial" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: sel4 - - - name: mcs - display_name: "MCS extensions" - description: "MCS extension tutorial" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: sel4 - - - name: libraries-1 - display_name: "Initialisation & threading" - description: "Initialisation and threading tutorial" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: libraries - - - name: libraries-2 - display_name: "IPC" - description: "seL4 IPC and userspace paging management tutorial" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: libraries - - - name: libraries-3 - display_name: "Processes & Elf loading" - description: "Processes and ELF loading tutorial" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: libraries - - - name: libraries-4 - display_name: "Timer" - description: "Tutorial for using device drivers" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: libraries - - - name: hello-camkes-0 - display_name: "Hello CAmkES" - description: "The first CAmkES application to run" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: camkes - - - name: hello-camkes-1 - display_name: "Introduction to CAmkES" - description: "CAmkES ADL and RPC interface tutorial" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: camkes - - - name: hello-camkes-2 - display_name: "Events in CAmkES" - description: "CAmkES event and dataport tutorial" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: camkes - - - name: hello-camkes-timer - display_name: "CAmkES timer tutorial" - description: "CAmkES tutorial for accessing hardware" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: camkes - - - name: camkes-vm-linux - display_name: "CAmkES VM" - description: "Tutorial for creating VM guests and applications on seL4 using CAmkES" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: camkes - - - name: camkes-vm-crossvm - display_name: "CAmkES cross-VM connectors" - description: "Tutorial for using cross virtual machine connectors" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-application - section: camkes - - - name: libsel4tutorials - display_name: "libsel4tutorials" - description: "Utility Library for doing seL4 tutorials" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-library - - name: zynq_timer_driver - display_name: "Zynq-7000 timer driver" - description: "Zynq-7000 timer device driver used by CAmkES timer tutorial" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-driver - - name: docs - display_name: "docs" - description: "seL4 documents" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-docs - - name: tools - display_name: "tools" - description: "Utilities for generating and managing seL4 tutorials" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-tutorials-utils diff --git a/_data/projects/sel4.yml b/_data/projects/sel4.yml deleted file mode 100644 index 67c60df26dd..00000000000 --- a/_data/projects/sel4.yml +++ /dev/null @@ -1,1124 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: sel4 -display_name: seL4 -description: The seL4 microkernel -project_order: 1 - -repositories: - - org: seL4 - repo: sel4 - -configurations: - - - name: KernelVerificationBuild - display_name: "KernelVerificationBuild" - description: "When enabled this configuration option prevents the usage of any other options that \ - would compromise the verification story of the kernel. Enabling this option does NOT \ - imply you are using a verified kernel." - maintainer: "seL4 Foundation" - status: "Always set. (Default: ON)" - component_type: generic - - name: KernelIsMCS - display_name: "KernelIsMCS" - description: "Enable MCS feature for seL4." - maintainer: "seL4 Foundation" - status: "Available on all MCS supported platforms (Default: Off)" - component_type: generic - - name: KernelRootCNodeSizeBits - display_name: "KernelRootCNodeSizeBits" - description: "Root CNode Size (2^n slots) \ - The acceptable range is 12-27 and 12-26, for 32-bit and 64-bit respectively. \ - The root CNode needs at least enough space to contain up to BI_CAP_DYN_START." - maintainer: "seL4 Foundation" - status: "Always set (Default: 12)" - component_type: generic - - name: KernelRetypeFanOutLimit - display_name: "KernelRetypeFanOutLimit" - description: "Maximum number of objects that can be created in a single Retype() invocation." - maintainer: "seL4 Foundation" - status: "Always set. (Default: 256)" - component_type: generic - - name: KernelMaxNumBootinfoUntypedCaps - display_name: "KernelMaxNumBootinfoUntypedCaps" - description: "Max number of untyped capabilities given to initial boot thread. Additional caps - won't be handed to the system." - maintainer: "seL4 Foundation" - status: "Always set. (Default: 230 caps)" - component_type: generic - - - name: KernelTimerTickMS - display_name: "KernelTimerTickMS" - description: "Kernel timer tick period in milliseconds." - maintainer: "seL4 Foundation" - status: "Only available on non-MCS kernels. (Default: 2 milliseconds)" - component_type: scheduling - - name: KernelTimeSlice - display_name: "KernelTimeSlice" - description: "Number of kernel timer ticks until a thread is preempted." - maintainer: "seL4 Foundation" - status: "Only available on non-MCS kernels. (Default: 5 ticks)" - component_type: scheduling - - name: KernelBootThreadTimeSlice - display_name: "KernelBootThreadTimeSlice" - description: "Budget of booth thread: Number of milliseconds until the boot thread is preempted." - maintainer: "seL4 Foundation" - status: "Available on all MCS supported platforms. (Default: 5 milliseconds)" - component_type: scheduling - - name: KernelMaxNumWorkUnitsPerPreemption - display_name: "KernelMaxNumWorkUnitsPerPreemption" - description: "Maximum number of work units (delete/revoke iterations) until the kernel checks for \ - pending interrupts (and preempts the currently running syscall if interrupts are pending)." - maintainer: "seL4 Foundation" - status: "Always set. (Default: 100)" - component_type: scheduling - - name: KernelResetChunkBits - display_name: "KernelResetChunkBits" - description: "Maximum size in bits of chunks of memory to zero before checking a preemption point." - maintainer: "seL4 Foundation" - status: "Always set. (Default: 8 bits)" - component_type: scheduling - - name: KernelNumDomains - display_name: "KernelNumDomains" - description: "The number of scheduler domains in the system" - maintainer: "seL4 Foundation" - status: "Always set. (Default: 1 domain)" - component_type: scheduling - - name: KernelDomainSchedule - display_name: "KernelDomainSchedule" - description: "A C file providing the symbols ksDomSchedule and ksDomeScheudleLength \ - to be linked with the kernel as a scheduling configuration." - maintainer: "seL4 Foundation" - status: "Always set. (Default: src/config/default_domain.c)" - component_type: scheduling - - name: KernelNumPriorities - display_name: "KernelNumPriorities" - description: "The number of priority levels per domain." - maintainer: "seL4 Foundation" - status: "Always set, Valid range 1-256. (Default: 256)" - component_type: scheduling - - name: KernelWcetScale - display_name: "KernelWcetScale" - description: "Multiplier to scale kernel WCET estimate by: the kernel WCET estimate \ - is used to ensure a thread has enough budget to get in and out of the \ - kernel. When running in a simulator the WCET estimate, which is tuned \ - for hardware, may not be sufficient. This option provides a hacky knob \ - that can be fiddled with when running inside a simulator." - maintainer: "seL4 Foundation" - status: "Enabled if KernelIsMCS. (Default: 1)" - component_type: scheduling - - - name: KernelDebugBuild - display_name: "KernelDebugBuild" - description: "Enable debug facilities (symbols and assertions) in the kernel" - maintainer: "seL4 Foundation" - status: "Disabled if KernelVerificationBuild is set. (Default: ON)" - component_type: debug - - name: HardwareDebugAPI - display_name: "HardwareDebugAPI" - description: "Builds the kernel with support for a userspace debug API, which can \ - allows userspace processes to set breakpoints, watchpoints and to \ - single-step through thread execution." - maintainer: "seL4 Foundation" - status: "Requires platform support. (Default: Off)" - component_type: debug - - name: KernelPrinting - display_name: "KernelPrinting" - description: "Allow the kernel to print out messages to the serial console during bootup and execution." - maintainer: "seL4 Foundation" - status: "Disabled if KernelVerificationBuild is set. (Default: Set to initial value of KernelDebugBuild)" - component_type: debug - - name: KernelIRQReporting - display_name: "KernelIRQReporting" - description: "seL4 does not properly check for and handle spurious interrupts. This can result \ - in unnecessary output from the kernel during debug builds. If you are CERTAIN these \ - messages are benign then use this config to turn them off." - maintainer: "seL4 Foundation" - status: "Enabled if KernelPrinting is set. (Default: On)" - component_type: debug - - name: KernelColourPrinting - display_name: "KernelColourPrinting" - description: "In debug mode, seL4 prints diagnostic messages to its serial output describing, \ - e.g., the cause of system call errors. This setting determines whether ANSI escape \ - codes are applied to colour code these error messages. You may wish to disable this \ - setting if your serial output is redirected to a file or pipe." - maintainer: "seL4 Foundation" - status: "Enabled if KernelPrinting is set. (Default: On)" - component_type: debug - - name: KernelUserStackTraceLength - display_name: "KernelUserStackTraceLength" - description: "On a double fault the kernel can try and print out the users stack to aid \ - debugging. This option determines how many words of stack should be printed." - maintainer: "seL4 Foundation" - status: "Enabled if KernelPrinting is set. (Default: 16)" - component_type: debug - - name: KernelDebugDisablePrefetchers - display_name: "KernelDebugDisablePrefetchers" - description: "On ia32 platforms, this option disables the L2 hardware prefetcher, the L2 adjacent \ - cache line prefetcher, the DCU prefetcher and the DCU IP prefetcher. On the cortex \ - a53 this disables the L1 Data prefetcher." - maintainer: "seL4 Foundation" - status: "Available if KernelArchX86 OR KernelPlatformHikey is set. (Default: Off)" - component_type: debug - - - - - name: KernelFastpath - display_name: "KernelFastpath" - description: "Enable IPC fastpath. Can be disabled for performance analyses." - maintainer: "seL4 Foundation" - status: "Always set. (Default: ON)" - component_type: profiling - - name: KernelFPUMaxRestoresSinceSwitch - display_name: "KernelFPUMaxRestoresSinceSwitch" - description: "This option is a heuristic to attempt to detect when the FPU is no longer in use, \ - allowing the kernel to save the FPU state out so that the FPU does not have to be \ - enabled/disabled every thread switch. Every time we restore a thread and there is \ - active FPU state, we increment this setting and if it exceeds this threshold we \ - switch to the NULL state." - maintainer: "seL4 Foundation" - status: "Only set if the system is using the FPU. (Default: 64 switches)" - component_type: profiling - - name: KernelBenchmarks - display_name: "KernelBenchmarks" - description: "Enable benchamrks including logging and tracing info. \ - Setting this value > 1 enables a 1MB log buffer and functions for extracting data from it \ - at user level. NOTE this is only tested on the sabre and will not work on platforms with < 512mb memory. \ - This is not fully implemented for x86.
\ - **none** -> No Benchmarking features enabled.
\ - **generic** -> Enable global benchmarks config variable with no specific features.
\ - **track_kernel_entries** -> Log kernel entries information including timing, number of invocations and arguments for \ - system calls, interrupts, user faults and VM faults.
\ - **tracepoints** -> Enable manually inserted tracepoints that the kernel will track time consumed between.
\ - **track_utilisation** -> Enable the kernel to track each thread's utilisation time." - maintainer: "seL4 Foundation" - status: "Disabled if KernelVerificationBuild is set. (Default: None)" - component_type: profiling - - name: KernelMaxNumTracePoints - display_name: "KernelMaxNumTracePoints" - description: "The maximum number of different trace point identifiers which can be used. Use `TRACE_POINT_START(k)` \ - and `TRACE_POINT_STOP(k)` macros for recording data, where k is an integer between 0 and this value - 1" - maintainer: "seL4 Foundation" - status: "Requires KernelBenchmarksTracepoints is set. (Default: 1)" - component_type: profiling - - name: KernelOptimisation - display_name: "KernelOptimisation" - description: "Select the kernel optimisation level. This should only be changed as part of performance analysis. -O2 is required for normal use." - maintainer: "seL4 Foundation" - status: "Always set. (Default: -O2)" - component_type: profiling - - name: KernelFWholeProgram - display_name: "KernelFWholeProgram" - description: "Enable -fwhole-program when linking kernel. This should work modulo gcc bugs, which \ - are not uncommon with -fwhole-program. Consider this feature experimental!" - maintainer: "seL4 Foundation" - status: "Always set. (Default: OFF)" - component_type: profiling - - name: KernelDangerousCodeInjection - display_name: "KernelDangerousCodeInjection" - description: "Adds a system call that allows users to specify code to be run in kernel mode. \ - Useful for profiling." - maintainer: "seL4 Foundation" - status: "Can only be set if: NOT KernelARMHypervisorSupport;NOT KernelVerificationBuild;NOT KernelPlatformHikey;NOT KernelSkimWindow. (Default: Off)" - component_type: profiling - - name: KernelStackBits - display_name: "KernelStackBits" - description: "This describes the log2 size of the kernel stack. Great care should be taken as \ - there is no guard below the stack so setting this too small will cause random \ - memory corruption" - maintainer: "seL4 Foundation" - status: "Always set. (Default: 12 bits)" - component_type: profiling - - - name: KernelPlatform - display_name: "KernelPlatform" - description: "Hardware platform to target. This setting influences other kernel configuration values." - maintainer: "seL4 Foundation" - status: 'See list of supported platforms.' - component_type: platform - - name: KernelArch - display_name: "KernelArch" - description: "Architecture to use when building the kernel." - maintainer: "seL4 Foundation" - status: "Supported values: (arm, x86, riscv)." - component_type: platformform - - name: KernelSel4Arch - display_name: "KernelSel4Arch" - description: "Architecture mode for building the kernel." - maintainer: "seL4 Foundation" - status: "Supported values: (aarch32, aarch64, arm_hyp, riscv32, riscv64, x86_64, ia32)." - component_type: platform - - name: KernelHaveFPU - display_name: "KernelHaveFPU" - description: "Set if the platform and toolchain supports floating point unit." - maintainer: "seL4 Foundation" - status: "Set on x86, Unset on RISC-V, toolchain + verirification dependent on Arm" - component_type: platform - - name: KernelMaxNumNodes - display_name: "KernelMaxNumNodes" - description: "Max number of CPU cores to boot." - maintainer: "seL4 Foundation" - status: "Always set. (Default: 1 node)" - component_type: platform - - - name: KernelX86MicroArch - display_name: "KernelX86MicroArch" - description: "Select the x86 micro architecture." - maintainer: "seL4 Foundation" - status: "x86 Option. Supported values:nehalem, generic, westmere, sandy, ivy, haswell, broadwell, skylake. (Default: nehalem)" - component_type: platform-x86 - - name: KernelIRQController - display_name: "KernelIRQController" - description: "Select the IRQ controller seL4 will use. Code for others may still be included if \ - needed to disable at run time." - maintainer: "seL4 Foundation" - status: "x86 Option. Supported values: PIC, IOAPIC. (Default: IOAPIC)" - component_type: platform-x86 - - name: KernelMaxNumIOAPIC - display_name: "KernelMaxNumIOAPIC" - description: "Configure the maximum number of IOAPIC controllers that can be supported. SeL4 \ - will detect IOAPICs regardless of whether the IOAPIC will actually be used as \ - the final IRQ controller." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: 1)" - component_type: platform-x86 - - name: KernelLAPICMode - display_name: "KernelLAPICMode" - description: "Select the mode local APIC will use: XAPIC, X2APIC " - maintainer: "seL4 Foundation" - status: "x86 Option. Not all machines support X2APIC mode (Default: XAPIC)" - component_type: platform-x86 - - name: KernelUseLogcalIDs - display_name: "KernelUseLogcalIDs" - description: "Use logical IDs to broadcast IPI between cores. Not all machines support logical \ - IDs. In xAPIC mode only 8 cores can be addressed using logical IDs." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: OFF)" - component_type: platform-x86 - - name: KernelCacheLnSz - display_name: "KernelCacheLnSz" - description: "Define cache line size for x86." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: 64)" - component_type: platform-x86 - - name: KernelVTX - display_name: "KernelVTX" - description: "VT-x support compiled into the kernel." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: Off)" - component_type: platform-x86 - - name: KernelIOMMU - display_name: "KernelIOMMU" - description: "IOMMU support for VT-d enabled chipset." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: ON)" - component_type: platform-x86 - - name: KernelMaxRMRREntries - display_name: "KernelMaxRMRREntries" - description: "Sets the maximum number of Reserved Memory Region Reporting structures we support \ - recording from the ACPI tables. These structures are used for setting up passthrouh IOMMU mappings \ - for legacy devices." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: 32)" - component_type: platform-x86 - - name: KernelMaxVPIDs - display_name: "KernelMaxVPIDs" - description: "The kernel maintains a mapping of 16-bit VPIDs to VCPUs. This option should be \ - sized as small as possible to save memory, but be at least the number of VCPUs that \ - will be run for optimum performance." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: 1024)" - component_type: platform-x86 - - name: KernelHugePage - display_name: "KernelHugePage" - description: "Add support for 1GB huge page." - maintainer: "seL4 Foundation" - status: "x86 Option. Not all recent processor models support this feature (Default: On)" - component_type: platform-x86 - - name: KernelSupportPCID - display_name: "KernelSupportPCID" - description: "Add support for PCIDs (aka hardware ASIDs)." - maintainer: "seL4 Foundation" - status: "x86_64 Option. Not all recent processor models support this feature (Default: On)" - component_type: platform-x86 - - name: KernelSyscall - display_name: "KernelSyscall" - description: "Which syscall method that the kernel supports. This \ - config should be set to the most efficient one that is support by the hardware the \ - system will run on." - maintainer: "seL4 Foundation" - status: "x86 Option. The kernel only ever supports one method at a time: syscall, sysenter (Default: syscall)" - component_type: platform-x86 - - name: KernelFPU - display_name: "KernelFPU" - description: "Choose the method that FPU state is stored in. This \ - directly affects the method used to save and restore it.
\ - **FXSAVE** -> This chooses the legacy 512-byte region used by the fxsave and fxrstor functions
\ - **XSAVE** -> This chooses the variable xsave region, and enables the ability to use any \ - of the xsave variants to save and restore. The actual size of the region is dependent on \ - the features enabled." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: XSAVE)" - component_type: platform-x86 - - name: KernelXSave - display_name: "KernelXSave" - description: "The XSAVE area supports multiple instructions to save - and restore to it. These instructions are dependent upon specific CPU support. See Chapter 13 of Volume \ - 1 of the Intel Architectures SOftware Developers Manual for discussion on the init and modified \ - optimizations.
\ - **XSAVE** -> Original XSAVE instruction. This is the only XSAVE instruction that is guaranteed to exist if \ - XSAVE is present
\ - **XSAVEC** -> Save state with compaction. This compaction has to do with minimizing the total size of \ - XSAVE buffer, if using non contiguous features, XSAVEC will attempt to use the init optimization \ - when saving
\ - **XSAVEOPT** -> Save state taking advantage of both the init optimization and modified optimization
\ - **XSAVES** -> Save state taking advantage of the modified optimization. This instruction is only \ - available in OS code, and is the preferred save method if it exists." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: XSAVEOPT)" - component_type: platform-x86 - - name: KernelXSaveFeatureSet - display_name: "KernelXSaveFeatureSet" - description: "XSAVE can save and restore the state for various features \ - through the use of the feature mask. This config option represents the feature mask that we want to \ - support. The CPU must support all bits in this feature mask. Current known bits are
\ - 0 - FPU
\ - 1 - SSE
\ - 2 - AVX
\ - FPU and SSE is guaranteed to exist if XSAVE exists." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: 3)" - component_type: platform-x86 - - name: KernelFSGSBase - display_name: "KernelFSGSBase" - description: "There are three ways to to set FS/GS base addresses: \ - IA32_FS/GS_GDT, IA32_FS/GS_BASE_MSR, and fsgsbase instructions. \ - IA32_FS/GS_GDT and IA32_FS/GS_BASE_MSR are availble for 32-bit. \ - IA32_FS/GS_BASE_MSR and fsgsbase instructions are available for 64-bit." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default x86_64: fsgsbase, ia32: gdt)" - component_type: platform-x86 - - name: KernelMultibootGFXMode - display_name: "KernelMultibootGFXMode" - description: "The type of graphics mode to request from the boot loader. This is encoded into the \ - multiboot header and is merely a hint, the boot loader is free to ignore or set some \ - other mode" - maintainer: "seL4 Foundation" - status: "x86 Option. Options: none, text, linear (Default: none)" - component_type: platform-x86 - - name: KernelMultibootGFXDepth - display_name: "KernelMultibootGFXDepth" - description: "The bits per pixel of the linear graphics mode ot request. Value of zero indicates \ - no preference." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: 32)" - component_type: platform-x86 - - name: KernelMultibootGFXWidth - display_name: "KernelMultibootGFXWidth" - description: "The width of the graphics mode to request. For a linear graphics mode this is the \ - number of pixels. For a text mode this is the number of characters, value of zero \ - indicates no preference." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: 0)" - component_type: platform-x86 - - name: KernelMultibootGFXHeight - display_name: "KernelMultibootGFXHeight" - description: "The height of the graphics mode to request. For a linear graphics mode this is the \ - number of pixels. For a text mode this is the number of characters, value of zero \ - indicates no preference." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: 0)" - component_type: platform-x86 - - name: KernelMultiboot1Header - display_name: "KernelMultiboot1Header" - description: "Inserts a header that indicates to the bootloader that the kernel supports a multiboot 1 boot header" - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: On)" - component_type: platform-x86 - - name: KernelMultiboot2Header - display_name: "KernelMultiboot2Header" - description: "Inserts a header that indicates to the bootloader that the kernel supports a multiboot 2 boot header. \ - This is can be enabled together with a multiboot 1 header and the boot loader may use either one" - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: On)" - component_type: platform-x86 - - name: KernelSkimWindow - display_name: "KernelSkimWindow" - description: "Prevent against the Meltdown vulnerability by using a reduced Static Kernel - Image and Micro-state window instead of having all kernel state in the kernel window. - This only needs to be enabled if deploying to a vulnerable processor" - maintainer: "seL4 Foundation" - status: "x86_64 Option. (Default: On)" - component_type: platform-x86 - - name: KernelExportPMCUser - display_name: "KernelExportPMCUser" - description: "Grant user access to the Performance Monitoring Counters. - This allows the user to read performance counters, although - not control what the counters are and whether or not they - are counting. Nevertheless whilst this is useful for - evalulating performance this option opens timing and covert - channels." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: Off)" - component_type: platform-x86 - - name: KernelExportPMCUser - display_name: "KernelExportPMCUser" - description: "Grant user access to the Performance Monitoring Counters. - This allows the user to read performance counters, although - not control what the counters are and whether or not they - are counting. Nevertheless whilst this is useful for - evalulating performance this option opens timing and covert - channels." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: Off)" - component_type: platform-x86 - - name: KernelX86DangerousMSR - display_name: "KernelX86DangerousMSR" - description: "rdmsr/wrmsr kernel interface. Provides a syscall interface for reading and writing arbitrary MSRs. - This is extremely dangerous as no checks are performed and exists - to aid debugging and benchmarking." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: Off)" - component_type: platform-x86 - - name: KernelX86IBRSMode - display_name: "KernelX86IBRSMode" - description: "Indirect Branch Restricted Speculation mode - Used to prevent a user from manipulating the branch predictor to manipulate speculative - execution of other processes. On current processors IBRS has a prohibitive performance - penalty and it is recommended that it be disabled such that software mitigations are - used instead. Software mitigation is done by disabling jump tables (the only form of - indirect jump in seL4 except for 'ret') and flushing the RSB on vmexit. Flushing the RSB - at other times is not needed as seL4 does not switch kernel stacks and so is not - vulnerable to RSB underflow. The STIBP is essentially software mitigation but enables - the single thread isolation for branch predictions. This is only needed if attempting - to protect user level process from each other in a multicore environment." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: ibrs_none)" - component_type: platform-x86 - - name: KernelX86IBPBOnContextSwitch - display_name: "KernelX86IBPBOnContextSwitch" - description: "Performs a IBPB on every context switch to prevent Spectre attacks between user - processes. This is extremely expensive and is recommended you only turn this on - if absolutely necessary. - Note that in a multicore environment you should also enable STIBP to prevent - other cores retraining the branch predictor even after context switch." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: OFF)" - component_type: platform-x86 - - name: KernelX86RSBOnContextSwitch - display_name: "KernelX86RSBOnContextSwitch" - description: "Flushes the RSB on context switch to prevent Spectre attacks between user processes. - Whilst not nearly as expensive as an IBPB it is not enabled by default as it is - largely pointless to flush the RSB without also doing an IBPB as the RSB is already - a harder attack vector." - maintainer: "seL4 Foundation" - status: "x86 Option. (Default: OFF)" - component_type: platform-x86 - - name: KernelDebugDisableL2Cache - display_name: "KernelDebugDisableL2Cache" - description: "Do not enable the L2 cache on startup for debugging purposes." - maintainer: "seL4 Foundation" - status: "Arm option. (Default: OFF)" - component_type: platform-arm - - name: KernelDebugDisableL1ICache - display_name: "KernelDebugDisableL1ICache" - description: "Do not enable the L1 instruction cache on startup for debugging purposes." - maintainer: "seL4 Foundation" - status: "Arm option. (Default: OFF)" - component_type: platform-arm - - name: KernelDebugDisableL1DCache - display_name: "KernelDebugDisableL1DCache" - description: "Do not enable the L1 data cache on startup for debugging purposes." - maintainer: "seL4 Foundation" - status: "Arm option. (Default: OFF)" - component_type: platform-arm - - name: KernelDebugDisableBranchPrediction - display_name: "KernelDebugDisableBranchPrediction" - description: "Do not enable branch prediction (also called program flow control) on startup - for debugging purposes. This makes execution time more deterministic at the - expense of dramatically decreasing performance." - maintainer: "seL4 Foundation" - status: "Arm option. (Default: OFF)" - component_type: platform-arm - - name: KernelArmHypervisorSupport - display_name: "KernelArmHypervisorSupport" - description: "Utilise Arm virtualisation extensions to build the kernel as a hypervisor." - maintainer: "seL4 Foundation" - status: "Arm option. (Default: the value of ARM_HYP (TRUE or FALSE))" - component_type: platform-arm - - name: KernelArmHypervisorSupport - display_name: "KernelArmHypervisorSupport" - description: "Utilise Arm virtualisation extensions to build the kernel as a hypervisor." - maintainer: "seL4 Foundation" - status: "Arm option. (Default: the value of ARM_HYP (TRUE or FALSE))" - component_type: platform-arm - - name: KernelArmHypEnableVCPUCP14SaveAndRestore - display_name: "KernelArmHypEnableVCPUCP14SaveAndRestore" - description: "The kernel does not save or restore VCPUs' CP14 accesses. - As a result, accessing VPU threads' CP14 context triggers a trap, - which allows the kernel to intercept the access and deliver it as a fault message - to the VM monitor." - maintainer: "seL4 Foundation" - status: "Arm option. (Default: ON)" - component_type: platform-arm - - name: KernelArmErrata430973 - display_name: "KernelArmErrata430973" - description: "Enable a workaround for 430973 Cortex-A8 (r1p0..r1p2) erratum - An error occurs if an instruction contains Arm/Thumb interworking branch - that is replaced by a different instruction from the same virtual address." - maintainer: "seL4 Foundation" - status: "Arm option. (Default: OFF)" - component_type: platform-arm - - name: KernelArmErrata773022 - display_name: "KernelArmErrata773022" - description: "Enable a workaround for 773022 Cortex-A15 (r0p0..r0p4) erratum. - An error occurs on rare sequences of instructions which results on the loop buffer delivering - incorrect instructions. The workaround is to disable the loop buffer." - maintainer: "seL4 Foundation" - status: "Arm option. (Default: OFF)" - component_type: platform-arm - - name: KernelArmSMMU - display_name: "KernelArmSMMU" - description: "Enable the System MMU on the Tegra TK1 SoC." - maintainer: "seL4 Foundation" - status: "Arm option. (Default: OFF)" - component_type: platform-arm - - name: KernelArmEnableA9Prefetcher - display_name: "KernelArmEnableA9Prefetcher" - description: "Enable the prefetcher on Arm Cortex-A9 core. - The Cortex-A9 has L1 and L2 prefetchers, which are disabled by default. - This config option enables those prefetchers, requiring the kernel to be executed in the secure mode. - Arm document indicates that the bit used for enabling those prefetchers is no longer supported - from version r4p1 of the Cortex-A9. However, the correctness of that is uncertain." - maintainer: "seL4 Foundation" - status: "Arm option. (Default: OFF)" - component_type: platform-arm - - name: KernelArmExportPMUUser - display_name: "KernelArmExportPMUUser" - description: "Grant user access to the performance monitoring unit. While useful for - benchmarking, this option opens the possibility of timing channels." - maintainer: "seL4 Foundation" - status: "Arm option. (Default: OFF)" - component_type: platform-arm - - name: KernelArmDisableWFIWFETraps - display_name: "KernelArmDisableWFIWFETraps" - description: "Disable the trapping of WFI and WFE instructions by configuring the - Hyp Configuration Registor (HCR) of a VCPU." - maintainer: "seL4 Foundation" - status: "Arm option. (Default: OFF)" - component_type: platform-arm - - name: KernelARMSMMUInterruptEnable - display_name: "KernelARMSMMUInterruptEnable" - description: "Enable system MMU (SMMU) interrupts. System MMU interrupts currently only serve for debugging purpose because - they are not forwarded to user level. Enabling this will - cause some SMMU fault types to print out a message in the kernel. High frequency faults - can result in all time spent in the kernel printing fault messages." - maintainer: "seL4 Foundation" - status: "Arm option. (Default: OFF)" - component_type: platform-arm - - name: KernelAArch32FPUEnableContextSwitch - display_name: "KernelAArch32FPUEnableContextSwitch" - description: "Enable hardware VFP and SIMD context switch. - This enables the VFP and SIMD context switch on platforms with hardware support, - allowing the user to execute hardware VFP and SIMD operations in a - multithreading environment, instead of relying on - software emulation of FPU/VFP from the C library (e.g. mfloat-abi=soft)." - maintainer: "seL4 Foundation" - status: "Arm option. (Default: ON)" - component_type: platform-arm - -features: - - name: arm - display_name: "Arm" - description: "Arm architecture support." - maintainer: "seL4 Foundation" - status: "ArmV6, ArmV7, ArmV8, 32 and 64bit" - component_type: architecture - - name: x86 - display_name: "x86" - description: "x86 architecture support." - maintainer: "seL4 Foundation" - status: "ia32 and x86_64 (32/64bit)" - component_type: architecture - - name: riscv - display_name: "RISC-V" - description: "RISC-V architecture support." - maintainer: "seL4 Foundation" - status: "riscv32, riscv64, imac extensions, sv32 and sv39 virtual memory" - component_type: architecture - - name: aarch64-hyp - display_name: "Aarch64 hyp" - description: "Support for running seL4 in EL2, Aarch64 on ArmV8" - maintainer: "seL4 Foundation" - status: "Supported on the following platforms: FIXME" - component_type: hyp-support - - name: aarch32-hyp - display_name: "arm hyp" - description: "Support for running seL4 in hyp mode, on ArmV7" - maintainer: "seL4 Foundation" - status: "Supported on the following platforms: FIXME" - component_type: hyp-support - - name: intel-vtx - display_name: "Intel VT-x" - description: "Support for using x86 hardware virtualization on seL4." - maintainer: "seL4 Foundation" - status: "Supported on the following platforms: FIXME" - component_type: hyp-support - - name: riscv-hyp - display_name: "RISC-V hyp mode" - description: "Support for utilizing RISC-V Hyp extensions on seL4. [More information](https://github.com/sel4proj/sel4-riscv-vmm-manifest/blob/master/README.md)" - maintainer: "seL4 Foundation" - status: "Experimental branches exist for RISCV HE v0.6" - component_type: hyp-support - - name: arm-smp - display_name: "Arm multicore support" - description: "Support for Arm SMP" - maintainer: "seL4 Foundation" - status: "Supported on the following platforms/cores: FIXME" - component_type: smp-support - - name: x86-smp - display_name: "x86 multicore support" - description: "Support for x86 SMP" - maintainer: "seL4 Foundation" - status: "Supported on the following platforms/cores: FIXME" - component_type: smp-support - - name: riscv-smp - display_name: "RISC-V multicore support" - description: "Support for RISC-V SMP" - maintainer: "seL4 Foundation" - status: "Supported on the following platforms/cores: HiFive Unleashed" - component_type: smp-support - - name: call-fastpath - display_name: "seL4_Call() Fastpath" - description: "seL4_Call operations that meet certain criteria will use the fastpath." - maintainer: "seL4 Foundation" - status: "Supported on all platforms" - component_type: fastpath-support - - name: replyrecv-fastpath - display_name: "seL4_ReplyRecv() Fastpath" - description: "seL4_ReplyRecv operations that meet certain criteria will use the fastpath." - maintainer: "seL4 Foundation" - status: "Supported on all platforms" - component_type: fastpath-support - - name: intel-vtd - display_name: "Intel VT-d" - description: "x86 IOMMU support on seL4 via additional page table object definitions." - maintainer: "seL4 Foundation" - status: "Supported on the following platforms/cores: FIXME" - component_type: iommu-support - - name: tk1-smmu - display_name: "Jetson TK1 SMMU" - description: "Supported on seL4 via additional page table object definitions." - maintainer: "seL4 Foundation" - status: "Only applies to Jetson TK1 platform." - component_type: iommu-support - - name: smmuv2 - display_name: "Arm SMMUv2" - description: "Generic Arm SMMU support on seL4 via additional page table object definitions." - maintainer: "seL4 Foundation" - status: "Under development." - component_type: iommu-support - - name: mcs-verification - display_name: "MCS Verification support" - description: "Verification of the MCS extenstions to seL4" - maintainer: "seL4 Foundation" - status: "Under development." - component_type: mcs-support - - name: mcs-hyp - display_name: "MCS Hyp support" - description: "MCS + Hyp extensions on seL4" - maintainer: "seL4 Foundation" - status: "?." - component_type: mcs-support - - name: mcs-smp - display_name: "MCS SMP support" - description: "MCS + SMP on seL4" - maintainer: "seL4 Foundation" - status: "?." - component_type: mcs-support - - name: mcs-fastpath - display_name: "MCS Fastpath support" - description: "Fastpath operations require a Scheduling Context donation to occur." - maintainer: "seL4 Foundation" - status: "?." - component_type: mcs-support - - -components: - - name: sel4-microkernel - display_name: "seL4 Microkernel" - description: "Formally verified operating system kernel" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4 - - name: libsel4 - display_name: "libsel4" - description: "seL4 user level API bindings" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-library - - name: manual - display_name: "seL4 Manual" - display_name_url: https://sel4.systems/Info/Docs/seL4-manual-latest.pdf - description: "seL4 Reference Manual. Released for each seL4 version." - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4-manual - - name: sel4-deps - display_name: "sel4-deps python package" - description: "Python meta package for seL4 python dependencies" - maintainer: "seL4 Foundation" - status: "active" - component_type: python-package - - name: FindseL4.cmake - display_name: "FindseL4 CMake module" - description: "CMake module for importing seL4 into buildsystem" - maintainer: "seL4 Foundation" - status: "active" - component_type: cmake-module - - name: ti,am33xx-intc - display_name: "ti,am33xx-intc" - description: "am335x interrupt controller seL4 driver" - maintainer: "seL4 Foundation" - status: "active, currently used by am335x seL4 platforms" - component_type: kernel-driver-irq - - name: brcm,bcm2836-armctrl-ic - display_name: "brcm,bcm2836-armctrl-ic" - description: "Broadcom Raspberry Pi interrupt controller seL4 driver" - maintainer: "seL4 Foundation" - status: "active, currently used by the rpi3 seL4 platform" - component_type: kernel-driver-irq - - name: hifive-plic - display_name: "hifive-plic" - description: "HiFive interrupt controller seL4 driver" - maintainer: "seL4 Foundation" - status: "active, currently used by the hifive seL4 platform" - component_type: kernel-driver-irq - - name: ti,omap3-intc - display_name: "ti,omap3-intc" - description: "omap3 interrupt controller seL4 driver" - maintainer: "seL4 Foundation" - status: "active, currently used by the omap3 seL4 platform" - component_type: kernel-driver-irq - - name: arm,gic-v2 - display_name: "arm,gic-v2" - description: "Arm GICv2 interrupt controller seL4 driver" - maintainer: "seL4 Foundation" - status: "active, currently used by several seL4 platforms" - component_type: kernel-driver-irq - - name: arm,gic-v3 - display_name: "arm,gic-v3" - description: "Arm GICv2 interrupt controller seL4 driver" - maintainer: "seL4 Foundation" - status: "active, currently used by several seL4 platforms" - component_type: kernel-driver-irq - - name: x86,pic - display_name: "x86,pic" - description: "Intel 8259 Programmable Interrupt Controller (PIC) seL4 driver" - maintainer: "seL4 Foundation" - status: "active, currently used by the pc99 seL4 platform" - component_type: kernel-driver-irq - - name: x86,ioapic - display_name: "x86,ioapic" - description: "Intel IOAPIC seL4 driver" - maintainer: "seL4 Foundation" - status: "active, currently used by the pc99 seL4 platform" - component_type: kernel-driver-irq - - name: x86,lapic - display_name: "x86,lapic" - description: "Intel Local APIC seL4 IRQ and timer driver" - maintainer: "seL4 Foundation" - status: "active, currently used by the pc99 seL4 platform" - component_type: kernel-driver-irq - - name: brcm,bcm2835-aux-uart - display_name: "brcm,bcm2835-aux-uart" - description: "Raspberry Pi serial seL4 driver" - maintainer: "seL4 Foundation" - status: "active, currently used by the rpi3 seL4 platform" - component_type: kernel-driver-serial - - name: samsung,exynos4210-uart - display_name: "samsung,exynos4210-uart" - description: "exynos4210 serial seL4 driver" - maintainer: "seL4 Foundation" - status: "active, currently used by the exynos4 seL4 platform" - component_type: kernel-driver-serial - - name: amlogic,meson-gx-uart - display_name: "amlogic,meson-gx-uart" - description: "odroidc2 serial seL4 driver" - maintainer: "seL4 Foundation" - status: "active, currently used by the odroidc2 seL4 platform" - component_type: kernel-driver-serial - - name: arm,pl011 - display_name: "arm,pl011" - description: "Arm standard serial seL4 driver" - maintainer: "seL4 Foundation" - status: "active, currently used by several seL4 platforms" - component_type: kernel-driver-serial - - name: xlnx,xuartps - display_name: "xlnx,xuartps" - description: "Xilinx serial seL4 driver" - maintainer: "seL4 Foundation" - status: "active, currently used by some zynq* seL4 platforms" - component_type: kernel-driver-serial - - name: fsl,imx**-uart - display_name: "fsl,imx**-uart" - description: "i.MX serial seL4 driver" - maintainer: "seL4 Foundation" - status: "active, currently used by some imx* seL4 platforms" - component_type: kernel-driver-serial - - name: qcom,msm-uartdm - display_name: "qcom,msm-uartdm" - description: "apq8064 serial seL4 driver" - maintainer: "seL4 Foundation" - status: "Inactive, currently used by the currently unmaintained apq8064 seL4 platform" - component_type: kernel-driver-serial - - name: arm-misc - display_name: "nvidia,tegra20-uart;ti,omap3-uart;snps,dw-apb-uart" - description: "Simple Arm serial seL4 driver" - maintainer: "seL4 Foundation" - status: "Active, currently used by nvidia- and beagle- based seL4 platforms" - component_type: kernel-driver-serial - - name: allwinner,sun4i-a10-timer - display_name: "allwinner,sun4i-a10-timer" - description: "allwinnera20 timer seL4 driver" - maintainer: "seL4 Foundation" - status: "Inactive, currently used by the unmaintained alwinnera20 platform" - component_type: kernel-driver-timer - - name: samsung,exynos4210-mct - display_name: "samsung,exynos4210-mct" - description: "exynos5 timer seL4 driver that wraps Arm Generic timer" - maintainer: "seL4 Foundation" - status: "Active, currently used by the exynos5 platforms" - component_type: kernel-driver-timer - - name: arm,cortex-a9-global-timer - display_name: "arm,cortex-a9-global-timer" - description: "Arm cortex-a9 global timer seL4 driver" - maintainer: "seL4 Foundation" - status: "Active, currently used by the cortex-a9 platforms" - component_type: kernel-driver-timer - - name: qcom,kpss-timer - display_name: "qcom,kpss-timer" - description: "apq8064 timer seL4 driver" - maintainer: "seL4 Foundation" - status: "Inactive, currently used by the currently unmaintained apq8064 seL4 platform" - component_type: kernel-driver-timer - - name: ti,am335x-timer - display_name: "ti,am335x-timer" - description: "am335x timer seL4 driver" - maintainer: "seL4 Foundation" - status: "Active, currently used by the am335x seL4 platforms" - component_type: kernel-driver-timer - - name: samsung,exynos4412-mct - display_name: "samsung,exynos4412-mct" - description: "exynos4 timer seL4 driver" - maintainer: "seL4 Foundation" - status: "Active, currently used by the exynos4 seL4 platform" - component_type: kernel-driver-timer - - name: ti,omap3430-timer - display_name: "ti,omap3430-timer" - description: "omap3 timer seL4 driver" - maintainer: "seL4 Foundation" - status: "Active, currently used by the omap3 seL4 platform" - component_type: kernel-driver-timer - - name: "arm,armv7-timer;arm,armv8-timer" - display_name: "arm,armv7-timer;arm,armv8-timer" - description: "Arm generic timer seL4 driver" - maintainer: "seL4 Foundation" - status: "Active, currently used by several Arm seL4 platforms" - component_type: kernel-driver-timer - - name: "arm,cortex-a9-twd-timer" - display_name: "arm,cortex-a9-twd-timer" - description: "Arm cortex-a9 private timer seL4 driver" - maintainer: "seL4 Foundation" - status: "Active, currently used by the cortex-a9 seL4 platforms" - component_type: kernel-driver-timer - - name: "pc99,pit" - display_name: "pc99,pit" - description: "x86 PIT timer seL4 driver" - maintainer: "seL4 Foundation" - status: "Active, currently used by the pc99 seL4 platform" - component_type: kernel-driver-timer - - name: "tk1,smmu" - display_name: "tk1,smmu" - description: "Tegra K1 System MMU (SMMU) seL4 driver" - maintainer: "seL4 Foundation" - status: "Active, currently used by the tk1 seL4 platform" - component_type: kernel-driver-iommu - - name: "intel,vtd" - display_name: "intel,vtd" - description: "Intel VT-d (IOMMU) seL4 driver" - maintainer: "seL4 Foundation" - status: "Active, currently used by the pc99 seL4 platform" - component_type: kernel-driver-iommu - - name: "x86,serial" - display_name: "x86,serial" - description: "Intel COM port serial seL4 driver" - maintainer: "seL4 Foundation" - status: "Active, currently used by the pc99 seL4 platform" - component_type: kernel-driver-serial - - - name: am335x-boneblack.dts - display_name: am335x-boneblack.dts - description: "am335x-boneblack platform device tree (dts) sourced from Linux kernel path: am335x-boneblack" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: am335x-boneblue.dts - display_name: am335x-boneblue.dts - description: "am335x-boneblue platform device tree (dts) sourced from Linux kernel path: am335x-boneblue" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: rpi3.dts - display_name: rpi3.dts - description: "rpi3 platform device tree (dts) sourced from Linux kernel path: bcm2837-rpi-3-b" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: exynos4.dts - display_name: exynos4.dts - description: "exynos4 platform device tree (dts) sourced from Linux kernel path: exynos4412-odroidx" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: exynos5250.dts - display_name: exynos5250.dts - description: "exynos5250 platform device tree (dts) sourced from Linux kernel path: exynos5250-arndale" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: exynos5410.dts - display_name: exynos5410.dts - description: "exynos5410 platform device tree (dts) sourced from Linux kernel path: exynos5410-odroidxu" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: exynos5422.dts - display_name: exynos5422.dts - description: "exynos5422 platform device tree (dts) sourced from Linux kernel path: exynos5422-odroidxu4" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: sabre.dts - display_name: sabre.dts - description: "sabre platform device tree (dts) sourced from Linux kernel path: imx6q-sabrelite" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: wandq.dts - display_name: wandq.dts - description: "wandq platform device tree (dts) sourced from Linux kernel path: imx6q-wandboard-revd1" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: imx7sabre.dts - display_name: imx7sabre.dts - description: "imx7sabre platform device tree (dts) sourced from Linux kernel path: imx7d-sdb" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: omap3.dts - display_name: omap3.dts - description: "omap3 platform device tree (dts) sourced from Linux kernel path: omap3-beagle" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: apq8064.dts - display_name: apq8064.dts - description: "apq8064 platform device tree (dts) sourced from Linux kernel path: qcom-apq8064-ifc6410" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: allwinnera20.dts - display_name: allwinnera20.dts - description: "allwinnera20 platform device tree (dts) sourced from Linux kernel path: sun7i-a20-cubietruck" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: tk1.dts - display_name: tk1.dts - description: "tk1 platform device tree (dts) sourced from Linux kernel path: tegra124-jetson-tk1" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: zynq7000.dts - display_name: zynq7000.dts - description: "zynq7000 platform device tree (dts) sourced from Linux kernel path: zynq-zc706" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: odroidc2.dts - display_name: odroidc2.dts - description: "odroidc2 platform device tree (dts) sourced from Linux kernel path: amlogic/meson-gxbb-odroidc2" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: hikey.dts - display_name: hikey.dts - description: "hikey platform device tree (dts) sourced from Linux kernel path: hisilicon/hi6220-hikey" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: tx1.dts - display_name: tx1.dts - description: "tx1 platform device tree (dts) sourced from Linux kernel path: nvidia/tegra210-p2371-2180" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: ultra96.dts - display_name: ultra96.dts - description: "ultra96 platform device tree (dts) sourced from Linux kernel path: xilinx/avnet-ultra96-rev1" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: zynqmp.dts - display_name: zynqmp.dts - description: "zynqmp platform device tree (dts) sourced from Linux kernel path: xilinx/zynqmp-zcu102-rev1.0" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: imx8mq-evk.dts - display_name: imx8mq-evk.dts - description: "imx8mq-evk platform device tree (dts) sourced from Linux kernel path: freescale/fsl-imx8mq-evk" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: imx8mm-evk.dts - display_name: imx8mm-evk.dts - description: "imx8mm-evk platform device tree (dts) sourced from Linux kernel path: freescale/fsl-imx8mm-evk" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - - name: rockpro64.dts - display_name: rockpro64.dts - description: "rockpro64 platform device tree (dts) sourced from Linux kernel path: rockchip/rk3399-rockpro64" - maintainer: "seL4 Foundation" - status: "active" - component_type: kernel-device-tree - -roadmap: - - name: MCS - display_name: MCS Kernel extensions - description: A new scheduling model to support trustworthy mixed-criticality real-time systems. - assigned: UNSW - status: "In progress. Main API stable and available. Note: smaller API changes while verification is in progress." - roadmap_type: in-progress - - name: Microkit - display_name: seL4 Microkit - description: A simple operating systems framework for building systems on seL4. - assigned: UNSW - status: Ongoing research & development. Available for use. Detailed roadmap available here. - roadmap_type: in-progress - - name: sDDF - display_name: seL4 Device Driver Framework - description: A high-performance and secure driver framework for seL4. - assigned: UNSW - status: Ongoing research & development. Available for use. Find out more here. - roadmap_type: in-progress - - name: LionsOS - display_name: LionsOS - description: A secure, fast, and adaptable OS based on the seL4 Microkit. - assigned: UNSW - status: Ongoing research & development. An initial release containing a non-trivial example system has been made. Find out more here. - roadmap_type: in-progress diff --git a/_data/projects/sel4_tools.yml b/_data/projects/sel4_tools.yml deleted file mode 100644 index 69d58e2faf4..00000000000 --- a/_data/projects/sel4_tools.yml +++ /dev/null @@ -1,11 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: sel4_tools -display_name: seL4_tools -description: Provides tools used to build seL4 projects -project_order: 9 - -repositories: - - org: seL4 - repo: sel4_tools diff --git a/_data/projects/sel4bench.yml b/_data/projects/sel4bench.yml deleted file mode 100644 index db49dfb4507..00000000000 --- a/_data/projects/sel4bench.yml +++ /dev/null @@ -1,175 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: sel4bench -display_name: sel4bench -description: sel4bench contains benchmarking applications and a support library for seL4 -project_order: 7 - -repositories: - - org: seL4 - repo: sel4bench - - org: seL4 - repo: sel4bench-manifest - -components: - - name: sel4bench - display_name: sel4bench - description: "Driver process for seL4 benchmarking applications" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4bench-driver - - name: fault - display_name: Fault - description: "Fault delivery, measured from user space" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4bench-application - - name: hardware - display_name: Hardware - description: "Hardware-related seL4 operations" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4bench-application - - name: ipc - display_name: IPC - description: "A benchmark of the kernel IPC path" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4bench-application - - name: irq - display_name: IRQ - description: "The IRQ path, measured from inside the kernel." - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4bench-application - - name: irquser - display_name: IRQ user - description: "The IRQ path, measured from user space." - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4bench-application - - name: page_mapping - display_name: Page mapping - description: "Performance of mapping a series of pages" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4bench-application - - name: schedule - display_name: Scheduler - description: 'Benchmark for scheduling decisions, - using a producer/consumer pattern between two notification objects. - Also measures `seL4_Yield()`.' - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4bench-application - - name: signal - display_name: Signal - description: "The seL4 signal operation, measured from user space" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4bench-application - - name: smp - display_name: SMP - description: "Intra-core IPC round-trip benchmark to measure overhead of - kernel synchronization on IPC throughput." - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4bench-application - - name: sync - display_name: Synchronisation library - description: "Measuring the user-level seL4 sync library" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4bench-application - - name: vcpu - display_name: Aarch64 VCPU - description: "seL4 VCPU performance, including - privilege escalation from EL1 to EL2 with `HVC`, - privilege de-escalation from EL2 to EL1 with `ERET`, - null invocation of the EL2 kernel using `HVC`, - cost of `seL4_Call()` from an EL1 guest thread to a native seL4 - thread, and - cost of an `seL4_Reply()` from an seL4 native thread to an EL1 - guest thread. See the sel4bench repository - [README](https://github.com/seL4/sel4bench) - for instructions. - " - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4bench-application - - name: libsel4benchsupport - display_name: libsel4benchsupport - description: "Support library for writing benchmarking applications" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4bench-library - - name: Findsel4benchupport - display_name: "Findsel4benchupport" - description: "CMake module for libsel4benchsupport" - maintainer: "seL4 Foundation" - status: "active" - component_type: cmake-module - # Manifests - - name: master.xml - display_name: master.xml - description: "seL4bench project manifest with all repositories from master branches." - maintainer: "seL4 Foundation" - status: "active. Updated whenever project repository structure changes." - component_type: repo-manifest - - name: default.xml - display_name: default.xml - description: "seL4bench project manifest with all repositories pinned to last versions that successfully produced benchmark results." - maintainer: "seL4 Foundation" - status: "active. This gets updated automatically by continuous integration." - component_type: repo-manifest - -configurations: - - name: RELEASE - display_name: "RELEASE" - description: "Performance optimized build" - maintainer: "seL4 Foundation" - status: "(Default: ON)" - component_type: sel4test-option - - name: HARDWARE - display_name: "HARDWARE" - description: "Configuration for sel4bench hardware app" - maintainer: "seL4 Foundation" - status: "(Default: OFF)" - component_type: sel4test-option - - name: FAULT - display_name: "FAULT" - description: "Configuration sel4bench fault app" - maintainer: "seL4 Foundation" - status: "(Default: OFF)" - component_type: sel4test-option - - name: VCPU - display_name: "VCPU" - description: "Whether or not to run the VCPU benchmarks" - maintainer: "seL4 Foundation" - status: "(Default: OFF)" - component_type: sel4test-option - - name: SMP - display_name: "SMP" - description: "Configuration sel4bench smp app" - maintainer: "seL4 Foundation" - status: "(Default: OFF)" - component_type: sel4test-option - - name: PLATFORM - display_name: "PLATFORM" - description: "Platform to test" - maintainer: "seL4 Foundation" - status: "(Default: x86_64)" - component_type: sel4test-option - - name: FASTPATH - display_name: "FASTPATH" - description: "Turn fastpath on or off" - maintainer: "seL4 Foundation" - status: "(Default: ON)" - component_type: sel4test-option - - name: ARM_HYP - display_name: "ARM_HYP" - description: "ARM EL2 hypervisor features on or off" - maintainer: "seL4 Foundation" - status: "(Default: OFF)" - component_type: sel4test-option diff --git a/_data/projects/sel4runtime.yml b/_data/projects/sel4runtime.yml deleted file mode 100644 index b9b8372b552..00000000000 --- a/_data/projects/sel4runtime.yml +++ /dev/null @@ -1,37 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: sel4runtime -display_name: The seL4 run-time -description: A minimal runtime for running a C or C-compatible process in a minimal seL4 environment -project_order: 6 - -repositories: - - org: seL4 - repo: sel4runtime - -components: - - name: sel4runtime - display_name: "The seL4 C run-time" - description: "A minimal C run-time for use with ELF processes on seL4" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4runtime - - name: libsel4runtime - display_name: "The seL4 C run-time library" - description: "Library to interface with the seL4 C run-time" - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4runtime-library - - name: Findsel4runtime - display_name: "Findsel4runtime" - description: "CMake module for sel4runtime" - maintainer: "seL4 Foundation" - status: "active" - component_type: cmake-module - - name: sel4runtimeConfig - display_name: "sel4runtime Configuration library" - description: "Configuration library containing sel4runtime build configuration values." - maintainer: "seL4 Foundation" - status: "active" - component_type: config-library diff --git a/_data/projects/sel4test.yml b/_data/projects/sel4test.yml deleted file mode 100644 index 575a41d9c66..00000000000 --- a/_data/projects/sel4test.yml +++ /dev/null @@ -1,142 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: sel4test -display_name: seL4Test -description: Test suite for seL4 -project_order: 7 - -repositories: - - org: sel4 - repo: sel4test - - org: sel4 - repo: sel4test-manifest - -components: - - name: sel4test-driver - display_name: sel4test-driver - description: "The rootserver for the seL4 test suite." - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4test-application - - name: sel4test-tests - display_name: sel4test-tests - description: "The seL4 test suite." - maintainer: "seL4 Foundation" - status: "active" - component_type: sel4test-application - # Manifests - - name: master.xml - display_name: master.xml - description: "seL4test project manifest with all repositories from master branches." - maintainer: "seL4 Foundation" - status: "active. Updated whenever project repository structure changes." - component_type: repo-manifest - - name: default.xml - display_name: default.xml - description: "seL4test project manifest with all repositories pinned to last versions that passed all tests." - maintainer: "seL4 Foundation" - status: "active. This gets updated automatically by continuous integration." - component_type: repo-manifest - - # Test environments - - name: basic-testtype - display_name: BASIC test type - description: "General test type where test is launched in own process and can report test results to driver over IPC." - maintainer: "seL4 Foundation" - status: "active" - component_type: test-environment - - name: bootstrap-testtype - display_name: BOOTSTRAP test type - description: "Bootstrapping test type where each test is called in the same address space as the test driver. Used for testing functionality required for BASIC test type." - maintainer: "seL4 Foundation" - status: "active." - component_type: test-environment - - # Tests.... - -configurations: - - name: SIMULATION - display_name: "SIMULATION" - description: "Include only simulation compatible tests" - maintainer: "seL4 Foundation" - status: "(Default: OFF)" - component_type: sel4test-option - - name: RELEASE - display_name: "RELEASE" - description: "Performance optimized build" - maintainer: "seL4 Foundation" - status: "(Default: OFF)" - component_type: sel4test-option - - name: VERIFICATION - display_name: "VERIFICATION" - description: "Only verification friendly kernel features" - maintainer: "seL4 Foundation" - status: "(Default: OFF)" - component_type: sel4test-option - - name: BAMBOO - display_name: "BAMBOO" - description: "Enable machine parseable xml output" - maintainer: "seL4 Foundation" - status: "(Default: OFF)" - component_type: sel4test-option - - name: DOMAINS - display_name: "DOMAINS" - description: "Test multiple domains" - maintainer: "seL4 Foundation" - status: "(Default: OFF)" - component_type: sel4test-option - - name: SMP - display_name: "SMP" - description: "(if supported) Test SMP kernel" - maintainer: "seL4 Foundation" - status: "(Default: OFF)" - component_type: sel4test-option - - name: NUM_NODES - display_name: "NUM_NODES" - description: "(if SMP) The number of nodes" - maintainer: "seL4 Foundation" - status: "(Default: 4)" - component_type: sel4test-option - - name: PLATFORM - display_name: "PLATFORM" - description: "Platform to test" - maintainer: "seL4 Foundation" - status: "(Default: x86_64)" - component_type: sel4test-option - - name: ARM_HYP - display_name: "ARM_HYP" - description: "Hyp mode for ARM platforms" - maintainer: "seL4 Foundation" - status: "(Default: OFF)" - component_type: sel4test-option - - name: MCS - display_name: "MCS" - description: "MCS kernel" - maintainer: "seL4 Foundation" - status: "(Default: OFF)" - component_type: sel4test-option - - name: KernelSel4Arch - display_name: "KernelSel4Arch" - description: "aarch32, aarch64, arm_hyp, ia32, x86_64, riscv32, riscv64" - maintainer: "seL4 Foundation" - status: "(Default: set by PLATFORM)" - component_type: sel4test-option - - name: LibSel4TestPrinterRegex - display_name: "LibSel4TestPrinterRegex" - description: "A POSIX regex pattern used to filter tests" - maintainer: "seL4 Foundation" - status: "(Default: .*)" - component_type: sel4test-option - - name: LibSel4TestPrinterHaltOnTestFailure - display_name: "LibSel4TestPrinterHaltOnTestFailure" - description: "Halt on the first test failure" - maintainer: "seL4 Foundation" - status: "(Default: OFF)" - component_type: sel4test-option - - name: Sel4testAllowSettingsOverride - display_name: "Sel4testAllowSettingsOverride" - description: "Do not use meta options above, expect manual user config settings for the kernel instead" - maintainer: "seL4 Foundation" - status: "(Default: OFF)" - component_type: sel4test-option diff --git a/_data/projects/sel4webserver.yml b/_data/projects/sel4webserver.yml deleted file mode 100644 index 8605a59e65c..00000000000 --- a/_data/projects/sel4webserver.yml +++ /dev/null @@ -1,57 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: sel4webserver -display_name: seL4webserver -description: A reference for implementing applications on seL4 -project_order: 7 - -repositories: - - org: seL4 - repo: sel4webserver - - org: seL4 - repo: sel4webserver-manifest - -components: - - name: Finddocsite - display_name: "Finddocsite" - description: "CMake module for building and installing an instance of the docsite in the vm filesystem, to be served by lighttpd." - maintainer: "UNSW" - status: "active" - component_type: cmake-module - - name: Findlighttpd - display_name: "Findlighttpd" - description: "CMake module for building and installing lighttpd in the VM filesystem." - maintainer: "UNSW" - status: "active" - component_type: cmake-module - - name: main - display_name: "main" - description: "CAmkES main module for running a single VM with lighttpd serving the docsite." - maintainer: "UNSW" - status: "active" - component_type: camkes-module - - name: exynos-devices - display_name: "exynos-devices" - description: "CAmkES description of exynos5422 devices for single VM webserver" - maintainer: "UNSW" - status: "active" - component_type: camkes-module - - name: exynos-multi-devices - display_name: "exynos-multi-devices" - description: "CAmkES description of exynos5422 devices for multi VM webserver" - maintainer: "UNSW" - status: "active" - component_type: camkes-module - - name: qemu-arm-virt-devices - display_name: "qemu-arm-virt-devices" - description: "CAmkES description of qemu-arm-virt devices for single VM webserver" - maintainer: "UNSW" - status: "active" - component_type: camkes-module - - name: overlay-files - display_name: "overlay-files" - description: "Files to be added to the VM filesystem overlay, mostly network setup" - maintainer: "UNSW" - status: "active" - component_type: init-script diff --git a/_data/projects/user_libs.yml b/_data/projects/user_libs.yml deleted file mode 100644 index 87ac1135365..00000000000 --- a/_data/projects/user_libs.yml +++ /dev/null @@ -1,1068 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: user_libs -display_name: user_libs -description: Userlevel libraries on seL4 -project_order: 6 - -repositories: - - org: sel4 - repo: util_libs - - org: sel4 - repo: sel4_libs - - org: sel4 - repo: sel4_projects_libs - - org: sel4 - repo: projects_libs - -components: - - name: libcpio - display_name: libcpio - description: "A library for parsing files in CPIO format." - maintainer: "seL4 Foundation" - status: "active" - component_type: util_libs - - name: libelf - display_name: libelf - description: "A library for reading ELF files." - maintainer: "seL4 Foundation" - status: "active" - component_type: util_libs - - name: libethdrivers - display_name: libethdrivers - description: "A library for ethernet drivers on selected platforms, supporting lwIP and picoTCP." - maintainer: "seL4 Foundation" - status: "active" - component_type: util_libs - - name: libfdt - display_name: libfdt - description: "A library for flat device tree manipulation, ported from linux kernel version: 5.0.6." - maintainer: "seL4 Foundation" - status: "inactive" - component_type: util_libs - - name: liblwip - display_name: liblwip - description: "A library for the lwIP, ported from lwip-1.4.1." - maintainer: "seL4 Foundation" - status: "inactive" - component_type: util_libs - - name: libpci - display_name: libpci - description: "A library for PCI drivers." - maintainer: "seL4 Foundation" - status: "active" - component_type: util_libs - - name: libpicotcp - display_name: libpicotcp - description: "A library of picoTCP header files." - maintainer: "seL4 Foundation" - status: "active" - component_type: util_libs - - name: libplatsupport - display_name: libplatsupport - description: "A library of platform support utilities, interfaces for interacting with drivers, timer drivers, serial drivers and clock drivers." - maintainer: "seL4 Foundation" - status: "active" - component_type: util_libs - - name: libutils - display_name: libutils - description: "A library of generic utilities, such as debugging macros and compile time asserts." - maintainer: "seL4 Foundation" - status: "active" - component_type: util_libs - - name: libsel4allocman - display_name: libsel4allocman - description: "An allocator for managing virtual memory, malloc memory and cspaces." - maintainer: "seL4 Foundation" - status: "active" - component_type: seL4_libs - - name: libsel4bench - display_name: libsel4bench - description: "A library of benchmarking utilities on seL4, such as logging and PMU event counters." - maintainer: "seL4 Foundation" - status: "active" - component_type: seL4_libs - - name: libsel4debug - display_name: libsel4debug - description: "A library for debugging userspace applications on seL4." - maintainer: "seL4 Foundation" - status: "active" - component_type: seL4_libs - - name: libsel4muslcsys - display_name: libsel4muslcsys - description: "A library of minimal muslc syscall implementation for seL4." - maintainer: "seL4 Foundation" - status: "active" - component_type: seL4_libs - - name: libsel4platsupport - display_name: libsel4platsupport - description: "A wrapper around libplatsupport specificially for seL4." - maintainer: "seL4 Foundation" - status: "active" - component_type: seL4_libs - - name: libsel4serialserver - display_name: libsel4serialserver - description: "A library for creating serial servers. A server thread is able to connect to a serial device and act as a multiplexer for writes." - maintainer: "seL4 Foundation" - status: "active" - component_type: seL4_libs - - name: libsel4simple - display_name: libsel4simple - description: "An interface which abstracts over the boot environment of an seL4 application." - maintainer: "seL4 Foundation" - status: "active" - component_type: seL4_libs - - name: libsel4simple-default - display_name: libsel4simple-default - description: "An implementation of libsel4simple for the master branch of the seL4 kernel." - maintainer: "seL4 Foundation" - status: "active" - component_type: seL4_libs - - name: libsel4sync - display_name: libsel4sync - description: "A synchronisation library that uses notifications to construct basic locks." - maintainer: "seL4 Foundation" - status: "active" - component_type: seL4_libs - - name: libsel4test - display_name: libsel4test - description: "A library for running tests and generating test output in either human readable or xml format." - maintainer: "seL4 Foundation" - status: "active" - component_type: seL4_libs - - name: libsel4utils - display_name: libsel4utils - description: "A library of OS-like utilities for building benchmarks and applications on seL4." - maintainer: "seL4 Foundation" - status: "active" - component_type: seL4_libs - - name: libsel4vka - display_name: libsel4vka - description: "An allocation interface for seL4." - maintainer: "seL4 Foundation" - status: "active" - component_type: seL4_libs - - name: libsel4vspace - display_name: libsel4vspace - description: "A virtual memory management interface for seL4. " - maintainer: "seL4 Foundation" - status: "active" - component_type: seL4_libs - - name: libsel4bga - display_name: libsel4bga - description: "A basic driver for the Bochs Graphics Adaptor, currently only supports the x86 IA32 architecture." - maintainer: "seL4 Foundation" - status: "inactive" - component_type: seL4_projects_libs - - name: libsel4dma - display_name: libsel4dma - description: "An allocator for managing DMA memory." - maintainer: "seL4 Foundation" - status: "active" - component_type: seL4_projects_libs - - name: libsel4keyboard - display_name: libsel4keyboard - description: "A basic keyboard driver." - maintainer: "seL4 Foundation" - status: "active" - component_type: seL4_projects_libs - - name: libsel4nanopb - display_name: libsel4nanopb - description: "An interface between seL4 IPC buffers and nanopb. Nanopb is a small code-size Protocol Buffers implementation in ANSI C." - maintainer: "seL4 Foundation" - status: "active" - component_type: seL4_projects_libs - - name: libsel4rpc - display_name: libsel4rpc - description: "A library for allocating resources over process boundaries. It defines a Protocol Buffer protocol, and contains wrappers for processing RPC messages used by servers." - maintainer: "seL4 Foundation" - status: "active" - component_type: seL4_projects_libs - - name: libsel4vchan - display_name: libsel4vchan - description: "A vchan implementation on seL4, which provides communication channels between virtual machines." - maintainer: "seL4 Foundation" - status: "inactive" - component_type: seL4_projects_libs - - name: libfdtgen - display_name: libfdtgen - description: "A library for generating flattened device trees which can be passed to virtual machines." - maintainer: "seL4 Foundation" - status: "active" - component_type: projects_libs - - name: libjansson - display_name: libjansson - description: "The port of Jansson-2.7 to seL4 and the seL4 project build system." - maintainer: "seL4 Foundation" - status: "inactive" - component_type: projects_libs - - name: libmsgpack - display_name: libmsgpack - description: "An seL4 build system wrapper to build msgpack-c, a library for dealing with MessagePack data." - maintainer: "seL4 Foundation" - status: "inactive" - component_type: projects_libs - - name: libnfs - display_name: libnfs - description: "A wrapper for supporting project build for a given network file system implementation." - maintainer: "seL4 Foundation" - status: "inactive" - component_type: projects_libs - - name: libplatsupportports - display_name: libplatsupportports - description: "A collection of drivers proted from GPL-based sources such as U-Boot and Linux." - maintainer: "seL4 Foundation" - status: "active" - component_type: projects_libs - - name: libringbuffer - display_name: libringbuffer - description: "A library of the ring buffer implementation." - maintainer: "seL4 Foundation" - status: "inactive" - component_type: projects_libs - - name: libsdhcdrivers - display_name: libsdhcdrivers - description: "A library of the SD card driver." - maintainer: "seL4 Foundation" - status: "inactive" - component_type: projects_libs - - name: libtx2bpmp - display_name: libtx2bpmp - description: "A port of the Tegra186 Boot and Power Management Processor (BPMP) interfaces from U-Boot to seL4." - maintainer: "seL4 Foundation" - status: "active" - component_type: projects_libs - - name: libusbdrivers - display_name: libusbdrivers - description: "A USB driver." - maintainer: "seL4 Foundation" - status: "inactive" - component_type: projects_libs - - name: libvirtqueue - display_name: libvirtqueue - description: "A library implementation of a virtqueue inspired from the virtio specification." - maintainer: "seL4 Foundation" - status: "active" - component_type: projects_libs - - name: libvswitch - display_name: libvswitch - description: "A library implementation of a vswitch, which is designed for providing an interface to manage and route data between components identified by a MAC address." - maintainer: "seL4 Foundation" - status: "active" - component_type: projects_libs -# Drivers - - name: arch/x86/delay.c - display_name: "arch/x86/delay.c" - description: "x86 busy wait delay driver by spinning on tsc value" - maintainer: "seL4 Foundation" - status: "Supported on x86 but currently unused by anything." - component_type: user-driver-other - - name: arch/x86/tsc.c - display_name: "arch/x86/tsc.c" - description: "Calculates tsc frequency using HPET or PIT" - maintainer: "seL4 Foundation" - status: "Supported on x86. It may be better to use the tsc_freq Bootinfo field that seL4 provides." - component_type: user-driver-other - - name: arch/arm/generic_timer.c - display_name: "arch/arm/generic_timer.c" - description: "Arm generic timer driver. Should be used for debugging or development configurations only as register access is global." - maintainer: "seL4 Foundation" - status: "Requires configuring seL4 to make the Physical timer registers available to user level." - component_type: user-driver-timer - - name: arch/arm/generic_ltimer.c - display_name: "arch/arm/generic_ltimer.c" - description: "ltimer implementation for Arm generic timer physical timer. Should be used for debugging or development configurations only as register access is global" - maintainer: "seL4 Foundation" - status: "Requires configuring seL4 to make the Physical timer registers available to user level." - component_type: user-driver-ltimer - - name: arch/arm/delay.c - display_name: "arch/arm/delay.c" - description: "arm busy wait delay driver by repeatedly performing no-op instructions" - maintainer: "seL4 Foundation" - status: "Supported on arm but currently relies on each instruction taking a constant amount of time" - component_type: user-driver-other - # FIXME: commented out, should use filter - # - name: arch/arm/dma330.c - # display_name: "arch/arm/dma330.c" - # description: "ARM PL-330 (DMA-330) DMA controller" - # maintainer: "seL4 Foundation" - # status: "Unused currently" - # component_type: user-driver-other - - name: arch/arm/i2c_bitbang.c - display_name: "arch/arm/i2c_bitbang.c" - description: "Transforms a GPIO interface into an I2C bitbang interface" - maintainer: "seL4 Foundation" - status: "Currently used by libusbdrivers." - component_type: user-driver-i2c - - name: local_time_manager.c - display_name: "local_time_manager.c" - description: "Uses an ltimer to provide timeout multiplexing across several clients" - maintainer: "seL4 Foundation" - status: "Requires ltimer implementation for the target platform." - component_type: user-driver-ltimer - - name: plat/rockpro64/timer.c - display_name: "plat/rockpro64/timer.c" - description: "rockchip,rk3399-timer driver" - maintainer: "seL4 Foundation" - status: "Supported on rockpro64 platform" - component_type: user-driver-timer - - name: plat/rockpro64/serial.c - display_name: "plat/rockpro64/serial.c" - description: "rockchip,rk3399-uart driver" - maintainer: "seL4 Foundation" - status: "Supported on rockpro64 platform" - component_type: user-driver-serial - - name: plat/rockpro64/ltimer.c - display_name: "plat/rockpro64/ltimer.c" - description: "rockpro64 ltimer implementation using 2 rk3399-timers" - maintainer: "seL4 Foundation" - status: "Supported on rockpro64 platform" - component_type: user-driver-ltimer - - name: plat/bcm2837/spt.c - display_name: "plat/bcm2837/spt.c" - description: "rpi3 spt timer driver. The timer is based on a SP804 timer with some modifications." - maintainer: "seL4 Foundation" - status: "Supported on rpi3 platform" - component_type: user-driver-timer - - name: plat/bcm2837/serial.c - display_name: "plat/bcm2837/serial.c" - description: "rpi3 brcm,bcm2835-aux-uart UART driver" - maintainer: "seL4 Foundation" - status: "Supported on rpi3 platform" - component_type: user-driver-serial - - name: plat/bcm2837/system_timer.c - display_name: "plat/bcm2837/system_timer.c" - description: "rpi3 system timer driver." - maintainer: "seL4 Foundation" - status: "Supported on rpi3 platform" - component_type: user-driver-timer - - name: plat/bcm2837/ltimer.c - display_name: "plat/bcm2837/ltimer.c" - description: "rpi3 ltimer implementation using the system timer and spt timer" - maintainer: "seL4 Foundation" - status: "Supported on rpi3 platform" - component_type: user-driver-ltimer - - name: plat/zynq7000/devcfg.c - display_name: "plat/zynq7000/devcfg.c" - description: "devcfg (Device configuration Interface) zynq7000 driver" - maintainer: "seL4 Foundation" - status: "Supported only for zynq7000 platform. Only functionality is mapping registers and providing a reference." - component_type: user-driver-other - - name: plat/zynq7000/tmu.c - display_name: "plat/zynq7000/tmu.c" - description: "Temperature sensor driver for zynq7000 tmu." - maintainer: "seL4 Foundation" - status: "Supported on zynq7000 platform." - component_type: user-driver-other - - name: plat/zynq7000/clock.c - display_name: "plat/zynq7000/clock.c" - description: "zynq7000 clock subsystem driver" - maintainer: "seL4 Foundation" - status: "Supported on zynq7000 platform." - component_type: user-driver-clock - - name: plat/zynq7000/xadc.c - display_name: "plat/zynq7000/xadc.c" - description: "zynq7000 XADC driver" - maintainer: "seL4 Foundation" - status: "Supported on zynq7000 platform. Currently only used to read values from a temperature monitoring unit." - component_type: user-driver-other - - name: plat/zynq7000/src.c - display_name: "plat/zynq7000/src.c" - description: "zynq7000 System Level Control Registers driver" - maintainer: "seL4 Foundation" - status: "Supported on zynq7000 platform. Currently used to unlock clock and reset registers only." - component_type: user-driver-other - - name: plat/exynos5/sysreg.c - display_name: "plat/exynos5/sysreg.c" - description: "exynos5 samsung,exynos5-sysreg system control driver" - maintainer: "seL4 Foundation" - status: "Supported on exynos5 platforms. Currently can only be used to enable power for USB PHYs." - component_type: user-driver-other - - name: plat/exynos5/clock.c - display_name: "plat/exynos5/clock.c" - description: "exynos5 clock subsystem driver" - maintainer: "seL4 Foundation" - status: "Supported on exynos5 platform." - component_type: user-driver-clock - - name: plat/odroidc2/serial.c - display_name: "plat/odroidc2/serial.c" - description: "odroidc2 amlogic,meson-gx-uart uart driver" - maintainer: "seL4 Foundation" - status: "Supported on odroidc2 platform" - component_type: user-driver-serial - - name: plat/odroidc2/ltimer.c - display_name: "plat/odroidc2/ltimer.c" - description: "odroidc2 ltimer implementation using the meson timer" - maintainer: "seL4 Foundation" - status: "Supported on odroidc2 platform" - component_type: user-driver-ltimer - - name: plat/odroidc2/meson_timer.c - display_name: "plat/odroidc2/meson_timer.c" - description: "odroidc2 meson timer implementation" - maintainer: "seL4 Foundation" - status: "Supported on odroidc2 platform" - component_type: user-driver-timer - - name: plat/am335x/timer.c - display_name: "plat/am335x/timer.c" - description: "am335x ti,am335x-timer driver for DMTimer" - maintainer: "seL4 Foundation" - status: "Supported on am335x platforms." - component_type: user-driver-timer - - name: plat/am335x/serial.c - display_name: "plat/am335x/serial.c" - description: "am335x ti,am3352-uart serial driver" - maintainer: "seL4 Foundation" - status: "Supported on am335x platforms." - component_type: user-driver-serial - - name: plat/am335x/ltimer.c - display_name: "plat/am335x/ltimer.c" - description: "am335x ltimer implementation using 2 DMTimers" - maintainer: "seL4 Foundation" - status: "Supported on am335x platforms." - component_type: user-driver-ltimer - - name: plat/am335x/i2c.c - display_name: "plat/am335x/i2c.c" - description: "am335x ti,omap4-i2c driver for I2C." - maintainer: "seL4 Foundation" - status: "Supported on am335x platforms." - component_type: user-driver-i2c - - name: plat/tk1/mux.c - display_name: "plat/tk1/mux.c" - description: "tk1 nvidia,tegra124-pinmux pinmux driver" - maintainer: "seL4 Foundation" - status: "Supported on tk1 platform" - component_type: user-driver-pinmux - - name: plat/tk1/clock.c - display_name: "plat/tk1/clock.c" - description: "tk1 nvidia,tegra124-car clock subsystem driver" - maintainer: "seL4 Foundation" - status: "Supported on tk1 platform." - component_type: user-driver-clock - - name: plat/tk1/spi.c - display_name: "plat/tk1/spi.c" - description: "tk1 nvidia,tegra124-spi SPI driver" - maintainer: "seL4 Foundation" - status: "Supported on tk1 platform." - component_type: user-driver-other - - name: plat/tk1/i2c.c - display_name: "plat/tk1/i2c.c" - description: "tk1 nvidia,tegra124-i2c I2C driver" - maintainer: "seL4 Foundation" - status: "Supported on tk1 platform." - component_type: user-driver-i2c - - name: plat/tk1/gpio.c - display_name: "plat/tk1/gpio.c" - description: "tk1 nvidia,tegra124-gpio GPIO driver" - maintainer: "seL4 Foundation" - status: "Supported on i2c platform." - component_type: user-driver-gpio - - name: plat/fvp/serial.c - display_name: "plat/fvp/serial.c" - description: "fvp arm,pl011 serial driver" - maintainer: "seL4 Foundation" - status: "Derived from the pl011 driver for the hikey platform." - component_type: user-driver-serial - - name: plat/fvp/sp804.c - display_name: "plat/fvp/sp804.c" - description: "fvp arm,sp804 timer driver" - maintainer: "seL4 Foundation" - status: "Derived from the sp804 driver for the hikey platform." - component_type: user-driver-timer - - name: plat/fvp/ltimer.c - display_name: "plat/fvp/ltimer.c" - description: "fvp ltimer implementation using 2 sp804 timers." - maintainer: "seL4 Foundation" - status: "Supported on fvp platform." - component_type: user-driver-ltimer - - name: plat/exynos4/clock.c - display_name: "plat/exynos4/clock.c" - description: "exynos4 clock subsystem driver" - maintainer: "seL4 Foundation" - status: "Supported on exynos4 platform." - component_type: user-driver-clock - - name: plat/exynos4/src.c - display_name: "plat/exynos4/src.c" - description: "exynos4 samsung,exynos4-sysreg system control driver" - maintainer: "seL4 Foundation" - status: "Supported on exynos4 platforms. Currently can only be used to enable power for USB PHYs." - component_type: user-driver-other - - name: plat/hikey/serial.c - display_name: "plat/hikey/serial.c" - description: "hikey arm,pl011 Serial driver" - maintainer: "seL4 Foundation" - status: "Supported on Hikey platform. Could likely be extended to other platforms." - component_type: user-driver-serial - - name: plat/hikey/ltimer.c - display_name: "plat/hikey/ltimer.c" - description: "hikey ltimer implementation using 2 sp804 timers" - maintainer: "seL4 Foundation" - status: "Supported on hikey platform." - component_type: user-driver-ltimer - - name: plat/hikey/rtc.c - display_name: "plat/hikey/rtc.c" - description: "hikey arm,pl031 RTC driver" - maintainer: "seL4 Foundation" - status: "Supported on Hikey platform. Could likely be extended to other platforms." - component_type: user-driver-timer - - name: plat/hikey/dmt.c - display_name: "plat/hikey/dmt.c" - description: "hikey arm,sp804 timer driver" - maintainer: "seL4 Foundation" - status: "Supported on Hikey platform. Could likely be extended to other platforms." - component_type: user-driver-timer - - name: plat/qemu-arm-virt/serial.c - display_name: "plat/qemu-arm-virt/serial.c" - description: "qemu-arm-virt arm,pl011 serial driver" - maintainer: "seL4 Foundation" - status: "Derived from the pl011 driver for the hikey platform." - component_type: user-driver-serial - # FIXME: commented out for now, should use a filter instead - # - name: plat/apq8064/timer.c - # display_name: "plat/apq8064/timer.c" - # description: "apq8064 timer driver" - # maintainer: "seL4 Foundation" - # status: "Supported on apq8064 platform. (Platform is currently unmaintained)" - # component_type: user-driver-timer - # - name: plat/apq8064/serial.c - # display_name: "plat/apq8064/serial.c" - # description: "apq8064 qcom,gsbi-v1.0.0 serial driver" - # maintainer: "seL4 Foundation" - # status: "Supported on apq8064 platform. (Platform is currently unmaintained)" - # component_type: user-driver-serial - # - name: plat/apq8064/clock.c - # display_name: "plat/apq8064/clock.c" - # description: "apq8064 qcom,gcc-apq8064 clock subsystem driver" - # maintainer: "seL4 Foundation" - # status: "Supported on apq8064 platform. (Platform is currently unmaintained)" - # component_type: user-driver-clock - - name: plat/hifive/pwm.c - display_name: "plat/hifive/pwm.c" - description: "hifive sifive,pwm0 timer driver" - maintainer: "seL4 Foundation" - status: "Supported on hifive platform" - component_type: user-driver-timer - - name: plat/hifive/ltimer.c - display_name: "plat/hifive/ltimer.c" - description: "ltimer implementation for the hifive platform using two PWM timers" - maintainer: "seL4 Foundation" - status: "Supported on hifive platform" - component_type: user-driver-ltimer - - name: plat/hifive/uart.c" - display_name: "plat/hifive/uart.c" - description: "hifive sifive,uart0 UART serial driver" - maintainer: "seL4 Foundation" - status: "Supported on hifive platform" - component_type: user-driver-serial - - name: plat/pc99/keyboard_chardev.c - display_name: "plat/pc99/keyboard_chardev.c" - description: "chardev implementation for the pc99 keyboard which uses the pc99 PS/2 driver" - maintainer: "seL4 Foundation" - status: "Supported on pc99 platform" - component_type: user-driver-chardev - - name: plat/pc99/acpi/ - display_name: "plat/pc99/acpi/*" - description: "ACPI driver for the ACPI interface in the pc99 platform" - maintainer: "seL4 Foundation" - status: "Supported on pc99 platform" - component_type: user-driver-acpi - - name: plat/pc99/serial.c - display_name: "plat/pc99/serial.c" - description: "UART serial driver for the serial devices on the pc99 platform" - maintainer: "seL4 Foundation" - status: "Supported on pc99 platform" - component_type: user-driver-serial - - name: plat/pc99/keyboard_ps2.c - display_name: plat/pc99/keyboard_ps2.c - description: "Keyboard driver for the pc99 platform over the PS/2 keyboard interface" - maintainer: "seL4 Foundation" - status: "Supported on pc99 platform" - component_type: user-driver-keyboard - - name: plat/pc99/keyboard_vkey.c - display_name: "plat/pc99/keyboard_vkey.c" - description: "Virtual keycodes for the pc99 PS/2 keyboard driver" - maintainer: "seL4 Foundation" - status: "Supported on pc99 platform" - component_type: user-driver-keyboard - - name: plat/pc99/ltimer.c - display_name: "plat/pc99/ltimer.c" - description: "ltimer implementation for the pc99 platform using either PIT or HPET timers" - maintainer: "seL4 Foundation" - status: "Supported on pc99 platform" - component_type: user-driver-ltimer - - name: plat/pc99/pit.c - display_name: "plat/pc99/pit.c" - description: "PIT driver for the PIT (Programmable Interval Timer) on the pc99 platform" - maintainer: "seL4 Foundation" - status: "Supported on pc99 platform" - component_type: user-driver-timer - - name: plat/pc99/rtc.c - display_name: "plat/pc99/rtc.c" - description: "RTC driver for the RTC on the pc99 platform" - maintainer: "seL4 Foundation" - status: "Supported on pc99 platform" - component_type: user-driver-timer - - name: plat/pc99/ega.c - display_name: "plat/pc99/ega.c" - description: "EGA driver for the EGA (Enhanced Graphics Adapter) device on the pc99 platform" - maintainer: "seL4 Foundation" - status: "Supported on pc99 platform" - component_type: user-driver-serial - - name: plat/pc99/hpet.c - display_name: "plat/pc99/hpet.c" - description: "HPET driver for the HPET (High Precision Event Timer) device on the pc99 platform" - maintainer: "seL4 Foundation" - status: "Supported on pc99 platform" - component_type: user-driver-timer - - name: plat/omap3/serial.c - display_name: "plat/omap3/serial.c" - description: "omap3 ti,omap3-uart UART serial driver" - maintainer: "seL4 Foundation" - status: "Supported on omap3 platform" - component_type: user-driver-serial - # FIXME: commented out, should use a filter instead - # - name: plat/omap3/mux.c - # display_name: "plat/omap3/mux.c" - # description: "omap3 ti,omap3-padconf pin controller driver" - # maintainer: "seL4 Foundation" - # status: "Non-functional skeleton implementation, supported on omap3 platform" - # component_type: user-driver-pinmux - # - name: plat/omap3/clock.c - # display_name: "plat/omap3/clock.c" - # description: "omap3 ti,omap3-cm clock controller driver" - # maintainer: "seL4 Foundation" - # status: "Non-functional skeleton implementation, supported on omap3 platform" - # component_type: user-driver-clock - # - name: plat/rocketchip/serial.c - # display_name: "plat/rocketchip/serial.c" - # description: "Empty driver implementation for the serial device on the rocketchip platform." - # maintainer: "seL4 Foundation" - # status: "Non-functional skeleton implementation, supported on rocketchip platform" - # component_type: user-driver-serial - # - name: plat/rocketchip/chardev.c - # display_name: "plat/rocketchip/chardev.c" - # description: "Empty chardev implementation for the rocketchip platform." - # maintainer: "seL4 Foundation" - # status: "Non-functional skeleton implementation, supported on rocketchip platform" - # component_type: user-driver-serial - - name: plat/imx6/mux.c - display_name: "plat/imx6/mux.c" - description: "i.MX6 fsl,imx6q-iomuxc IO MUX driver" - maintainer: "seL4 Foundation" - status: "Supported on sabre" - component_type: user-driver-pinmux - - name: plat/imx6/clock.c - display_name: "plat/imx6/clock.c" - description: "i.MX6 fsl,imx6q-ccm clock subsystem driver" - maintainer: "seL4 Foundation" - status: "Supported on sabre platform" - component_type: user-driver-clock - - name: plat/imx6/i2c.c - display_name: "plat/imx6/i2c.c" - description: "i.MX6 fsl,imx6q-i2c driver I2C" - maintainer: "seL4 Foundation" - status: "Supported on sabre platform" - component_type: user-driver-i2c - - name: plat/imx6/gpio.c - display_name: "plat/imx6/gpio.c" - description: "i.MX6 fsl,imx6q-gpio GPIO driver" - maintainer: "seL4 Foundation" - status: "Supported on sabre platform" - component_type: user-driver-gpio - - name: plat/imx6/src.c - display_name: "plat/imx6/src.c" - description: "i.MX6 fsl,imx6q-src reset controller driver" - maintainer: "seL4 Foundation" - status: "Supported on sabre platform" - component_type: user-driver-reset - - name: mach/omap/gpt.c - display_name: "mach/omap/gpt.c" - description: "GPT driver for the GPT timers in the OMAP SoCs" - maintainer: "seL4 Foundation" - status: "Supported on OMAP SoCs" - component_type: user-driver-timer - - name: mach/omap/ltimer.c - display_name: "mach/omap/ltimer.c" - description: "ltimer implementation for the OMAP platforms using GPT timers" - maintainer: "seL4 Foundation" - status: "Supported on OMAP SoCs" - component_type: user-driver-other - - name: mach/imx/epit/epit.c - display_name: "mach/imx/epit/epit.c" - description: "EPIT driver for the EPIT timers in the i.MX SoCs" - maintainer: "seL4 Foundation" - status: "Supported on i.MX SoCs" - component_type: user-driver-timer - - name: mach/imx/ltimer.c - display_name: "mach/imx/ltimer.c" - description: "ltimer implementation for the i.MX platforms using a combination of GPT and EPIT timers" - maintainer: "seL4 Foundation" - status: "Supported on i.MX SoCs" - component_type: user-driver-ltimer - - name: mach/imx/serial/serial.c - display_name: "mach/imx/serial/serial.c" - description: "UART serial drivers for the UART devices in the i.MX SoCs" - maintainer: "seL4 Foundation" - status: "Supported on i.MX SoCs" - component_type: user-driver-serial - - name: mach/imx/gpt.c - display_name: "mach/imx/gpt.c" - description: "GPT driver for the GPT timers in the i.MX SoCs" - maintainer: "seL4 Foundation" - status: "Supported on i.MX SoCs" - component_type: user-driver-timer - - name: mach/exynos/clock/exynos_common_clock.c - display_name: "mach/exynos/clock/exynos_common_clock.c" - description: "Exynos platform-common functions to manipulate the clock device in the Exynos SoCs" - maintainer: "seL4 Foundation" - status: "Supported on Exynos SoCs" - component_type: user-driver-timer - - name: mach/exynos/clock/exynos_5422_clock.c - display_name: "mach/exynos/clock/exynos_5422_clock.c" - description: "Exynos5422 platform-specific functions to manipulate the clock device in the Exynos5422 SoC" - maintainer: "seL4 Foundation" - status: "Supported on Exynos SoCs" - component_type: user-driver-timer - - name: mach/exynos/clock.c - display_name: "mach/exynos/clock.h" - description: "Clock subsystem driver for the clock controller in the Exynos SoCs" - maintainer: "seL4 Foundation" - status: "Supported on Exynos SoCs" - component_type: user-driver-timer - - name: mach/exynos/pwm.c - display_name: "mach/exynos/pwm.c" - description: "PWM drivers for the PWM timers in the Exynos SoCs" - maintainer: "seL4 Foundation" - status: "Supported on Exynos SoCs" - component_type: user-driver-timer - - name: mach/exynos/tmu.c - display_name: "mach/exynos/tmu.c" - description: "TMU driver for the TMU (Thermal Management Unit) device in the Exynos SoCs" - maintainer: "seL4 Foundation" - status: "Supported on Exynos SoCs" - component_type: user-driver-other - - name: mach/exynos/serial.c - display_name: "mach/exynos/serial.c" - description: "UART serial driver for the UART devices in the Exynos SoCs" - maintainer: "seL4 Foundation" - status: "Supported on Exynos SoCs" - component_type: user-driver-serial - - name: mach/exynos/pmic.c - display_name: "mach/exynos/pmic.c" - description: "PMIC driver for the PMIC (Power Management IC) device in the Exynos SoCs" - maintainer: "seL4 Foundation" - status: "Supported on the Exynos SoCs" - component_type: user-driver-other - - name: mach/exynos4/mux.c - display_name: "mach/exnyos4/mux.c" - description: "Pinctrl configurations for the Exynos4xxx SoCs" - maintainer: "seL4 Foundation" - status: "Supported on the Exynos4xxx SoCs" - component_type: user-driver-pinmux - - name: mach/exynos5/mux.c - display_name: "mach/exynos5/mux.c" - description: "Pinctrl configurations for the Exynos5xxx SoCs" - maintainer: "seL4 Foundation" - status: "Supported on the Exynos5xxx SoCs" - component_type: user-driver-pinmux - - name: mach/exynos/mux.c - display_name: "mach/exynos/mux.c" - description: "Pinctrl driver for the pinctrl device in the Exynos SoCs" - maintainer: "seL4 Foundation" - status: "Supported on the Exynos SoCs" - component_type: user-driver-pinmux - - name: mach/exynos/ltimer.c - display_name: "mach/exynos/ltimer.c" - description: "ltimer implementation for the Exynos platforms using the PWM timers" - maintainer: "seL4 Foundation" - status: "Supported on the Exynos SoCs" - component_type: user-driver-pinmux - - name: mach/exynos/spi.c - display_name: "mach/exynos/spi.c" - description: "SPI driver for the SPI devices in the Exynos SoCs" - maintainer: "seL4 Foundation" - status: "Supported on the Exynos SoCs" - component_type: user-driver-spi - - name: mach/exynos/i2c.c - display_name: "mach/exynos/i2c.c" - description: "I2C driver for the I2C devices in the Exynos SoCs" - maintainer: "seL4 Foundation" - status: "Supported on the Exynos SoCs" - component_type: user-driver-i2c - - name: mach/exynos/pmic_rtc.c - display_name: "mach/exynos/pmic_rtc.c" - description: "RTC driver for the RTC located inside the PMIC device in the Exynos SoCs" - maintainer: "seL4 Foundation" - status: "Supported on the Exynos SoCs" - component_type: user-driver-other - - name: mach/exnyos/irq_combiner.c - display_name: "mach/exnyos/irq_combiner.c" - description: "IRQ combiner driver for the IRQ combiner device in the Exynos SoCs" - maintainer: "seL4 Foundation" - status: "Supported on the Exynos SoCs" - component_type: user-driver-other - - name: mach/zynq/timer.c - display_name: "mach/zynq/timer.c" - description: "TTC driver for the TTC timers in the ZYNQ SoCs" - maintainer: "seL4 Foundation" - status: "Supported on ZYNQ SoCs" - component_type: user-driver-timer - - name: mach/zynq/serial.c - display_name: "mach/zynq/serial.c" - description: "UART serial drivers for the UART devices in the ZYNQ SoCs" - maintainer: "seL4 Foundation" - status: "Supported on ZYNQ SoCs" - component_type: user-driver-serial - # FIXME: commented out, should use a filter instead - # - name: mach/zynq/mux.c - # display_name: "mach/zynq/mux.c" - # description: "Pinmux drivers for the pin controller in the ZYNQ SoCs" - # maintainer: "seL4 Foundation" - # status: "Non-functional skeleton implementation, supported on ZYNQ SoCs" - # component_type: user-driver-pinmux - - name: mach/zynq/ltimer.c - display_name: "mach/zynq/ltimer.c" - description: "ltimer implementation for the ZYNQ platforms using TTC timers" - maintainer: "seL4 Foundation" - status: "Supported on ZYNQ SoCs" - component_type: user-driver-ltimer - - name: mach/zynq/axi_uartlite.c - display_name: "mach/zynq/axi_uartlite.c" - description: "UART serial driver to the AXI UART lite device on ZYNQ SoCs" - maintainer: "seL4 Foundation" - status: "Suppored on ZYNQ SoCs" - component_type: user-driver-serial - - name: mach/nvidia/timer.c - display_name: "mach/nvidia/timer.c" - description: "Timer drivers for the timers on the NVIDIA SoCs" - maintainer: "seL4 Foundation" - status: "Supported on the NVIDIA SoCs" - component_type: user-driver-timer - - name: mach/nvidia/serial.c - display_name: "mach/nvidia/serial.c" - description: "Serial drivers for the UART serial devices on the NVIDIA SoCs" - maintainer: "seL4 Foundation" - status: "Supported on the NVIDIA SoCs" - component_type: user-driver-serial - - name: mach/nvidia/ltimer.c - display_name: "mach/nvidia/ltimer.c" - description: "ltimer implementation for the NVIDIA platforms using the NVIDIA timers" - maintainer: "seL4 Foundation" - status: "Supported on the NVIDIA SoCs" - component_type: user-driver-ltimer - # - # libethdrivers - # - - name: src/pico_dev_eth.c - display_name: "src/pico_dev_eth.c" - description: "Ethernet device interface to connect with the PicoTCP TCP/IP stack" - maintainer: "seL4 Foundation" - status: "Supported" - component_type: user-driver-ethernet - - name: src/lwip.c - display_name: "src/lwip.c" - description: "Ethernet device interface to connect with the lwIP TCP/IP stack" - maintainer: "seL4 Foundation" - status: "Deprecated in favour of the PicoTCP Ethernet device interface" - component_type: user-driver-ethernet - - name: src/helpers.c - display_name: "src/helpers.c" - description: "Helper functions for the Ethernet drivers in libethdrivers" - maintainer: "seL4 Foundation" - status: "Supported" - component_type: user-driver-other - - name: src/plat/imx6 - display_name: "src/plat/imx6/*" - description: "Ethernet driver for the i.MX6 platform based off on U-Boot's implementation" - maintainer: "seL4 Foundation" - status: "Supported on the sabre platform" - component_type: user-driver-ethernet - - name: src/plat/pc99 - display_name: "src/plat/pc99/*" - description: "Ethernet driver for the e1000 Ethernet devices" - maintainer: "seL4 Foundation" - status: "Supported on pc99 platform" - component_type: user-driver-ethernet - - name: src/plat/tx2 - display_name: "src/plat/tx2/*" - description: "Ethernet driver for the TX2 platform based off on U-Boot's implementation" - maintainer: "seL4 Foundation" - status: "Supported on the tx2 platform" - component_type: user-driver-ethernet - - name: src/plat/zynq7000 - display_name: "src/plat/zynq700/*" - description: "Ethernet driver for the zynq7000 platform based off on U-Boot's implementation" - maintainer: "Dornerworks" - status: "Supported on the zynq7000 platform" - component_type: user-driver-ethernet - # - # libplatsupportports - # - - name: src/plat/tx2/clock_bindings.c - display_name: "src/plat/tx2/clock_bindings.c" - description: "libplatsupport clock ID to TX2 BPMP clock ID bindings" - maintainer: "seL4 Foundation" - status: "Supported on tx2 platform" - component_type: user-driver-clock - - name: src/plat/tx2/clock.c - display_name: "src/plat/tx2/clock_bindings.c" - description: "Clock driver for the TX2 CAR (Clock And Reset) controller which relies on libtx2bpmp" - maintainer: "seL4 Foundation" - status: "Supported on the tx2 platform" - component_type: user-driver-clock - - name: src/plat/tx2/gpio.c - display_name: "src/plat/tx2/gpio.c" - description: "GPIO driver for the TX2 GPIO controller based off on U-Boot's implementation" - maintainer: "seL4 Foundation" - status: "Supported on the tx2 platform" - component_type: user-driver-gpio - - name: src/plat/tx2/mux.c - display_name: "src/plat/tx2/mux.c" - description: "Pin controller driver for the TX2 MUX based off on NVIDIA's L4T implementation" - maintainer: "seL4 Foundation" - status: "Supported on the tx2 platform" - component_type: user-driver-pinmux - - name: src/plat/tx2/reset_bindings.c - display_name: "src/plat/tx2/reset_bindings.c" - description: "libplatsupport reset ID to TX2 BPMP reset ID bindings" - maintainer: "seL4 Foundation" - status: "Supported on the tx2 platform" - component_type: user-driver-reset - - name: src/plat/tx2/reset.c - display_name: "src/plat/tx2/reset.c" - description: "Reset driver for the TX2 CAR (Clock And Reset) controller which relies on libtx2bpmp" - maintainer: "seL4 Foundation" - status: "Supported on the tx2 platform" - component_type: user-driver-reset - # - # libtx2bpmp - # - - name: src/bpmp.c - display_name: "src/bpmp.c" - description: "BPMP driver for the BPMP (Boot and Power Management Processor) co-processor on the TX2 based off on U-Boot's implementation" - maintainer: "seL4 Foundation" - status: "Supported on the tx2 platform" - component_type: user-driver-other - - name: src/hsp.c - display_name: "src/hsp.c" - description: "HSP driver for the HSP (Hardware Synchronisation Primitives) module on the TX2" - maintainer: "seL4 Foundation" - status: "Supported on the tx2 platform" - component_type: user-driver-other - - name: src/ivc.c - display_name: "src/ivc.c" - description: "IVC implementation for the IVC (Inter-VM Communication) protocol used for communicating with the BPMP" - maintainer: "seL4 Foundation" - status: "Supported on the tx2 platform" - component_type: user-driver-other - # - # libusbdrivers - # - - name: src/usb.c - display_name: "src/usb.c" - description: "Common USB driver for all the USB classes" - maintainer: "seL4 Foundation" - status: "Supported" - component_type: user-driver-usb - - name: src/ehci/ - display_name: "src/ehci/*" - description: "Common USB EHCI host controller driver" - maintainer: "seL4 Foundation" - status: "Supported" - component_type: user-driver-usb - - name: src/otg.c - display_name: src/otg.c - description: "Common USB OTG driver for the USB OTG specification" - maintainer: "seL4 Foundation" - status: "Supported" - component_type: user-driver-usb - - name: src/plat/exynos5/ehci-exynos5.c - display_name: "src/plat/exynos5/ehci-exynos5.c" - description: "Exynos5xxx platform-specific EHCI driver functions" - maintainer: "seL4 Foundation" - status: "Supported on exynos5 platform" - component_type: user-driver-usb - - name: src/plat/imx6/ehci-imx6.c - display_name: "src/plat/imx6/ehci-imx6.c" - description: "i.MX6 platform-specific EHCI driver functions" - maintainer: "seL4 Foundation" - status: "Supported on sabre platform" - component_type: user-driver-usb - - name: src/plat/imx6/otg-imx6.c - display_name: "src/plat/imx6/otg-imx6.c" - description: "i.MX6 platform-specific OTG driver functions" - maintainer: "seL4 Foundation" - status: "Supported on sabre platform" - component_type: user-driver-usb - - name: src/plat/pc99/ehci-pci.c - display_name: "src/plat/pc99/echi-pci.c" - description: "pc99 platform-specific EHCI driver functions" - maintainer: "seL4 Foundation" - status: "Supported on pc99 platform, requires libpci" - component_type: user-driver-usb - - name: src/drivers/arch/arm/usb3503_hub.c - display_name: "src/drivers/arch/arm/usb3503_hub.c" - description: "USB hub controller driver for the Microchip USB3503 USB2.0 hub controller" - maintainer: "seL4 Foundation" - status: "Supported on Arm platforms" - component_type: user-driver-usb - - name: src/drivers/cdc.c - display_name: "src/drivers/cdc.c" - description: "USB driver for the CDC and CDC PSTN subclass specifications" - maintainer: "seL4 Foundation" - status: "Supported" - component_type: user-driver-usb - - name: src/drivers/hid.c - display_name: "src/drivers/hid.c" - description: "USB driver for the HID subclass specification" - maintainer: "seL4 Foundation" - status: "Supported" - component_type: user-driver-usb - - name: src/drivers/lan9730.c - display_name: "src/drivers/lan9730.c" - description: "USB driver for the Microchip USB to 10/100 Ethernet adaptor" - maintainer: "seL4 Foundation" - status: "Deprecated, requires the lwIP TCP/IP stack" - component_type: user-driver-usb - - name: src/drivers/mouse.c - display_name: "src/drivers/mouse.c" - description: "USB driver for the USB mouse class of devices" - maintainer: "seL4 Foundation" - status: "Supported" - component_type: user-driver-usb - - name: src/drivers/otgusbtty.c - display_name: "src/drivers/otgusbtty.c" - description: "USB driver for the OTG tty class of devices" - maintainer: "seL4 Foundation" - status: "Supported" - component_type: user-driver-usb - - name: src/drivers/pl2303.c - display_name: "src/drivers/pl2303.c" - description: "USB driver for the Prolific PL2303 USB to Serial adaptor" - maintainer: "seL4 Foundation" - status: "Supported" - component_type: user-driver-usb - - name: src/drivers/storage.c - display_name: "src/drivers/storage.c" - description: "USB driver for the USB Mass Storage Class Bulk-Only Transport specification" - maintainer: "seL4 Foundation" - status: "Supported" - component_type: user-driver-usb - - name: src/drivers/ufi.c - display_name: "src/drivers/ufi.c" - description: "USB driver for the UFI commands for the USB Mass Storage Class specification" - maintainer: "seL4 Foundation" - status: "Supported" - component_type: user-driver-usb - - name: src/drivers/usbhub.c - display_name: "src/drivers/usbhub.c" - description: "USB driver for the USB hub driver class of devices" - maintainer: "seL4 Foundation" - status: "Supported" - component_type: user-driver-usb - - name: src/drivers/usbkbd.c - display_name: "src/drivers/usbkbd.c" - description: "USB driver for the USB keyboard class of devices" - maintainer: "seL4 Foundation" - status: "Supported" - component_type: user-driver-usb diff --git a/_data/projects/virtualization.yml b/_data/projects/virtualization.yml deleted file mode 100644 index 762248e209f..00000000000 --- a/_data/projects/virtualization.yml +++ /dev/null @@ -1,115 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -name: virtualization -display_name: Virtualization -description: seL4 hardware virtualization support -project_order: 8 - -repositories: - - org: seL4 - repo: seL4_projects_libs - -components: - - name: arch-arm - display_name: arch-arm - description: "A guest hardware virtualisation library for ARM." - maintainer: "maintainer wanted" - status: "active" - component_type: vm-virtualization-architecture - - name: arch-x86 - display_name: arch-x86 - description: "A guest hardware virtualisation library for x86." - maintainer: "maintainer wanted" - status: "active" - component_type: vm-virtualization-architecture - - name: boot - display_name: boot - description: "Create initialise and configure VM and VCPU instances" - maintainer: "maintainer wanted" - status: "active" - component_type: vm-virtualization-interface - - name: boot - display_name: boot - description: "Create initialise and configure VM and VCPU instances" - maintainer: "maintainer wanted" - status: "active" - component_type: vm-virtualization-interface - - name: guest_iospace - display_name: guest_iospace - description: "Registration and management of a guest VM's IO Space." - maintainer: "maintainer wanted" - status: "active" - component_type: vm-virtualization-interface - - name: guest_irq_controller - display_name: guest_irq_controller - description: "Initialisation and management of a guest VM irq controller." - maintainer: "maintainer wanted" - status: "active" - component_type: vm-virtualization-interface - - name: guest_memory - display_name: guest_memory - description: "Management of a guest VM's address space." - maintainer: "maintainer wanted" - status: "active" - component_type: vm-virtualization-interface - - name: vcpu_falut - display_name: vcpu_fault - description: "Query and configure vcpu objects that have faulted during execution." - maintainer: "maintainer wanted" - status: "active" - component_type: vm-virtualization-interface - - name: guest_vm - display_name: guest_vm - description: "Provides definitions of the guest vm datastructure and primitives to run the VM instance and start its vcpus." - maintainer: "maintainer wanted" - status: "active" - component_type: vm-virtualization-interface - - name: vmm_device - display_name: vmm_device - description: "Datastructures and helpers to manage VMM devices." - maintainer: "maintainer wanted" - status: "active" - component_type: vmmplatsupport-virtualization-interface - - name: vmm_guest_image - display_name: vmm_guest_image - description: "General utilites to load guest vm images (e.g. kernel, initrd, modules)." - maintainer: "maintainer wanted" - status: "active" - component_type: vmmplatsupport-virtualization-interface - - name: vmm_ioports - display_name: vmm_ioports - description: "Initialising, registering and handling ioport events for a guest VM instance" - maintainer: "maintainer wanted" - status: "active" - component_type: vmmplatsupport-virtualization-interface - - name: pci - display_name: pci - description: "VMM pci driver" - maintainer: "maintainer wanted" - status: "active" - component_type: vmmplatsupport-drivers - - name: virtio_con - display_name: virtio_con - description: "VMM virtio console driver." - maintainer: "maintainer wanted" - status: "active" - component_type: vmmplatsupport-virtualization-interface - - name: virtio_net - display_name: virtio_net - description: "VMM virtio net driver." - maintainer: "maintainer wanted" - status: "active" - component_type: vmmplatsupport-virtualization-interface - - name: cross_vm_connection - display_name: cross_vm_connection - description: "Facilitates the creation of communication channels between VM's and other components on an seL4-based system." - maintainer: "maintainer wanted" - status: "active" - component_type: vmmplatsupport-virtualization-interface - - name: vusb - display_name: vusb - description: "Virtual USB driver for ARM-based VM's." - maintainer: "maintainer wanted" - status: "active" - component_type: vmmplatsupport-virtualization-interface diff --git a/_data/sidebar.yml b/_data/sidebar.yml deleted file mode 100644 index d467937a374..00000000000 --- a/_data/sidebar.yml +++ /dev/null @@ -1,221 +0,0 @@ -# SPDX-License-Identifier: BSD-2-Clause -# Copyright 2020 seL4 Project a Series of LF Projects, LLC. - -toc: - - title: Getting Started - subfolderitems: - - page: Overview - url: /getting-started.html - - page: Tutorials - url: /Tutorials/ - - page: Setting up with Docker - url: /projects/dockerfiles/ - - page: Repo manifest cheat sheet - url: /projects/buildsystem/repo-cheatsheet.html - - - title: The seL4 Kernel - subfolderitems: - - page: Overview - url: /projects/sel4/ - - page: Setting up - url: /projects/buildsystem/host-dependencies.html - - title: Tutorial - subfolderitems: - - page: Setting up - url: /Tutorials/setting-up.html - - page: Getting the tutorials - url: /Tutorials/get-the-tutorials.html - - page: Hello world - url: /Tutorials/hello-world.html - - page: Capabilities - url: /Tutorials/capabilities.html - - page: Untyped - url: /Tutorials/untyped.html - - page: Mapping - url: /Tutorials/mapping.html - - page: Threads - url: /Tutorials/threads.html - - page: IPC - url: /Tutorials/ipc.html - - page: Notifications - url: /Tutorials/notifications.html - - page: Interrupts - url: /Tutorials/interrupts.html - - page: Fault handling - url: /Tutorials/fault-handlers.html - - page: MCS - url: /Tutorials/mcs.html - - page: End - url: /Tutorials/seL4-end.html - - page: How-to - url: /Tutorials/how-to-seL4.html - - page: API docs - url: /projects/sel4/api-doc.html - - page: Manual - url: /projects/sel4/manual.html - - page: Supported platforms - url: /Hardware/ - - page: Verified configurations - url: /projects/sel4/verified-configurations.html - - page: Configurations - url: /projects/sel4/configurations.html - - page: Standalone seL4 builds - url: /projects/buildsystem/standalone.html - - page: Bitfield generator - url: /projects/sel4/bfgen.html - - title: Testing & benchmarking - subfolderitems: - - page: seL4test - url: /projects/sel4test/ - - page: Debugging guide - url: /projects/sel4-tutorials/debugging-guide.html - - page: Debugging user space - url: /projects/sel4-tutorials/debugging-userspace.html - - page: sel4bench - url: /projects/sel4bench/ - - page: Benchmarking guide - url: /projects/sel4-tutorials/benchmarking-guide.html - - page: Contributing - url: /projects/sel4/kernel-contribution.html - - page: Porting to a new platform - url: /projects/sel4/porting.html - - page: Releases - url: /releases/seL4.html - - page: Sources - url: https://github.com/seL4/seL4 - - - divider: true - - - title: Microkit - subfolderitems: - - page: Overview - url: /projects/microkit/ - - page: Setting up your machine - url: /projects/microkit/setting-up.html - - title: Tutorial - subfolderitems: - - page: Welcome - url: /projects/microkit/tutorial/welcome.html - - page: Part 0 - Setting up - url: /projects/microkit/tutorial/part0.html - - page: Part 1 - Serial server - url: /projects/microkit/tutorial/part1.html - - page: Part 2 - Client - url: /projects/microkit/tutorial/part2.html - - page: Part 3 - Wordle server - url: /projects/microkit/tutorial/part3.html - - page: Part 4 - Virtual machines - url: /projects/microkit/tutorial/part4.html - - page: End - url: /projects/microkit/tutorial/end.html - - page: Manual - url: /projects/microkit/manual/latest/ - - page: Roadmap - url: /projects/microkit/roadmap.html - - page: Supported platforms - url: /projects/microkit/platforms.html - - page: Releases - url: /releases/microkit.html - - page: Sources - url: https://github.com/seL4/microkit - - title: CAmkES - subfolderitems: - - page: Overview - url: /projects/camkes/ - - page: Setting up your machine - url: /projects/camkes/setting-up.html - - title: Tutorials - subfolderitems: - - page: Hello CAmkES - url: /Tutorials/hello-camkes-0.html - - page: Introduction - url: /Tutorials/hello-camkes-1.html - - page: Events - url: /Tutorials/hello-camkes-2.html - - page: Timer - url: /Tutorials/hello-camkes-timer.html - - page: Virtual Machines - url: /Tutorials/camkes-vm-linux.html - - page: Cross-VM connectors - url: /Tutorials/camkes-vm-crossvm.html - - page: How-to - url: /Tutorials/how-to-CAmkES.html - - page: Manual - url: /projects/camkes/manual.html - - page: Supported platforms - url: /projects/camkes/hardware.html - - title: Virtualisation - subfolderitems: - - page: CAmkES VM - url: /projects/camkes-vm/ - - page: VM library - url: /projects/virtualization/docs/libsel4vm.html - - page: VMM library - url: /projects/virtualization/docs/libsel4vmm.html - - page: Releases - url: /releases/camkes.html - - page: Sources - url: https://github.com/seL4/camkes-tool/ - - - divider: true - - - title: C support - subfolderitems: - - page: C runtime - url: /projects/sel4runtime/ - - page: User-level libraries - url: /projects/user_libs/ - - page: Build System - url: /projects/buildsystem/ - - title: Tutorials - subfolderitems: - - page: Init & Threads - url: /Tutorials/libraries-1.html - - page: IPC - url: /Tutorials/libraries-2.html - - page: ELF loading & Processes - url: /Tutorials/libraries-3.html - - page: Timer - url: /Tutorials/libraries-4.html - - page: How-to - url: /Tutorials/how-to-libs.html - - title: Rust support - subfolderitems: - - page: Overview - url: /projects/rust/ - - page: How to use - url: /projects/rust/how-to-use.html - - page: Tutorial - url: /projects/rust/tutorial/introduction.html - - page: API - url: https://sel4.github.io/rust-sel4/ - - page: Supported configurations - url: /projects/rust/supported-configurations.html - - page: Releases - url: /projects/rust/releases.html - - page: Sources - url: https://github.com/seL4/rust-sel4 - - - divider: true - - - title: ELF loader - subfolderitems: - - page: ELF loader for C - url: /projects/elfloader/ - - title: capDL - subfolderitems: - - page: Overview - url: /projects/capdl/ - - page: Language Spec - url: /projects/capdl/lang-spec.html - - page: capDL loader (C) - url: /projects/capdl/c-loader-app.html - - page: Releases - url: /releases/capDL.html - - - divider: true - - - title: Examples & demos - subfolderitems: - - page: Overview - url: /examples.html diff --git a/_icons/academic-cap.svg b/_icons/academic-cap.svg deleted file mode 100644 index cd05c0e30f9..00000000000 --- a/_icons/academic-cap.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/adjustments-horizontal.svg b/_icons/adjustments-horizontal.svg deleted file mode 100644 index 24a8bc7ce64..00000000000 --- a/_icons/adjustments-horizontal.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/adjustments-vertical.svg b/_icons/adjustments-vertical.svg deleted file mode 100644 index 8ec937cd32d..00000000000 --- a/_icons/adjustments-vertical.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/archive-box-arrow-down.svg b/_icons/archive-box-arrow-down.svg deleted file mode 100644 index a325df478a1..00000000000 --- a/_icons/archive-box-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/archive-box-x-mark.svg b/_icons/archive-box-x-mark.svg deleted file mode 100644 index cca86e1017b..00000000000 --- a/_icons/archive-box-x-mark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/archive-box.svg b/_icons/archive-box.svg deleted file mode 100644 index 921a5826457..00000000000 --- a/_icons/archive-box.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-down-circle.svg b/_icons/arrow-down-circle.svg deleted file mode 100644 index 954042dc5e0..00000000000 --- a/_icons/arrow-down-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-down-left.svg b/_icons/arrow-down-left.svg deleted file mode 100644 index be398da5d9f..00000000000 --- a/_icons/arrow-down-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-down-on-square-stack.svg b/_icons/arrow-down-on-square-stack.svg deleted file mode 100644 index 6032f2c75d0..00000000000 --- a/_icons/arrow-down-on-square-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-down-on-square.svg b/_icons/arrow-down-on-square.svg deleted file mode 100644 index d7253860826..00000000000 --- a/_icons/arrow-down-on-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-down-right.svg b/_icons/arrow-down-right.svg deleted file mode 100644 index d31282ef027..00000000000 --- a/_icons/arrow-down-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-down-tray.svg b/_icons/arrow-down-tray.svg deleted file mode 100644 index 2b8890c57a9..00000000000 --- a/_icons/arrow-down-tray.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-down.svg b/_icons/arrow-down.svg deleted file mode 100644 index 5e1a5de9ebe..00000000000 --- a/_icons/arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-left-circle.svg b/_icons/arrow-left-circle.svg deleted file mode 100644 index 82402825bdf..00000000000 --- a/_icons/arrow-left-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-left-end-on-rectangle.svg b/_icons/arrow-left-end-on-rectangle.svg deleted file mode 100644 index 4bca1c92015..00000000000 --- a/_icons/arrow-left-end-on-rectangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-left-on-rectangle.svg b/_icons/arrow-left-on-rectangle.svg deleted file mode 100644 index 4bca1c92015..00000000000 --- a/_icons/arrow-left-on-rectangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-left-start-on-rectangle.svg b/_icons/arrow-left-start-on-rectangle.svg deleted file mode 100644 index 29997d2d6f1..00000000000 --- a/_icons/arrow-left-start-on-rectangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-left.svg b/_icons/arrow-left.svg deleted file mode 100644 index 10719883b8c..00000000000 --- a/_icons/arrow-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-long-down.svg b/_icons/arrow-long-down.svg deleted file mode 100644 index 768a29957b9..00000000000 --- a/_icons/arrow-long-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-long-left.svg b/_icons/arrow-long-left.svg deleted file mode 100644 index 0c019237098..00000000000 --- a/_icons/arrow-long-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-long-right.svg b/_icons/arrow-long-right.svg deleted file mode 100644 index 746e1e46c42..00000000000 --- a/_icons/arrow-long-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-long-up.svg b/_icons/arrow-long-up.svg deleted file mode 100644 index bebf680c045..00000000000 --- a/_icons/arrow-long-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-path-rounded-square.svg b/_icons/arrow-path-rounded-square.svg deleted file mode 100644 index 4392295177f..00000000000 --- a/_icons/arrow-path-rounded-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-path.svg b/_icons/arrow-path.svg deleted file mode 100644 index fba7241af87..00000000000 --- a/_icons/arrow-path.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-right-circle.svg b/_icons/arrow-right-circle.svg deleted file mode 100644 index 6f065a08bb2..00000000000 --- a/_icons/arrow-right-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-right-end-on-rectangle.svg b/_icons/arrow-right-end-on-rectangle.svg deleted file mode 100644 index 48ffe90160a..00000000000 --- a/_icons/arrow-right-end-on-rectangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-right-on-rectangle.svg b/_icons/arrow-right-on-rectangle.svg deleted file mode 100644 index abea6bfaa24..00000000000 --- a/_icons/arrow-right-on-rectangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-right-start-on-rectangle.svg b/_icons/arrow-right-start-on-rectangle.svg deleted file mode 100644 index abea6bfaa24..00000000000 --- a/_icons/arrow-right-start-on-rectangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-right.svg b/_icons/arrow-right.svg deleted file mode 100644 index f700b1fd6f2..00000000000 --- a/_icons/arrow-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-small-down.svg b/_icons/arrow-small-down.svg deleted file mode 100644 index 9977f0ee847..00000000000 --- a/_icons/arrow-small-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-small-left.svg b/_icons/arrow-small-left.svg deleted file mode 100644 index 8d54067cf32..00000000000 --- a/_icons/arrow-small-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-small-right.svg b/_icons/arrow-small-right.svg deleted file mode 100644 index af2ef624841..00000000000 --- a/_icons/arrow-small-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-small-up.svg b/_icons/arrow-small-up.svg deleted file mode 100644 index 78e282d2139..00000000000 --- a/_icons/arrow-small-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-top-right-on-square.svg b/_icons/arrow-top-right-on-square.svg deleted file mode 100644 index f3fb15f7664..00000000000 --- a/_icons/arrow-top-right-on-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-trending-down.svg b/_icons/arrow-trending-down.svg deleted file mode 100644 index 75f083af95a..00000000000 --- a/_icons/arrow-trending-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-trending-up.svg b/_icons/arrow-trending-up.svg deleted file mode 100644 index b79bfbeee25..00000000000 --- a/_icons/arrow-trending-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-turn-down-left.svg b/_icons/arrow-turn-down-left.svg deleted file mode 100644 index 4425ea1c7ff..00000000000 --- a/_icons/arrow-turn-down-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-turn-down-right.svg b/_icons/arrow-turn-down-right.svg deleted file mode 100644 index 1efaec14309..00000000000 --- a/_icons/arrow-turn-down-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-turn-left-down.svg b/_icons/arrow-turn-left-down.svg deleted file mode 100644 index 8ca63d95ab2..00000000000 --- a/_icons/arrow-turn-left-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-turn-left-up.svg b/_icons/arrow-turn-left-up.svg deleted file mode 100644 index 37cc0b9cc1a..00000000000 --- a/_icons/arrow-turn-left-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-turn-right-down.svg b/_icons/arrow-turn-right-down.svg deleted file mode 100644 index e10ebd3679f..00000000000 --- a/_icons/arrow-turn-right-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-turn-right-up.svg b/_icons/arrow-turn-right-up.svg deleted file mode 100644 index ddf4cd81a79..00000000000 --- a/_icons/arrow-turn-right-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-turn-up-left.svg b/_icons/arrow-turn-up-left.svg deleted file mode 100644 index 3b2a3304d4c..00000000000 --- a/_icons/arrow-turn-up-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-turn-up-right.svg b/_icons/arrow-turn-up-right.svg deleted file mode 100644 index 7a9e437d3c5..00000000000 --- a/_icons/arrow-turn-up-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-up-circle.svg b/_icons/arrow-up-circle.svg deleted file mode 100644 index c2e0359995b..00000000000 --- a/_icons/arrow-up-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-up-left.svg b/_icons/arrow-up-left.svg deleted file mode 100644 index 65531688307..00000000000 --- a/_icons/arrow-up-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-up-on-square-stack.svg b/_icons/arrow-up-on-square-stack.svg deleted file mode 100644 index f1b3d5ec8d9..00000000000 --- a/_icons/arrow-up-on-square-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-up-on-square.svg b/_icons/arrow-up-on-square.svg deleted file mode 100644 index 3625717f1f3..00000000000 --- a/_icons/arrow-up-on-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-up-right.svg b/_icons/arrow-up-right.svg deleted file mode 100644 index 9ec7dee53b9..00000000000 --- a/_icons/arrow-up-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-up-tray.svg b/_icons/arrow-up-tray.svg deleted file mode 100644 index 3779677d6f4..00000000000 --- a/_icons/arrow-up-tray.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-up.svg b/_icons/arrow-up.svg deleted file mode 100644 index cb05fb249dc..00000000000 --- a/_icons/arrow-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-uturn-down.svg b/_icons/arrow-uturn-down.svg deleted file mode 100644 index f3620083943..00000000000 --- a/_icons/arrow-uturn-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-uturn-left.svg b/_icons/arrow-uturn-left.svg deleted file mode 100644 index 5a9819c4ec2..00000000000 --- a/_icons/arrow-uturn-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-uturn-right.svg b/_icons/arrow-uturn-right.svg deleted file mode 100644 index 244e674c648..00000000000 --- a/_icons/arrow-uturn-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrow-uturn-up.svg b/_icons/arrow-uturn-up.svg deleted file mode 100644 index a19ff964827..00000000000 --- a/_icons/arrow-uturn-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrows-pointing-in.svg b/_icons/arrows-pointing-in.svg deleted file mode 100644 index 2621d38e730..00000000000 --- a/_icons/arrows-pointing-in.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrows-pointing-out.svg b/_icons/arrows-pointing-out.svg deleted file mode 100644 index 73de08c6d84..00000000000 --- a/_icons/arrows-pointing-out.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrows-right-left.svg b/_icons/arrows-right-left.svg deleted file mode 100644 index 22dca0aa569..00000000000 --- a/_icons/arrows-right-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/arrows-up-down.svg b/_icons/arrows-up-down.svg deleted file mode 100644 index f8cc08f60ef..00000000000 --- a/_icons/arrows-up-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/at-symbol.svg b/_icons/at-symbol.svg deleted file mode 100644 index 2b9e4469ca4..00000000000 --- a/_icons/at-symbol.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/backspace.svg b/_icons/backspace.svg deleted file mode 100644 index 1563d7d1230..00000000000 --- a/_icons/backspace.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/backward.svg b/_icons/backward.svg deleted file mode 100644 index ff788f8b79e..00000000000 --- a/_icons/backward.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/banknotes.svg b/_icons/banknotes.svg deleted file mode 100644 index 945f60eaf87..00000000000 --- a/_icons/banknotes.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bars-2.svg b/_icons/bars-2.svg deleted file mode 100644 index d64a9bbba89..00000000000 --- a/_icons/bars-2.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bars-3-bottom-left.svg b/_icons/bars-3-bottom-left.svg deleted file mode 100644 index 9960567af46..00000000000 --- a/_icons/bars-3-bottom-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bars-3-bottom-right.svg b/_icons/bars-3-bottom-right.svg deleted file mode 100644 index 4e90c18c79d..00000000000 --- a/_icons/bars-3-bottom-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bars-3-center-left.svg b/_icons/bars-3-center-left.svg deleted file mode 100644 index cca274c9eb8..00000000000 --- a/_icons/bars-3-center-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bars-3.svg b/_icons/bars-3.svg deleted file mode 100644 index 6d2221f7ef5..00000000000 --- a/_icons/bars-3.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bars-4.svg b/_icons/bars-4.svg deleted file mode 100644 index b9e9c465329..00000000000 --- a/_icons/bars-4.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bars-arrow-down.svg b/_icons/bars-arrow-down.svg deleted file mode 100644 index 91af7e4e550..00000000000 --- a/_icons/bars-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bars-arrow-up.svg b/_icons/bars-arrow-up.svg deleted file mode 100644 index 5c515e5187a..00000000000 --- a/_icons/bars-arrow-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/battery-0.svg b/_icons/battery-0.svg deleted file mode 100644 index b9811f78a32..00000000000 --- a/_icons/battery-0.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/battery-100.svg b/_icons/battery-100.svg deleted file mode 100644 index f88087909c5..00000000000 --- a/_icons/battery-100.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/battery-50.svg b/_icons/battery-50.svg deleted file mode 100644 index 0018f8dee43..00000000000 --- a/_icons/battery-50.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/beaker.svg b/_icons/beaker.svg deleted file mode 100644 index 9457e9aed1e..00000000000 --- a/_icons/beaker.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bell-alert.svg b/_icons/bell-alert.svg deleted file mode 100644 index 68d2f64cd3f..00000000000 --- a/_icons/bell-alert.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bell-slash.svg b/_icons/bell-slash.svg deleted file mode 100644 index fc31652c891..00000000000 --- a/_icons/bell-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bell-snooze.svg b/_icons/bell-snooze.svg deleted file mode 100644 index 10fa5bdd8eb..00000000000 --- a/_icons/bell-snooze.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bell.svg b/_icons/bell.svg deleted file mode 100644 index 8145b9d2b05..00000000000 --- a/_icons/bell.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bold.svg b/_icons/bold.svg deleted file mode 100644 index d815857cf4e..00000000000 --- a/_icons/bold.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bolt-slash.svg b/_icons/bolt-slash.svg deleted file mode 100644 index 91f81b4a0c3..00000000000 --- a/_icons/bolt-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bolt.svg b/_icons/bolt.svg deleted file mode 100644 index 506283d9a3e..00000000000 --- a/_icons/bolt.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/book-open.svg b/_icons/book-open.svg deleted file mode 100644 index de02b1466dd..00000000000 --- a/_icons/book-open.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bookmark-slash.svg b/_icons/bookmark-slash.svg deleted file mode 100644 index d55d5aea568..00000000000 --- a/_icons/bookmark-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bookmark-square.svg b/_icons/bookmark-square.svg deleted file mode 100644 index 538d9e64a7a..00000000000 --- a/_icons/bookmark-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bookmark.svg b/_icons/bookmark.svg deleted file mode 100644 index 4e88a5cc545..00000000000 --- a/_icons/bookmark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/briefcase.svg b/_icons/briefcase.svg deleted file mode 100644 index d0c1fc35248..00000000000 --- a/_icons/briefcase.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/bug-ant.svg b/_icons/bug-ant.svg deleted file mode 100644 index 056d5a5ff1e..00000000000 --- a/_icons/bug-ant.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/building-library.svg b/_icons/building-library.svg deleted file mode 100644 index 2ea181cb4d3..00000000000 --- a/_icons/building-library.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/building-office-2.svg b/_icons/building-office-2.svg deleted file mode 100644 index d1f922aac6d..00000000000 --- a/_icons/building-office-2.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/building-office.svg b/_icons/building-office.svg deleted file mode 100644 index 695729fe59f..00000000000 --- a/_icons/building-office.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/building-storefront.svg b/_icons/building-storefront.svg deleted file mode 100644 index 8e287f88943..00000000000 --- a/_icons/building-storefront.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/cake.svg b/_icons/cake.svg deleted file mode 100644 index aa770ce75bf..00000000000 --- a/_icons/cake.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/calculator.svg b/_icons/calculator.svg deleted file mode 100644 index ef441d61f21..00000000000 --- a/_icons/calculator.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/calendar-date-range.svg b/_icons/calendar-date-range.svg deleted file mode 100644 index e1e91190fa2..00000000000 --- a/_icons/calendar-date-range.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/calendar-days.svg b/_icons/calendar-days.svg deleted file mode 100644 index 94731d7b187..00000000000 --- a/_icons/calendar-days.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/calendar.svg b/_icons/calendar.svg deleted file mode 100644 index 81b3dfc847c..00000000000 --- a/_icons/calendar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/camera.svg b/_icons/camera.svg deleted file mode 100644 index aabc3c637a4..00000000000 --- a/_icons/camera.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/_icons/chart-bar-square.svg b/_icons/chart-bar-square.svg deleted file mode 100644 index e03b7df5c3c..00000000000 --- a/_icons/chart-bar-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/chart-bar.svg b/_icons/chart-bar.svg deleted file mode 100644 index 31ff30c4eb8..00000000000 --- a/_icons/chart-bar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/chart-pie.svg b/_icons/chart-pie.svg deleted file mode 100644 index eebd21fe578..00000000000 --- a/_icons/chart-pie.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/_icons/chat-bubble-bottom-center-text.svg b/_icons/chat-bubble-bottom-center-text.svg deleted file mode 100644 index 549b4b2eeec..00000000000 --- a/_icons/chat-bubble-bottom-center-text.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/chat-bubble-bottom-center.svg b/_icons/chat-bubble-bottom-center.svg deleted file mode 100644 index 3bd9cf4eaf8..00000000000 --- a/_icons/chat-bubble-bottom-center.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/chat-bubble-left-ellipsis.svg b/_icons/chat-bubble-left-ellipsis.svg deleted file mode 100644 index 5865363c1ad..00000000000 --- a/_icons/chat-bubble-left-ellipsis.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/chat-bubble-left-right.svg b/_icons/chat-bubble-left-right.svg deleted file mode 100644 index fb00eb15d28..00000000000 --- a/_icons/chat-bubble-left-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/chat-bubble-left.svg b/_icons/chat-bubble-left.svg deleted file mode 100644 index 1c0d9867c86..00000000000 --- a/_icons/chat-bubble-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/chat-bubble-oval-left-ellipsis.svg b/_icons/chat-bubble-oval-left-ellipsis.svg deleted file mode 100644 index 3cc9ce5ae98..00000000000 --- a/_icons/chat-bubble-oval-left-ellipsis.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/chat-bubble-oval-left.svg b/_icons/chat-bubble-oval-left.svg deleted file mode 100644 index c4bab3a678e..00000000000 --- a/_icons/chat-bubble-oval-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/check-badge.svg b/_icons/check-badge.svg deleted file mode 100644 index d39704d01fc..00000000000 --- a/_icons/check-badge.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/check-circle-mini.svg b/_icons/check-circle-mini.svg deleted file mode 100644 index 763716ead0c..00000000000 --- a/_icons/check-circle-mini.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/check-circle.svg b/_icons/check-circle.svg deleted file mode 100644 index 912ffc67ff4..00000000000 --- a/_icons/check-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/check.svg b/_icons/check.svg deleted file mode 100644 index 37ad683eb3a..00000000000 --- a/_icons/check.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/chevron-double-down.svg b/_icons/chevron-double-down.svg deleted file mode 100644 index 308710e13a3..00000000000 --- a/_icons/chevron-double-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/chevron-double-left.svg b/_icons/chevron-double-left.svg deleted file mode 100644 index 7af02329e17..00000000000 --- a/_icons/chevron-double-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/chevron-double-right.svg b/_icons/chevron-double-right.svg deleted file mode 100644 index e29b66f104f..00000000000 --- a/_icons/chevron-double-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/chevron-double-up.svg b/_icons/chevron-double-up.svg deleted file mode 100644 index ab19f2e470a..00000000000 --- a/_icons/chevron-double-up.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/_icons/chevron-down-mini.svg b/_icons/chevron-down-mini.svg deleted file mode 100644 index 18cbc1d415b..00000000000 --- a/_icons/chevron-down-mini.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/chevron-down.svg b/_icons/chevron-down.svg deleted file mode 100644 index b6ac1cf6e76..00000000000 --- a/_icons/chevron-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/chevron-left.svg b/_icons/chevron-left.svg deleted file mode 100644 index 5e9f57b8b1f..00000000000 --- a/_icons/chevron-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/chevron-right.svg b/_icons/chevron-right.svg deleted file mode 100644 index cd8a45723c7..00000000000 --- a/_icons/chevron-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/chevron-up-down.svg b/_icons/chevron-up-down.svg deleted file mode 100644 index ba6820a0efb..00000000000 --- a/_icons/chevron-up-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/chevron-up.svg b/_icons/chevron-up.svg deleted file mode 100644 index eafbff4a38b..00000000000 --- a/_icons/chevron-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/circle-stack.svg b/_icons/circle-stack.svg deleted file mode 100644 index 2f75456c509..00000000000 --- a/_icons/circle-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/clipboard-document-check.svg b/_icons/clipboard-document-check.svg deleted file mode 100644 index b4be34b8e52..00000000000 --- a/_icons/clipboard-document-check.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/clipboard-document-list.svg b/_icons/clipboard-document-list.svg deleted file mode 100644 index 11e818a37d9..00000000000 --- a/_icons/clipboard-document-list.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/clipboard-document.svg b/_icons/clipboard-document.svg deleted file mode 100644 index 31eb487aa14..00000000000 --- a/_icons/clipboard-document.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/clipboard.svg b/_icons/clipboard.svg deleted file mode 100644 index 2e7501e123e..00000000000 --- a/_icons/clipboard.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/clock.svg b/_icons/clock.svg deleted file mode 100644 index a7fce7bdf83..00000000000 --- a/_icons/clock.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/cloud-arrow-down.svg b/_icons/cloud-arrow-down.svg deleted file mode 100644 index 9bbee4ffa7f..00000000000 --- a/_icons/cloud-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/cloud-arrow-up.svg b/_icons/cloud-arrow-up.svg deleted file mode 100644 index 09944371958..00000000000 --- a/_icons/cloud-arrow-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/cloud.svg b/_icons/cloud.svg deleted file mode 100644 index 9662d6cced9..00000000000 --- a/_icons/cloud.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/code-bracket-square.svg b/_icons/code-bracket-square.svg deleted file mode 100644 index de71371e903..00000000000 --- a/_icons/code-bracket-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/code-bracket.svg b/_icons/code-bracket.svg deleted file mode 100644 index 8754e635669..00000000000 --- a/_icons/code-bracket.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/cog-6-tooth.svg b/_icons/cog-6-tooth.svg deleted file mode 100644 index 91ba7db9fbf..00000000000 --- a/_icons/cog-6-tooth.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/_icons/cog-8-tooth.svg b/_icons/cog-8-tooth.svg deleted file mode 100644 index 515cc16d99a..00000000000 --- a/_icons/cog-8-tooth.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/_icons/cog.svg b/_icons/cog.svg deleted file mode 100644 index 5aadb3e484b..00000000000 --- a/_icons/cog.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/command-line.svg b/_icons/command-line.svg deleted file mode 100644 index 6f9f8f9c751..00000000000 --- a/_icons/command-line.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/computer-desktop.svg b/_icons/computer-desktop.svg deleted file mode 100644 index 1744ea270dd..00000000000 --- a/_icons/computer-desktop.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/cpu-chip.svg b/_icons/cpu-chip.svg deleted file mode 100644 index 7ab9e09c9e9..00000000000 --- a/_icons/cpu-chip.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/credit-card.svg b/_icons/credit-card.svg deleted file mode 100644 index fbe46d802e2..00000000000 --- a/_icons/credit-card.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/cube-transparent.svg b/_icons/cube-transparent.svg deleted file mode 100644 index 10f4c2c4aa2..00000000000 --- a/_icons/cube-transparent.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/cube.svg b/_icons/cube.svg deleted file mode 100644 index 87d16c0b40e..00000000000 --- a/_icons/cube.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/currency-bangladeshi.svg b/_icons/currency-bangladeshi.svg deleted file mode 100644 index 4aaae03bb62..00000000000 --- a/_icons/currency-bangladeshi.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/currency-dollar.svg b/_icons/currency-dollar.svg deleted file mode 100644 index a69380e1e90..00000000000 --- a/_icons/currency-dollar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/currency-euro.svg b/_icons/currency-euro.svg deleted file mode 100644 index b6504f3432c..00000000000 --- a/_icons/currency-euro.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/currency-pound.svg b/_icons/currency-pound.svg deleted file mode 100644 index fb323779296..00000000000 --- a/_icons/currency-pound.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/currency-rupee.svg b/_icons/currency-rupee.svg deleted file mode 100644 index 2040a225af8..00000000000 --- a/_icons/currency-rupee.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/currency-yen.svg b/_icons/currency-yen.svg deleted file mode 100644 index 80d3c998036..00000000000 --- a/_icons/currency-yen.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/cursor-arrow-rays.svg b/_icons/cursor-arrow-rays.svg deleted file mode 100644 index 813793c3f06..00000000000 --- a/_icons/cursor-arrow-rays.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/cursor-arrow-ripple.svg b/_icons/cursor-arrow-ripple.svg deleted file mode 100644 index 24dbb3e1770..00000000000 --- a/_icons/cursor-arrow-ripple.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/device-phone-mobile.svg b/_icons/device-phone-mobile.svg deleted file mode 100644 index 7ff5ae21f34..00000000000 --- a/_icons/device-phone-mobile.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/device-tablet.svg b/_icons/device-tablet.svg deleted file mode 100644 index 58b94a4cb66..00000000000 --- a/_icons/device-tablet.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/divide.svg b/_icons/divide.svg deleted file mode 100644 index d657f36bf44..00000000000 --- a/_icons/divide.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/document-arrow-down.svg b/_icons/document-arrow-down.svg deleted file mode 100644 index 39cb4d3b0a9..00000000000 --- a/_icons/document-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/document-arrow-up.svg b/_icons/document-arrow-up.svg deleted file mode 100644 index f4ad8445bf6..00000000000 --- a/_icons/document-arrow-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/document-chart-bar.svg b/_icons/document-chart-bar.svg deleted file mode 100644 index 0bf7dc1e226..00000000000 --- a/_icons/document-chart-bar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/document-check.svg b/_icons/document-check.svg deleted file mode 100644 index 6ef1c98cec4..00000000000 --- a/_icons/document-check.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/document-currency-bangladeshi.svg b/_icons/document-currency-bangladeshi.svg deleted file mode 100644 index 16bc3bffdce..00000000000 --- a/_icons/document-currency-bangladeshi.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/document-currency-dollar.svg b/_icons/document-currency-dollar.svg deleted file mode 100644 index e07ce046829..00000000000 --- a/_icons/document-currency-dollar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/document-currency-euro.svg b/_icons/document-currency-euro.svg deleted file mode 100644 index 0a9846acf3f..00000000000 --- a/_icons/document-currency-euro.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/document-currency-pound.svg b/_icons/document-currency-pound.svg deleted file mode 100644 index 9944c17742b..00000000000 --- a/_icons/document-currency-pound.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/document-currency-rupee.svg b/_icons/document-currency-rupee.svg deleted file mode 100644 index 5767becb1ff..00000000000 --- a/_icons/document-currency-rupee.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/document-currency-yen.svg b/_icons/document-currency-yen.svg deleted file mode 100644 index 8e2b98331ee..00000000000 --- a/_icons/document-currency-yen.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/document-duplicate.svg b/_icons/document-duplicate.svg deleted file mode 100644 index 9c6bc80d821..00000000000 --- a/_icons/document-duplicate.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/document-magnifying-glass.svg b/_icons/document-magnifying-glass.svg deleted file mode 100644 index ebf1b1352c0..00000000000 --- a/_icons/document-magnifying-glass.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/document-minus.svg b/_icons/document-minus.svg deleted file mode 100644 index a13b6fe91ba..00000000000 --- a/_icons/document-minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/document-plus.svg b/_icons/document-plus.svg deleted file mode 100644 index e06def85247..00000000000 --- a/_icons/document-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/document-text.svg b/_icons/document-text.svg deleted file mode 100644 index 8c03e9ede9c..00000000000 --- a/_icons/document-text.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/document.svg b/_icons/document.svg deleted file mode 100644 index 5a4881a188c..00000000000 --- a/_icons/document.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/ellipsis-horizontal-circle.svg b/_icons/ellipsis-horizontal-circle.svg deleted file mode 100644 index d6f11dd99bd..00000000000 --- a/_icons/ellipsis-horizontal-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/ellipsis-horizontal.svg b/_icons/ellipsis-horizontal.svg deleted file mode 100644 index 4efa28a1977..00000000000 --- a/_icons/ellipsis-horizontal.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/ellipsis-vertical.svg b/_icons/ellipsis-vertical.svg deleted file mode 100644 index 2caf3e05a0b..00000000000 --- a/_icons/ellipsis-vertical.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/envelope-open.svg b/_icons/envelope-open.svg deleted file mode 100644 index 01f34be546d..00000000000 --- a/_icons/envelope-open.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/envelope.svg b/_icons/envelope.svg deleted file mode 100644 index b8029e8623e..00000000000 --- a/_icons/envelope.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/equals.svg b/_icons/equals.svg deleted file mode 100644 index 3c9702bafb1..00000000000 --- a/_icons/equals.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/exclamation-circle.svg b/_icons/exclamation-circle.svg deleted file mode 100644 index 0833d8e6839..00000000000 --- a/_icons/exclamation-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/exclamation-triangle.svg b/_icons/exclamation-triangle.svg deleted file mode 100644 index dc2e6cf8513..00000000000 --- a/_icons/exclamation-triangle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/eye-dropper.svg b/_icons/eye-dropper.svg deleted file mode 100644 index c1b7b8acaf4..00000000000 --- a/_icons/eye-dropper.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/eye-slash.svg b/_icons/eye-slash.svg deleted file mode 100644 index fb794247970..00000000000 --- a/_icons/eye-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/eye.svg b/_icons/eye.svg deleted file mode 100644 index f4ae935cd44..00000000000 --- a/_icons/eye.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/_icons/face-frown.svg b/_icons/face-frown.svg deleted file mode 100644 index 86af7b0b687..00000000000 --- a/_icons/face-frown.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/face-smile.svg b/_icons/face-smile.svg deleted file mode 100644 index e9872820677..00000000000 --- a/_icons/face-smile.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/film.svg b/_icons/film.svg deleted file mode 100644 index f02856d8139..00000000000 --- a/_icons/film.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/finger-print.svg b/_icons/finger-print.svg deleted file mode 100644 index 2de9f82392c..00000000000 --- a/_icons/finger-print.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/fire.svg b/_icons/fire.svg deleted file mode 100644 index 0e944f56cc8..00000000000 --- a/_icons/fire.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/_icons/flag.svg b/_icons/flag.svg deleted file mode 100644 index f5d17df363c..00000000000 --- a/_icons/flag.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/folder-arrow-down.svg b/_icons/folder-arrow-down.svg deleted file mode 100644 index 74f0b6c751c..00000000000 --- a/_icons/folder-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/folder-minus.svg b/_icons/folder-minus.svg deleted file mode 100644 index fc4212b9200..00000000000 --- a/_icons/folder-minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/folder-open.svg b/_icons/folder-open.svg deleted file mode 100644 index df90e716593..00000000000 --- a/_icons/folder-open.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/folder-plus.svg b/_icons/folder-plus.svg deleted file mode 100644 index 8acf5f7f041..00000000000 --- a/_icons/folder-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/folder.svg b/_icons/folder.svg deleted file mode 100644 index 4c301addab1..00000000000 --- a/_icons/folder.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/forward.svg b/_icons/forward.svg deleted file mode 100644 index 317f5ce7b61..00000000000 --- a/_icons/forward.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/funnel.svg b/_icons/funnel.svg deleted file mode 100644 index 5937bdc1119..00000000000 --- a/_icons/funnel.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/gif.svg b/_icons/gif.svg deleted file mode 100644 index 6d22acae0db..00000000000 --- a/_icons/gif.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/gift-top.svg b/_icons/gift-top.svg deleted file mode 100644 index 3eb1793ad4a..00000000000 --- a/_icons/gift-top.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/gift.svg b/_icons/gift.svg deleted file mode 100644 index a856b6f717c..00000000000 --- a/_icons/gift.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/globe-alt.svg b/_icons/globe-alt.svg deleted file mode 100644 index b63d26891b4..00000000000 --- a/_icons/globe-alt.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/globe-americas.svg b/_icons/globe-americas.svg deleted file mode 100644 index f0a6beb5d34..00000000000 --- a/_icons/globe-americas.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/globe-asia-australia.svg b/_icons/globe-asia-australia.svg deleted file mode 100644 index 396cd3cc55f..00000000000 --- a/_icons/globe-asia-australia.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/globe-europe-africa.svg b/_icons/globe-europe-africa.svg deleted file mode 100644 index 427637dd23b..00000000000 --- a/_icons/globe-europe-africa.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/h1.svg b/_icons/h1.svg deleted file mode 100644 index e70d229a21b..00000000000 --- a/_icons/h1.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/h2.svg b/_icons/h2.svg deleted file mode 100644 index 5fd0ee03968..00000000000 --- a/_icons/h2.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/h3.svg b/_icons/h3.svg deleted file mode 100644 index 386c70f4178..00000000000 --- a/_icons/h3.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/hand-raised.svg b/_icons/hand-raised.svg deleted file mode 100644 index c9008af25e6..00000000000 --- a/_icons/hand-raised.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/hand-thumb-down.svg b/_icons/hand-thumb-down.svg deleted file mode 100644 index 3d2cc169a0b..00000000000 --- a/_icons/hand-thumb-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/hand-thumb-up.svg b/_icons/hand-thumb-up.svg deleted file mode 100644 index 01b987736ce..00000000000 --- a/_icons/hand-thumb-up.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/hashtag.svg b/_icons/hashtag.svg deleted file mode 100644 index 9956ce047af..00000000000 --- a/_icons/hashtag.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/heart.svg b/_icons/heart.svg deleted file mode 100644 index 2c371f3347d..00000000000 --- a/_icons/heart.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/home-modern.svg b/_icons/home-modern.svg deleted file mode 100644 index b081fe88eaf..00000000000 --- a/_icons/home-modern.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/home.svg b/_icons/home.svg deleted file mode 100644 index e1900b8eb3c..00000000000 --- a/_icons/home.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/identification.svg b/_icons/identification.svg deleted file mode 100644 index 9a99a61d3ec..00000000000 --- a/_icons/identification.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/inbox-arrow-down.svg b/_icons/inbox-arrow-down.svg deleted file mode 100644 index 686060b1908..00000000000 --- a/_icons/inbox-arrow-down.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/inbox-stack.svg b/_icons/inbox-stack.svg deleted file mode 100644 index c8a6ebbbb66..00000000000 --- a/_icons/inbox-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/inbox.svg b/_icons/inbox.svg deleted file mode 100644 index 2a26cee2d03..00000000000 --- a/_icons/inbox.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/information-circle.svg b/_icons/information-circle.svg deleted file mode 100644 index d4ac360db25..00000000000 --- a/_icons/information-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/italic.svg b/_icons/italic.svg deleted file mode 100644 index b4243241ac7..00000000000 --- a/_icons/italic.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/key.svg b/_icons/key.svg deleted file mode 100644 index 30c5bde595b..00000000000 --- a/_icons/key.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/language.svg b/_icons/language.svg deleted file mode 100644 index 1094eb16fdc..00000000000 --- a/_icons/language.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/lifebuoy.svg b/_icons/lifebuoy.svg deleted file mode 100644 index 446562bc469..00000000000 --- a/_icons/lifebuoy.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/light-bulb.svg b/_icons/light-bulb.svg deleted file mode 100644 index 37c0317925f..00000000000 --- a/_icons/light-bulb.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/link-slash.svg b/_icons/link-slash.svg deleted file mode 100644 index 9d6f0e8e62f..00000000000 --- a/_icons/link-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/link.svg b/_icons/link.svg deleted file mode 100644 index 38febfc2df1..00000000000 --- a/_icons/link.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/list-bullet.svg b/_icons/list-bullet.svg deleted file mode 100644 index 0dcb9404e90..00000000000 --- a/_icons/list-bullet.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/lock-closed.svg b/_icons/lock-closed.svg deleted file mode 100644 index 4917dbb43d5..00000000000 --- a/_icons/lock-closed.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/lock-open.svg b/_icons/lock-open.svg deleted file mode 100644 index 7f9a5a33244..00000000000 --- a/_icons/lock-open.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/magnifying-glass-circle.svg b/_icons/magnifying-glass-circle.svg deleted file mode 100644 index 4c0da1f028f..00000000000 --- a/_icons/magnifying-glass-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/magnifying-glass-minus.svg b/_icons/magnifying-glass-minus.svg deleted file mode 100644 index d4dfada09b1..00000000000 --- a/_icons/magnifying-glass-minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/magnifying-glass-plus.svg b/_icons/magnifying-glass-plus.svg deleted file mode 100644 index a1d4363b6d3..00000000000 --- a/_icons/magnifying-glass-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/magnifying-glass.svg b/_icons/magnifying-glass.svg deleted file mode 100644 index 947336ca825..00000000000 --- a/_icons/magnifying-glass.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/map-pin.svg b/_icons/map-pin.svg deleted file mode 100644 index 74cc7867a65..00000000000 --- a/_icons/map-pin.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/_icons/map.svg b/_icons/map.svg deleted file mode 100644 index 2d9e239b9bf..00000000000 --- a/_icons/map.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/megaphone.svg b/_icons/megaphone.svg deleted file mode 100644 index 2b3c60b6853..00000000000 --- a/_icons/megaphone.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/microphone.svg b/_icons/microphone.svg deleted file mode 100644 index e349845ba91..00000000000 --- a/_icons/microphone.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/minus-circle.svg b/_icons/minus-circle.svg deleted file mode 100644 index 7cc1de3c661..00000000000 --- a/_icons/minus-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/minus-small.svg b/_icons/minus-small.svg deleted file mode 100644 index 25144c88cc1..00000000000 --- a/_icons/minus-small.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/minus.svg b/_icons/minus.svg deleted file mode 100644 index fa1fb8b2b5d..00000000000 --- a/_icons/minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/moon.svg b/_icons/moon.svg deleted file mode 100644 index 6a13b2f2295..00000000000 --- a/_icons/moon.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/musical-note.svg b/_icons/musical-note.svg deleted file mode 100644 index d903ff2be05..00000000000 --- a/_icons/musical-note.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/newspaper.svg b/_icons/newspaper.svg deleted file mode 100644 index 666274fc54c..00000000000 --- a/_icons/newspaper.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/no-symbol.svg b/_icons/no-symbol.svg deleted file mode 100644 index a7dd36568b9..00000000000 --- a/_icons/no-symbol.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/numbered-list.svg b/_icons/numbered-list.svg deleted file mode 100644 index 10ba0725a1f..00000000000 --- a/_icons/numbered-list.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/other/C.svg b/_icons/other/C.svg deleted file mode 100644 index afe73f1b568..00000000000 --- a/_icons/other/C.svg +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - diff --git a/_icons/other/external.svg b/_icons/other/external.svg deleted file mode 100644 index c79e3a2e095..00000000000 --- a/_icons/other/external.svg +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/_icons/other/github.svg b/_icons/other/github.svg deleted file mode 100644 index 7665190e2bb..00000000000 --- a/_icons/other/github.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/other/rust-logo-blk.svg b/_icons/other/rust-logo-blk.svg deleted file mode 100644 index e4ef32bde1c..00000000000 --- a/_icons/other/rust-logo-blk.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/_icons/paint-brush.svg b/_icons/paint-brush.svg deleted file mode 100644 index 21a208e6562..00000000000 --- a/_icons/paint-brush.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/paper-airplane.svg b/_icons/paper-airplane.svg deleted file mode 100644 index 80db4d0d70e..00000000000 --- a/_icons/paper-airplane.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/paper-clip.svg b/_icons/paper-clip.svg deleted file mode 100644 index c27a60ab4b4..00000000000 --- a/_icons/paper-clip.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/pause-circle.svg b/_icons/pause-circle.svg deleted file mode 100644 index 723e5f2c331..00000000000 --- a/_icons/pause-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/pause.svg b/_icons/pause.svg deleted file mode 100644 index 7a611048d71..00000000000 --- a/_icons/pause.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/pencil-square.svg b/_icons/pencil-square.svg deleted file mode 100644 index 01de21ea0a4..00000000000 --- a/_icons/pencil-square.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/pencil.svg b/_icons/pencil.svg deleted file mode 100644 index 7af74ab9182..00000000000 --- a/_icons/pencil.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/percent-badge.svg b/_icons/percent-badge.svg deleted file mode 100644 index 2f84596994c..00000000000 --- a/_icons/percent-badge.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/phone-arrow-down-left.svg b/_icons/phone-arrow-down-left.svg deleted file mode 100644 index 31185c876f2..00000000000 --- a/_icons/phone-arrow-down-left.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/phone-arrow-up-right.svg b/_icons/phone-arrow-up-right.svg deleted file mode 100644 index ab875b04b89..00000000000 --- a/_icons/phone-arrow-up-right.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/phone-x-mark.svg b/_icons/phone-x-mark.svg deleted file mode 100644 index 50568f0f616..00000000000 --- a/_icons/phone-x-mark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/phone.svg b/_icons/phone.svg deleted file mode 100644 index a8789d133ac..00000000000 --- a/_icons/phone.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/photo.svg b/_icons/photo.svg deleted file mode 100644 index 0e65af2129c..00000000000 --- a/_icons/photo.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/play-circle.svg b/_icons/play-circle.svg deleted file mode 100644 index d83a73f33f4..00000000000 --- a/_icons/play-circle.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/_icons/play-pause.svg b/_icons/play-pause.svg deleted file mode 100644 index 943efcb5ca6..00000000000 --- a/_icons/play-pause.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/play.svg b/_icons/play.svg deleted file mode 100644 index 3c0fad30896..00000000000 --- a/_icons/play.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/plus-circle.svg b/_icons/plus-circle.svg deleted file mode 100644 index 1beab85b1b0..00000000000 --- a/_icons/plus-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/plus-small.svg b/_icons/plus-small.svg deleted file mode 100644 index 7fb7dcb148b..00000000000 --- a/_icons/plus-small.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/plus.svg b/_icons/plus.svg deleted file mode 100644 index 06b312f7972..00000000000 --- a/_icons/plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/power.svg b/_icons/power.svg deleted file mode 100644 index e471a03ab69..00000000000 --- a/_icons/power.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/presentation-chart-bar.svg b/_icons/presentation-chart-bar.svg deleted file mode 100644 index d0564395938..00000000000 --- a/_icons/presentation-chart-bar.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/presentation-chart-line.svg b/_icons/presentation-chart-line.svg deleted file mode 100644 index ed212e5cf00..00000000000 --- a/_icons/presentation-chart-line.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/printer.svg b/_icons/printer.svg deleted file mode 100644 index f3c1c54874d..00000000000 --- a/_icons/printer.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/puzzle-piece.svg b/_icons/puzzle-piece.svg deleted file mode 100644 index 004855be7f3..00000000000 --- a/_icons/puzzle-piece.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/qr-code.svg b/_icons/qr-code.svg deleted file mode 100644 index 1cbd5d4ccf9..00000000000 --- a/_icons/qr-code.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/_icons/question-mark-circle.svg b/_icons/question-mark-circle.svg deleted file mode 100644 index e3dd599a878..00000000000 --- a/_icons/question-mark-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/queue-list.svg b/_icons/queue-list.svg deleted file mode 100644 index 09f0066485a..00000000000 --- a/_icons/queue-list.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/radio.svg b/_icons/radio.svg deleted file mode 100644 index 81c891b89b6..00000000000 --- a/_icons/radio.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/receipt-percent.svg b/_icons/receipt-percent.svg deleted file mode 100644 index 4dd59964a24..00000000000 --- a/_icons/receipt-percent.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/receipt-refund.svg b/_icons/receipt-refund.svg deleted file mode 100644 index 345a8977aac..00000000000 --- a/_icons/receipt-refund.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/rectangle-group.svg b/_icons/rectangle-group.svg deleted file mode 100644 index 8184b196967..00000000000 --- a/_icons/rectangle-group.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/rectangle-stack.svg b/_icons/rectangle-stack.svg deleted file mode 100644 index 8eb419a4573..00000000000 --- a/_icons/rectangle-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/rocket-launch.svg b/_icons/rocket-launch.svg deleted file mode 100644 index a6a6cb97ed5..00000000000 --- a/_icons/rocket-launch.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/rss.svg b/_icons/rss.svg deleted file mode 100644 index ff1e1a81d7b..00000000000 --- a/_icons/rss.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/scale.svg b/_icons/scale.svg deleted file mode 100644 index 559bcdab8ff..00000000000 --- a/_icons/scale.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/scissors.svg b/_icons/scissors.svg deleted file mode 100644 index 4df73af1c49..00000000000 --- a/_icons/scissors.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/server-stack.svg b/_icons/server-stack.svg deleted file mode 100644 index 060c8208911..00000000000 --- a/_icons/server-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/server.svg b/_icons/server.svg deleted file mode 100644 index eef8b9e5a84..00000000000 --- a/_icons/server.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/share.svg b/_icons/share.svg deleted file mode 100644 index e931243977d..00000000000 --- a/_icons/share.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/shield-check.svg b/_icons/shield-check.svg deleted file mode 100644 index 82b91259ae8..00000000000 --- a/_icons/shield-check.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/shield-exclamation.svg b/_icons/shield-exclamation.svg deleted file mode 100644 index 5a8df1724a0..00000000000 --- a/_icons/shield-exclamation.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/shopping-bag.svg b/_icons/shopping-bag.svg deleted file mode 100644 index 7c5f29b4976..00000000000 --- a/_icons/shopping-bag.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/shopping-cart.svg b/_icons/shopping-cart.svg deleted file mode 100644 index b86c2abbcf8..00000000000 --- a/_icons/shopping-cart.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/signal-slash.svg b/_icons/signal-slash.svg deleted file mode 100644 index b858fdf7239..00000000000 --- a/_icons/signal-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/signal.svg b/_icons/signal.svg deleted file mode 100644 index 9daa002575e..00000000000 --- a/_icons/signal.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/slash.svg b/_icons/slash.svg deleted file mode 100644 index 782434d9581..00000000000 --- a/_icons/slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/sparkles.svg b/_icons/sparkles.svg deleted file mode 100644 index c8df7f1f32a..00000000000 --- a/_icons/sparkles.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/speaker-wave.svg b/_icons/speaker-wave.svg deleted file mode 100644 index 7bb46f263e7..00000000000 --- a/_icons/speaker-wave.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/speaker-x-mark.svg b/_icons/speaker-x-mark.svg deleted file mode 100644 index e89da3e685e..00000000000 --- a/_icons/speaker-x-mark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/square-2-stack.svg b/_icons/square-2-stack.svg deleted file mode 100644 index d6d6ca9de2a..00000000000 --- a/_icons/square-2-stack.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/square-3-stack-3d.svg b/_icons/square-3-stack-3d.svg deleted file mode 100644 index d11f07bc101..00000000000 --- a/_icons/square-3-stack-3d.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/squares-2x2.svg b/_icons/squares-2x2.svg deleted file mode 100644 index 1fe6594da80..00000000000 --- a/_icons/squares-2x2.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/squares-plus.svg b/_icons/squares-plus.svg deleted file mode 100644 index b87a5f12f01..00000000000 --- a/_icons/squares-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/star.svg b/_icons/star.svg deleted file mode 100644 index 1f27ec8d3b7..00000000000 --- a/_icons/star.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/stop-circle.svg b/_icons/stop-circle.svg deleted file mode 100644 index 26c2aba9fe2..00000000000 --- a/_icons/stop-circle.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/_icons/stop.svg b/_icons/stop.svg deleted file mode 100644 index 2058714a68c..00000000000 --- a/_icons/stop.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/strikethrough.svg b/_icons/strikethrough.svg deleted file mode 100644 index 9ec9b9da7f2..00000000000 --- a/_icons/strikethrough.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/sun.svg b/_icons/sun.svg deleted file mode 100644 index 0e49045aa68..00000000000 --- a/_icons/sun.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/swatch.svg b/_icons/swatch.svg deleted file mode 100644 index e1e1b2761ac..00000000000 --- a/_icons/swatch.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/table-cells.svg b/_icons/table-cells.svg deleted file mode 100644 index 3d0f11413a6..00000000000 --- a/_icons/table-cells.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/tag.svg b/_icons/tag.svg deleted file mode 100644 index 01eb0a355ca..00000000000 --- a/_icons/tag.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/_icons/ticket.svg b/_icons/ticket.svg deleted file mode 100644 index f06ce3bfcba..00000000000 --- a/_icons/ticket.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/trash.svg b/_icons/trash.svg deleted file mode 100644 index 71669b096ce..00000000000 --- a/_icons/trash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/trophy.svg b/_icons/trophy.svg deleted file mode 100644 index 955622718e0..00000000000 --- a/_icons/trophy.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/truck.svg b/_icons/truck.svg deleted file mode 100644 index 7f475c87bd1..00000000000 --- a/_icons/truck.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/tv.svg b/_icons/tv.svg deleted file mode 100644 index b6fae6aa730..00000000000 --- a/_icons/tv.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/underline.svg b/_icons/underline.svg deleted file mode 100644 index 56a205164ae..00000000000 --- a/_icons/underline.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/user-circle.svg b/_icons/user-circle.svg deleted file mode 100644 index 74a941e6ded..00000000000 --- a/_icons/user-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/user-group.svg b/_icons/user-group.svg deleted file mode 100644 index 2a3159e92a8..00000000000 --- a/_icons/user-group.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/user-minus.svg b/_icons/user-minus.svg deleted file mode 100644 index 878cc7a9659..00000000000 --- a/_icons/user-minus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/user-plus.svg b/_icons/user-plus.svg deleted file mode 100644 index a3c9bfce09f..00000000000 --- a/_icons/user-plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/user.svg b/_icons/user.svg deleted file mode 100644 index 9a343c4cef6..00000000000 --- a/_icons/user.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/users.svg b/_icons/users.svg deleted file mode 100644 index 1de4a729920..00000000000 --- a/_icons/users.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/variable.svg b/_icons/variable.svg deleted file mode 100644 index 4656e2f124c..00000000000 --- a/_icons/variable.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/video-camera-slash.svg b/_icons/video-camera-slash.svg deleted file mode 100644 index c08bd006911..00000000000 --- a/_icons/video-camera-slash.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/video-camera.svg b/_icons/video-camera.svg deleted file mode 100644 index 1af46bdafd5..00000000000 --- a/_icons/video-camera.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/view-columns.svg b/_icons/view-columns.svg deleted file mode 100644 index bc9a440aee9..00000000000 --- a/_icons/view-columns.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/viewfinder-circle.svg b/_icons/viewfinder-circle.svg deleted file mode 100644 index 947dcd8fc82..00000000000 --- a/_icons/viewfinder-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/wallet.svg b/_icons/wallet.svg deleted file mode 100644 index 58989cf954f..00000000000 --- a/_icons/wallet.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/wifi.svg b/_icons/wifi.svg deleted file mode 100644 index c838da48726..00000000000 --- a/_icons/wifi.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/window.svg b/_icons/window.svg deleted file mode 100644 index fcccbe2f774..00000000000 --- a/_icons/window.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/wrench-screwdriver.svg b/_icons/wrench-screwdriver.svg deleted file mode 100644 index 8d05c28d4fa..00000000000 --- a/_icons/wrench-screwdriver.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/wrench.svg b/_icons/wrench.svg deleted file mode 100644 index 56c6f8d4d62..00000000000 --- a/_icons/wrench.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/_icons/x-circle.svg b/_icons/x-circle.svg deleted file mode 100644 index e8d86efb328..00000000000 --- a/_icons/x-circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_icons/x-mark.svg b/_icons/x-mark.svg deleted file mode 100644 index 19b4ac7698a..00000000000 --- a/_icons/x-mark.svg +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/_includes/archived.html b/_includes/archived.html deleted file mode 100644 index 7a4de09fba9..00000000000 --- a/_includes/archived.html +++ /dev/null @@ -1,10 +0,0 @@ -{%- comment %} -Copyright 2025 Proofcraft Pty Ltd -SPDX-License-Identifier: CC-BY-SA-4.0 -{% endcomment -%} -{%- if page.archive %} -
-

This page is archived and is no longer receiving updates.

-

It remains here because some of the content may still be useful.

-
-{%- endif %} diff --git a/_includes/card.html b/_includes/card.html deleted file mode 100644 index 3dea023569d..00000000000 --- a/_includes/card.html +++ /dev/null @@ -1,54 +0,0 @@ -{%- comment %} -Copyright 2025 Proofcraft Pty Ltd -SPDX-License-Identifier: CC-BY-SA-4.0 -{% endcomment -%} -{%- assign link_text = include.link_text | default: "Learn more" -%} -{%- assign icon = "_icons/" | append: include.icon | append: ".svg" -%} -{%- assign icon_colour = include.icon_colour | default: "bg-logogreen text-black" -%} -{%- if include.center %} -{%- assign centering = "col-span-1 sm:col-span-2 lg:col-span-1 sm:w-1/2 sm:mx-auto lg:w-full" %} -{%- endif -%} -
- {% if include.icon %} - - {% endif %} - -
diff --git a/_includes/card_example.html b/_includes/card_example.html deleted file mode 100644 index 8d474421fc4..00000000000 --- a/_includes/card_example.html +++ /dev/null @@ -1,43 +0,0 @@ -{%- comment %} -Copyright 2025 Proofcraft Pty Ltd -SPDX-License-Identifier: CC-BY-SA-4.0 -{% endcomment -%} -{% capture info %} -
- {% if include.rust %} -
- Rust -
- {% endif %} - {% if include.C %} -
- C -
- {% endif %} - {% if include.mkit %} -
- Microkit -
- {% endif %} - {% if include.camkes %} -
- CAmkES -
- {% endif %} -
-
- See the code -   - {% svg _icons/other/external.svg class="inline-icon" %} -
-{% endcapture -%} -{%- include card.html - title = include.title - link = include.link - icon = include.icon - center = include.center - class = include.class - no_link_text = true - body = include.body - info = info --%} diff --git a/_includes/component_list.md b/_includes/component_list.md deleted file mode 100644 index 8cbefb77f51..00000000000 --- a/_includes/component_list.md +++ /dev/null @@ -1,14 +0,0 @@ -{%- comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. -{%- endcomment %} -{%- assign list = include.list | default: 'components' %} -{%- assign status = include.status | default: "Status" %} -{%- include config_list.md - project=include.project - list=list - type=include.type - code=include.code - status=status - no_status=include.no_status - filter=include.filter %} diff --git a/_includes/cond-wrap-link.md b/_includes/cond-wrap-link.md deleted file mode 100644 index 7cd55ef1671..00000000000 --- a/_includes/cond-wrap-link.md +++ /dev/null @@ -1,5 +0,0 @@ -{% comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. -{% endcomment %} -{%- if include.link != '' %}[{{include.text}}]({{include.link}}){% else %}{{include.text}}{% endif -%} diff --git a/_includes/config_list.md b/_includes/config_list.md deleted file mode 100644 index 90c996622e2..00000000000 --- a/_includes/config_list.md +++ /dev/null @@ -1,70 +0,0 @@ -{% comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. -{% endcomment %} -{%- assign project = site.data.projects[include.project] %} -{%- assign list = include.list | default: 'configurations' %} -{%- assign status = include.status | default: "Value" %} -{%- if include.code == false %} -{%- assign code = "" %} -{%- assign endcode = "" %} -{%- else %} -{%- assign code = '
' %}
-{%-   assign endcode = "
" %} -{%- endif %} - - - - - - {%- unless include.no_status %} - - {%- endunless %} - - - -{%- for component in project[list] %} -{%- if include.type and include.type != component.component_type -%} -{%- continue %} -{%- endif %} -{%- if include.filter and component.status != include.filter %} -{%- continue %} -{%- endif %} -{%- capture link_text %}{{component.display_name_url}}{% endcapture %} -{%- capture display_text %}{{code}}{{component.display_name}}{{endcode}}{% endcapture %} - - - - {%- unless include.no_status %} - - {%- endunless %} - -{%- endfor -%} - - - -
-{%- for component in project[list] %} -{%- if include.type and include.type != component.component_type -%} -{%- continue %} -{%- endif %} -{%- if include.filter and component.status != include.filter %} -{%- continue %} -{%- endif %} -
-{%- capture link_text %}{{component.display_name_url}}{% endcapture %} -{%- capture display_text %}{{code}}{{component.display_name}}{{endcode}}{% endcapture %} -
{% include cond-wrap-link.md text=display_text link=link_text %}
-
-
- {{component.description | markdownify}} -
- {%- unless include.no_status %} -
- {{component.status}} -
- {%- endunless %} -{%- endfor -%} -
diff --git a/_includes/custom-navbar.html b/_includes/custom-navbar.html deleted file mode 100644 index 1a837fd2c0a..00000000000 --- a/_includes/custom-navbar.html +++ /dev/null @@ -1,43 +0,0 @@ -{% comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. -{% endcomment %} - diff --git a/_includes/endnote.html b/_includes/endnote.html deleted file mode 100644 index 590262df734..00000000000 --- a/_includes/endnote.html +++ /dev/null @@ -1,6 +0,0 @@ -{%- comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 Proofcraft Pty Ltd -{% endcomment %} - - diff --git a/_includes/endtab.html b/_includes/endtab.html deleted file mode 100644 index 590262df734..00000000000 --- a/_includes/endtab.html +++ /dev/null @@ -1,6 +0,0 @@ -{%- comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 Proofcraft Pty Ltd -{% endcomment %} - - diff --git a/_includes/endtabs.html b/_includes/endtabs.html deleted file mode 100644 index 08b02d08695..00000000000 --- a/_includes/endtabs.html +++ /dev/null @@ -1,5 +0,0 @@ -{%- comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 Proofcraft Pty Ltd -{% endcomment %} - diff --git a/_includes/footer.html b/_includes/footer.html deleted file mode 100644 index ffdae3c423d..00000000000 --- a/_includes/footer.html +++ /dev/null @@ -1,31 +0,0 @@ -{% comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. -{% endcomment %} -
- Sitemap - Test status -
-{%- if page.include_file %} -{%- assign edit_url = 'https://github.com/' | append: page.repo | - append: '/edit/master/' | append: page.include_file %} -{%- assign included = 'included' %} -{%- else %} -{%- comment %} - Collection pages set their absolute path variable relative to the site.collections_dir property. - To provide a URL to this page in the GitHub repository, we need to amend the path. -{%- endcomment %} -{%- if page.collection -%} -{%- assign src_path = site.collections_dir | append: "/" | append: page.path -%} -{%- else -%} -{%- assign src_path = page.path -%} -{%- endif -%} -{%- assign edit_url = site.git_repo | append: '/edit/master/' | append: src_path %} -{%- assign included = '' %} -{%- endif %} -Edit - {{included}} page on GitHub -
diff --git a/_includes/generic_update_page.md b/_includes/generic_update_page.md deleted file mode 100644 index 99530eea479..00000000000 --- a/_includes/generic_update_page.md +++ /dev/null @@ -1,9 +0,0 @@ -{% comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. -{% endcomment %} -{% assign update_where_exp = "item.url contains '/updates/" | append: include.project | append: "/'" %} -{% assign updates = site['updates'] | where_exp:"item", update_where_exp %} -{% for update in updates | sort: "date" %} -[{{ update.title }}]({{ update.url }}) -{% endfor %} diff --git a/_includes/header.html b/_includes/header.html deleted file mode 100644 index e7ad5790ccf..00000000000 --- a/_includes/header.html +++ /dev/null @@ -1,39 +0,0 @@ -{% comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. -{% endcomment %} - diff --git a/_includes/highlight.css b/_includes/highlight.css deleted file mode 100644 index 2ba4028b380..00000000000 --- a/_includes/highlight.css +++ /dev/null @@ -1,101 +0,0 @@ -/* - Copyright 2025 seL4 Project a Series of LF Projects, LLC. - SPDX-License-Identifier: CC-BY-SA-4.0 -*/ - -.highlight table td { padding: 5px; } -.highlight table pre { margin: 0; } -.highlight, .highlight .w { - color: #fbf1c7; -} -.highlight .err { - color: #fb4934; - background-color: #282828; - font-weight: bold; -} -.highlight .c, .highlight .ch, .highlight .cd, .highlight .cm, .highlight .cpf, .highlight .c1, .highlight .cs { - color: var(--color-slate-400); - font-style: italic; -} -.highlight .cp { - color: #8ec07c; -} -.highlight .nt { - color: #fb4934; -} -.highlight .o, .highlight .ow { - color: #fbf1c7; -} -.highlight .p, .highlight .pi { - color: #fbf1c7; -} -.highlight .gi { - color: #b8bb26; - background-color: #282828; -} -.highlight .gd { - color: #fb4934; - background-color: #282828; -} -.highlight .gh { - color: #b8bb26; - font-weight: bold; -} -.highlight .ge { - font-style: italic; -} -.highlight .ges { - font-weight: bold; - font-style: italic; -} -.highlight .gs { - font-weight: bold; -} -.highlight .k, .highlight .kn, .highlight .kp, .highlight .kr, .highlight .kv { - color: #fb4934; -} -.highlight .kc { - color: #d3869b; -} -.highlight .kt { - color: #fabd2f; -} -.highlight .kd { - color: #fe8019; -} -.highlight .s, .highlight .sb, .highlight .sc, .highlight .dl, .highlight .sd, .highlight .s2, .highlight .sh, .highlight .sx, .highlight .s1 { - color: #b8bb26; - font-style: italic; -} -.highlight .si { - color: #b8bb26; - font-style: italic; -} -.highlight .sr { - color: #b8bb26; - font-style: italic; -} -.highlight .sa { - color: #fb4934; -} -.highlight .se { - color: #fe8019; -} -.highlight .nn { - color: #8ec07c; -} -.highlight .nc { - color: #8ec07c; -} -.highlight .no { - color: #d3869b; -} -.highlight .na { - color: #b8bb26; -} -.highlight .m, .highlight .mb, .highlight .mf, .highlight .mh, .highlight .mi, .highlight .il, .highlight .mo, .highlight .mx { - color: #d3869b; -} -.highlight .ss { - color: #83a598; -} diff --git a/_includes/hw-info.html b/_includes/hw-info.html deleted file mode 100644 index 30a6f55a66f..00000000000 --- a/_includes/hw-info.html +++ /dev/null @@ -1,106 +0,0 @@ -{%- comment %} -Copyright 2025 Proofcraft Pty Ltd -SPDX-License-Identifier: CC-BY-SA-4.0 -{% endcomment -%} -{% if page.Maintained == false %} -{% include note.html kind="Important" %} -This board is no longer supported by seL4. -{% include endnote.html %} -{% endif %} - - - - - -{% if page.simulation_target -%} - - - -{%- endif %} - - - -{% if page.soc -%} - - - -{%- endif %} -{% if page.cpu -%} - - - -{%- endif %} - - - - - -{%- if page.platform == "PC99" %} -{%- assign SMMU = "IOMMU (VT-d)" %} -{%- else %} -{%- assign SMMU = "SMMU" %} -{%- endif %} - - - -{%- assign status = "" %} -{%- for config in page.verification -%} -{%- assign link = "/projects/sel4/verified-configurations.html#" | append: config | relative_url -%} -{%- assign status = status | append: '' | append: config | append: '' %} -{%- unless forloop.last %} -{%- assign status = status | append: ", " %} -{%- endunless %} -{%- endfor %} - - - - - - - - -{% if page.cmake_plat -%} - - - - -{%- endif %} - - - -{% unless page.Maintained == false or page.archive %} - - - -{% endunless %} - -
Platform {{ page.platform }}
Simulation platform yes
Architecture {{ page.arch }}
System-on-chip {{ page.soc }}
CPU {{ page.cpu }}
seL4 virtualisation support -{%- if page.virtualization %} -{% svg _icons/check.svg class="inline-icon stroke-3 text-f_green-500 dark:text-logogreen" %} -{%- else %} - -{%- endif %} -
seL4 {{SMMU}} support -{%- if page.iommu %} -{%- if page.iommu == "limited" %} -{%- assign color="text-yellow-500" %} -{%- assign text="limited support" %} -{%- else %} -{%- assign color="text-f_green-500 dark:text-logogreen" %} -{%- assign text="" %} -{%- endif %} -{% svg _icons/check.svg class="inline-icon stroke-3" %} {{text}} -{%- else %} - -{%- endif %} -
Proofs -{%- if status != "" %} - {% svg _icons/check.svg class="inline-icon stroke-3 text-f_green-500 dark:text-logogreen" %} -{%- elsif page.simulation_only %} -N/A -{%- assign status = "N/A" %} -{%- else %} -{%- assign status = "–" %} - – -{%- endif %} -
Proof configs{{status}}
seL4 CMake platform name{{ page.cmake_plat }}
Contributed by {{ page.Contrib }}
Maintained by {{ page.Maintained }}
diff --git a/_includes/include_external_markdown.md b/_includes/include_external_markdown.md deleted file mode 100644 index 02481d84087..00000000000 --- a/_includes/include_external_markdown.md +++ /dev/null @@ -1,14 +0,0 @@ -{% comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. -{% endcomment %} -{% capture file %} -{% include_absolute {{include.file}} %} -{% endcapture %} -{% assign file = file | replace: site.static_url, site.baseurl %} -{% assign file = file | replace: '.md)', '.html)' %} - -{% if include.indent_headings %} -{% assign file = file | replace: '# ', '## ' %} -{% endif %} -{{ file }} diff --git a/_includes/include_github_repo_markdown.md b/_includes/include_github_repo_markdown.md deleted file mode 100644 index caa755ba473..00000000000 --- a/_includes/include_github_repo_markdown.md +++ /dev/null @@ -1,10 +0,0 @@ -{% comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. -{% endcomment %} - -{% assign repo = include.repo | default: page.repo | downcase %} -{% assign include_file = include.file | default: page.include_file %} -{% assign file = '_repos/' | append: repo | append: "/" | append: include_file %} - -{% include include_external_markdown.md file=file indent_headings=include.indent_headings %} diff --git a/_includes/note.html b/_includes/note.html deleted file mode 100644 index 45913537a55..00000000000 --- a/_includes/note.html +++ /dev/null @@ -1,36 +0,0 @@ -{%- comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 Proofcraft Pty Ltd -{% endcomment %} -{% unless include.html -%} -{% assign md = 'markdown="1"' -%} -{% endunless -%} -{% assign kind = include.kind | default: "Note" -%} -{% if kind == "Note" -%} -{% assign icon = "information-circle" -%} -{% assign bcolour = "border-blue-500" -%} -{% assign tcolour = "text-blue-400" -%} -{% elsif kind == "Warning" -%} -{% assign icon = "exclamation-triangle" -%} -{% assign bcolour = "border-yellow-500" -%} -{% assign tcolour = "text-yellow-400" -%} -{% elsif kind == "Caution" -%} -{% assign icon = "shield-exclamation" -%} -{% assign bcolour = "border-red-500" -%} -{% assign tcolour = "text-red-400" -%} -{% elsif kind == "Important" -%} -{% assign icon = "exclamation-circle" -%} -{% assign bcolour = "border-violet-500" -%} -{% assign tcolour = "text-violet-400" -%} -{% elsif kind == "Tip" -%} -{% assign icon = "light-bulb" -%} -{% assign bcolour = "border-f_green-500" -%} -{% assign tcolour = "text-logogreen" -%} -{% endif -%} -{% assign icon = "_icons/" | append: icon | append: ".svg" -%} -
-
- {% svg {{icon}} class="h-5 w-5 inline -mt-0.5 mr-1" %} - {{ kind }} -
-
diff --git a/_includes/pc99.md b/_includes/pc99.md deleted file mode 100644 index 5d7732e9f15..00000000000 --- a/_includes/pc99.md +++ /dev/null @@ -1,77 +0,0 @@ -{%- comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. - -This text is shared between ia32 and x64 -{%- endcomment %} - -seL4 runs on 32-bit ia32 and 64-bit x64 machines, on QEMU and on hardware. - -{% include hw-info.html %} - -## Simulation - -{% include sel4test.md %} - -## Real Hardware - -When running on real hardware console output will be over serial. You will need -to plug a serial cable into your machine to see any output. - -The build system produces a multiboot compliant image for x86; a grub2 -stanza is here, but we usually boot via PXE for convenience. - -``` -menuentry "Load seL4 VM" --class os { - load_video - insmod gzio - insmod part_msdos - insmod ext2 - set root='(hd0,msdos2)' - multiboot /boot/sel4kernel - module /boot/sel4rootserver -} -``` - -Booting via PXEBOOT using -[syslinux PXELINUX](http://www.syslinux.org/wiki/index.php?title=PXELINUX) requires setting up a tftp and dhcp server on the network -that the machine you want to boot is connected to. The -[syslinux](http://www.syslinux.org/wiki/index.php?title=Download) -site has a download for pxelinux which we load over PXEBOOT -that then can load seL4. The configuration for pxelinux.cfg/default is -provided below. - -``` -label seL4 - kernel mboot.32 - append kernel-{{ page.cmake_plat }}-pc99 --- apps-{{ page.cmake_plat }}-pc99 -``` - -## Booting off USB with syslinux - -Use syslinux to create a bootable USB stick as follows. - -Assuming your USB flash drive is at `/dev/sdb` with a FAT partition at -`/dev/sdb1`: - -```bash -install-mbr /dev/sdb -syslinux --install /dev/sdb1 -mount /dev/sdb1 /mnt -cp images/sel4test-driver-image-{{ page.cmake_plat }}-pc99 /mnt/rootserver -cp images/kernel-{{ page.cmake_plat }}-pc99 /mnt/sel4kernel -cat > /mnt/syslinux.cfg < - Error: Python environment is externally managed -
- -Some Linux distributions have changed how Python is managed. If you get an error -saying the Python 'environment is externally managed' follow the instructions -below. The first two steps are needed only once for setup. - -```sh -python3 -m venv {{venv}} -./{{venv}}/bin/pip install {{deps}} -``` - -The following step is needed every time you start using the build environment -in a new shell. - -```sh -source ./{{venv}}/bin/activate -``` - -It is not important where the `{{venv}}` directory is located. -
- diff --git a/_includes/releases.html b/_includes/releases.html deleted file mode 100644 index 2a7e3f28726..00000000000 --- a/_includes/releases.html +++ /dev/null @@ -1,32 +0,0 @@ -{%- comment -%} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 Proofcraft Pty Ltd -{%- endcomment %} -{%- assign li-style = "text-center p-1 sm:p-2 rounded-md shadow-md border - dark:border-gray-700/80 bg-white dark:bg-darkblue - dark:shadow-gray-300/30 - hover:bg-slate-50 dark:hover:bg-slate-900 hover:underline - relative" -%} - diff --git a/_includes/risc-v.md b/_includes/risc-v.md deleted file mode 100644 index d9b5425d9e4..00000000000 --- a/_includes/risc-v.md +++ /dev/null @@ -1,20 +0,0 @@ -{% comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. -{% endcomment %} - -It is recommended to build the toolchain from source. - -```sh -git clone https://github.com/riscv/riscv-gnu-toolchain.git -cd riscv-gnu-toolchain -git submodule update --init --recursive -export RISCV=/opt/riscv -./configure --prefix="${RISCV}" --enable-multilib -make linux -``` - -After it is built, add the `$RISCV/bin` folder to your PATH. The built -toolchain works for both 32-bit and 64-bit. - -Alternatively, any pre-built toolchain with `multilib` enabled should work. diff --git a/_includes/seL4-deps.md b/_includes/seL4-deps.md deleted file mode 100644 index 2dcf6464490..00000000000 --- a/_includes/seL4-deps.md +++ /dev/null @@ -1,121 +0,0 @@ -{% comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. -{% endcomment %} - -## Get Google's Repo tool - -The primary way of obtaining and managing seL4 project sources is through -Google's `repo` tool. To start with, get repo by following the -instructions in the section “Install” on the [repo -site](https://gerrit.googlesource.com/git-repo#install). - -See the [repo cheatsheet] page for a quick explanation of how we use repo. - -## Docker or native - -To compile and use seL4 you can either: - -* *Recommended:* follow the [instructions here][docker] to use Docker for - isolating the dependencies from your machine, or -* install the build dependencies below on your local OS - -The following instructions describe how to set up the required dependencies on -your local OS. This page assumes you are building in a Linux OS. We however -encourage site [contributions] for build instructions in other OSes (e.g. -macOS). - -## Ubuntu - -These instructions are intended for Ubuntu LTS versions 20.04 and 22.04. - -{% include note.html %} -If you discover any missing dependencies and packages we welcome new -[contributions] to the page. You can [edit this section directly on GitHub][edit]. -{% include endnote.html %} - -### Base dependencies - -The basic build package on Ubuntu is the `build-essential` package. To install run: - -```sh -sudo apt-get update -sudo apt-get install build-essential -``` - -Additional base dependencies for building seL4 projects on Ubuntu include installing: - -```sh -sudo apt-get install cmake ccache ninja-build cmake-curses-gui -sudo apt-get install libxml2-utils ncurses-dev -sudo apt-get install curl git doxygen device-tree-compiler xxd -sudo apt-get install u-boot-tools -sudo apt-get install python3-dev python3-pip python-is-python3 -sudo apt-get install protobuf-compiler python3-protobuf -``` - -### Simulating with QEMU - -In order to run seL4 projects on a simulator you will need QEMU: - -```sh -sudo apt-get install qemu-system-arm qemu-system-x86 qemu-system-misc -``` - -### Cross-compiling for ARM targets - -To build for ARM targets you will need a cross compiler: - -```sh -sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi -sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu -``` - -(you can install the hardware floating point versions as well if you wish) - -```sh -sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -``` - -### Cross-compiling for RISC-V targets - -To build for RISC-V targets you will need a cross compiler: - -{% include risc-v.md %} - -### Building the seL4 manual - -If you would like to build the seL4 manual, you will need the following LaTeX pacakges: - -```sh -sudo apt-get install texlive texlive-latex-extra texlive-fonts-extra -``` - -## Debian - -The dependencies listed in our Docker files -[repository](https://github.com/seL4/seL4-CAmkES-L4v-dockerfiles) will work for -a Debian Bullseye, most likely also for later releases. You can refer to this repository -for an up-to-date list of base build dependencies. Specifically refer to the -dependencies listed in the file here: - -* [Base Tools](https://github.com/seL4/seL4-CAmkES-L4v-dockerfiles/blob/master/scripts/base_tools.sh) -* [seL4](https://github.com/seL4/seL4-CAmkES-L4v-dockerfiles/blob/master/scripts/sel4.sh) -* [LaTeX](https://github.com/seL4/seL4-CAmkES-L4v-dockerfiles/blob/master/scripts/apply-tex.sh) - -## Python - -A number of Python packages are required to build seL4 and its manual. To install these you can run: - -```sh -pip3 install --user setuptools sel4-deps -``` - -(Some distributions use `pip` for python3, others use `pip3`. Use the Python 3 version for your distribution) - -{% include pip-instructions.md deps="sel4-deps" %} - -[edit]: https://github.com/seL4/docs/edit/master/_includes/seL4-deps.md -[repo cheatsheet]: {{ '/projects/buildsystem/repo-cheatsheet.html' | relative_url }} -[contributions]: {{ '/processes/docs-contributing.html' | relative_url }} -[docker]: {{ '/projects/dockerfiles/' | relative_url }} diff --git a/_includes/sel4test.md b/_includes/sel4test.md deleted file mode 100644 index d300fe0941d..00000000000 --- a/_includes/sel4test.md +++ /dev/null @@ -1,40 +0,0 @@ -{% comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. -{% endcomment %} - -{% comment %} -This include generates commands for checking out and building sel4test for a particular platorm. -The platform defines what config it uses, and if it specifies a simulation target, then a simulation command will be added. -{% endcomment %} - -Checkout the sel4test project using repo as per [seL4Test] -```bash -repo init -u https://github.com/seL4/sel4test-manifest.git -repo sync -mkdir cbuild -cd cbuild -../init-build.sh -DPLATFORM={{ page.cmake_plat }} {{page.xcompiler_arg}} -# The default cmake wrapper sets up a default configuration for the target platform. -# To change individual settings, run `ccmake .` and change the configuration -# parameters to suit your needs. -ninja - -{%- if page.simulation_target and page.simulation_only == false %} -# This platform is a simulation target. This script should work to run the -# generated image if you also use -DSIMULATION=1 for init-build above: -{%- endif %} -{%- if page.simulation_target %} -./simulate -{%- endif %} - -``` - -{%- if page.simulation_target and page.simulation_only == false %} -If you plan to use the ./simulate script, please be sure to add the -`-DSIMULATION=1` argument when running cmake. -{%- endif %} - -Generated binaries can be found in the `images/` directory. - -[seL4Test]: {{ '/projects/sel4test/' | relative_url }} diff --git a/_includes/sidebar.html b/_includes/sidebar.html deleted file mode 100644 index 5da08b24e61..00000000000 --- a/_includes/sidebar.html +++ /dev/null @@ -1,94 +0,0 @@ -{%- comment -%} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. -{%- endcomment -%} -{%- assign page_url = page.url | split: "/" -%} - - - {% svg assets/logo-sel4-docs.svg class="px-4 w-50 h-20 mx-auto mt-4 mb-10" %} - - - diff --git a/_includes/tab.html b/_includes/tab.html deleted file mode 100644 index 33f3697f9a7..00000000000 --- a/_includes/tab.html +++ /dev/null @@ -1,11 +0,0 @@ -{%- comment %} -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 Proofcraft Pty Ltd -{% endcomment -%} - - - +
+
+ + diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 2ac28b30e87..00000000000 --- a/package-lock.json +++ /dev/null @@ -1,1367 +0,0 @@ -{ - "name": "@sel4/docs", - "version": "2.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@sel4/docs", - "version": "2.0.0", - "dependencies": { - "@tailwindcss/postcss": "^4.1", - "@tailwindcss/typography": "^0.5.16", - "postcss": "^8.4.49", - "postcss-cli": "^11.0.0", - "tailwindcss": "^4.1" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", - "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "enhanced-resolve": "^5.18.3", - "jiti": "^2.6.1", - "lightningcss": "1.30.2", - "magic-string": "^0.30.21", - "source-map-js": "^1.2.1", - "tailwindcss": "4.1.18" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", - "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.18", - "@tailwindcss/oxide-darwin-arm64": "4.1.18", - "@tailwindcss/oxide-darwin-x64": "4.1.18", - "@tailwindcss/oxide-freebsd-x64": "4.1.18", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", - "@tailwindcss/oxide-linux-x64-musl": "4.1.18", - "@tailwindcss/oxide-wasm32-wasi": "4.1.18", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", - "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", - "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", - "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", - "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", - "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", - "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", - "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", - "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", - "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", - "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", - "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.1.0", - "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", - "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", - "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/postcss": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", - "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.18", - "@tailwindcss/oxide": "4.1.18", - "postcss": "^8.4.41", - "tailwindcss": "4.1.18" - } - }, - "node_modules/@tailwindcss/typography": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz", - "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "6.0.10" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/dependency-graph": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", - "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/enhanced-resolve": { - "version": "5.18.4", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", - "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-extra": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/lightningcss": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.30.2", - "lightningcss-darwin-arm64": "1.30.2", - "lightningcss-darwin-x64": "1.30.2", - "lightningcss-freebsd-x64": "1.30.2", - "lightningcss-linux-arm-gnueabihf": "1.30.2", - "lightningcss-linux-arm64-gnu": "1.30.2", - "lightningcss-linux-arm64-musl": "1.30.2", - "lightningcss-linux-x64-gnu": "1.30.2", - "lightningcss-linux-x64-musl": "1.30.2", - "lightningcss-win32-arm64-msvc": "1.30.2", - "lightningcss-win32-x64-msvc": "1.30.2" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", - "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", - "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", - "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", - "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", - "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", - "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", - "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", - "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", - "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-cli": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.1.tgz", - "integrity": "sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==", - "license": "MIT", - "dependencies": { - "chokidar": "^3.3.0", - "dependency-graph": "^1.0.0", - "fs-extra": "^11.0.0", - "picocolors": "^1.0.0", - "postcss-load-config": "^5.0.0", - "postcss-reporter": "^7.0.0", - "pretty-hrtime": "^1.0.3", - "read-cache": "^1.0.0", - "slash": "^5.0.0", - "tinyglobby": "^0.2.12", - "yargs": "^17.0.0" - }, - "bin": { - "postcss": "index.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-load-config": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", - "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1", - "yaml": "^2.4.2" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - } - } - }, - "node_modules/postcss-reporter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", - "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "thenby": "^1.3.4" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tailwindcss": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", - "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/thenby": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", - "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", - "license": "Apache-2.0" - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 698b729b583..00000000000 --- a/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "@sel4/docs", - "version": "2.0.0", - "dependencies": { - "@tailwindcss/typography": "^0.5.16", - "@tailwindcss/postcss": "^4.1", - "postcss": "^8.4.49", - "postcss-cli": "^11.0.0", - "tailwindcss": "^4.1" - } -} diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index 75de99e1d4e..00000000000 --- a/postcss.config.js +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2025 Proofcraft Pty Ltd -// SPDX-License-Identifier: BSD-2-Clause - -module.exports = { - plugins: [ - require('@tailwindcss/postcss'), - ] -} diff --git a/processes/code-review.html b/processes/code-review.html new file mode 100644 index 00000000000..9d87ded1640 --- /dev/null +++ b/processes/code-review.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/processes/code-review.md b/processes/code-review.md deleted file mode 100644 index ee0651bab96..00000000000 --- a/processes/code-review.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. -redirect_to: https://sel4.systems/Contribute/pull-requests.html ---- diff --git a/processes/conduct.html b/processes/conduct.html new file mode 100644 index 00000000000..45bb1da43af --- /dev/null +++ b/processes/conduct.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/processes/conduct.md b/processes/conduct.md deleted file mode 100644 index cd39d1c2c83..00000000000 --- a/processes/conduct.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. -redirect_to: https://sel4.systems/Contribute/conduct.html ---- diff --git a/processes/contributing.html b/processes/contributing.html new file mode 100644 index 00000000000..e16fb5e8192 --- /dev/null +++ b/processes/contributing.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/processes/contributing.md b/processes/contributing.md deleted file mode 100644 index c1c965a36a2..00000000000 --- a/processes/contributing.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. -redirect_to: https://sel4.systems/Contribute/ ---- diff --git a/processes/docs-contributing.html b/processes/docs-contributing.html new file mode 100644 index 00000000000..407d70d2372 --- /dev/null +++ b/processes/docs-contributing.html @@ -0,0 +1,650 @@ + + + + + + + Contributing to the seL4 documentation | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/processes/docs-contributing.md b/processes/docs-contributing.md deleted file mode 100644 index b7c6e778722..00000000000 --- a/processes/docs-contributing.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -redirect_from: - - /DocsContributing -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Contributing to the seL4 documentation - -Thank you for considering helping improve the seL4 documentation. - -This page is about contributing to the [documentation site][docsite]. For -contributing to other parts of the seL4 ecosystem, visit our main [contributing -page][contribute]. - -We believe that documentation is important for any project and appreciate any -contributions that improves it. The sort of contributions that we are looking -for are: - -- Bug reporting - - Stale or incorrect sections - - Missing documentation - - Ideas of how our documentation could be structured better -- Improvements - - Grammar, consistency, and spelling fixes - - Missing documentation - - Usage examples - - Tutorials - - Links to related external documentation - -For reporting issues about a particular project, please use the relevant -repository's issue tracker or if that doesn't work post on any of the [community -channels][support]. - -## Your first contribution - -You have noticed something that is wrong with some documentation on the site. -GitHub makes it pretty easy to edit Markdown files without having to leave the -browser. By clicking "Edit" on the relevant file, making your change and then -submitting a pull request, someone can then review you change and merge it which -will result in the update appearing on the website. - -More detailed changes can be achieved by checking out the repository and editing -locally, followed by committing and making a pull request manually. The -`README.md` files describes how to host the site locally so that you can see how -your changes are presented. - -Contributions that are most helpful to us at the moment are: - -- Identifying which pages contain stale documentation. Filing an issue in the - issue tracker will let us know that something is broken or old. -- Identifying areas where there is missing documentation or it is confusing. - -## Submitting a contribution - -Contributions can be submitted by pull requests at . - -Please follow the [git commit style guide](https://sel4.systems/Contribute/git-conventions.html). - -### Style - -This repository contains sources in various formats. The general principle is to -follow the same style used in the rest of the file or similar files. - -Languages and style guides that the docsite uses: - -- Markdown: GitHub flavoured markdown, rendered by kramdown. - [Styleguide](https://github.com/slang800/markdown-styleguide). Please wrap - lines at 80 characters. -- HTML: Should be only used for presentation related content. - Use markdown when possible. [Styleguide](https://google.github.io/styleguide/htmlcssguide.html). -- Liquid templating language: We use - [liquid-linter](https://www.npmjs.com/package/liquid-linter-cli) to check for - liquid errors. - -### Code review process - -Someone who is familiar with the source will review your changes. They may -request changes or have questions, or merge the pull request if everything looks -good. - -## Reporting an issue or feature enhancement - -To report an issue, open an issue in the [repository issue tracker][issues]. -Issues can be reporting problems, or ideas for improvement. - -- What is the issue? -- Why is it a issue? - -And if relevant - -- What do you think a good fix or change may be? -- How the fix or change removes the issue? - -[support]: https://sel4.systems/support.html -[contribute]: https://sel4.systems/Contribute/ -[docsite]: ../ -[issues]: https://github.com/seL4/docs/issues diff --git a/processes/git-conventions.html b/processes/git-conventions.html new file mode 100644 index 00000000000..20ced3da938 --- /dev/null +++ b/processes/git-conventions.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/processes/git-conventions.md b/processes/git-conventions.md deleted file mode 100644 index adf39abe544..00000000000 --- a/processes/git-conventions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. -redirect_to: https://sel4.systems/Contribute/git-conventions.html ---- diff --git a/processes/index.html b/processes/index.html new file mode 100644 index 00000000000..bee2c51ba95 --- /dev/null +++ b/processes/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/processes/index.md b/processes/index.md deleted file mode 100644 index 9627c6c3c84..00000000000 --- a/processes/index.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. -redirect_to: https://sel4.systems/support.html ---- \ No newline at end of file diff --git a/processes/licenses.html b/processes/licenses.html new file mode 100644 index 00000000000..84ec808cb20 --- /dev/null +++ b/processes/licenses.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/processes/licenses.md b/processes/licenses.md deleted file mode 100644 index 66baf603666..00000000000 --- a/processes/licenses.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. -redirect_to: https://sel4.systems/Legal/license.html ---- diff --git a/processes/release-process.html b/processes/release-process.html new file mode 100644 index 00000000000..800f56803e9 --- /dev/null +++ b/processes/release-process.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/processes/rfc-process.html b/processes/rfc-process.html new file mode 100644 index 00000000000..8bef45fb59c --- /dev/null +++ b/processes/rfc-process.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/processes/rfc-process.md b/processes/rfc-process.md deleted file mode 100644 index 03ea98c25b9..00000000000 --- a/processes/rfc-process.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. -redirect_to: https://sel4.systems/Contribute/rfc-process.html ---- diff --git a/processes/roles.html b/processes/roles.html new file mode 100644 index 00000000000..51a3c7eb741 --- /dev/null +++ b/processes/roles.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/processes/roles.md b/processes/roles.md deleted file mode 100644 index 0b77482f892..00000000000 --- a/processes/roles.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. -redirect_to: https://sel4.systems/Contribute/roles.html ---- diff --git a/processes/style-guide.html b/processes/style-guide.html new file mode 100644 index 00000000000..bc117af1e9c --- /dev/null +++ b/processes/style-guide.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/processes/style-guide.md b/processes/style-guide.md deleted file mode 100644 index 89cf8d6abc0..00000000000 --- a/processes/style-guide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. -redirect_to: https://sel4.systems/Contribute/style.html ---- diff --git a/processes/test-status.html b/processes/test-status.html new file mode 100644 index 00000000000..1edc6131a23 --- /dev/null +++ b/processes/test-status.html @@ -0,0 +1,864 @@ + + + + + + + | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ +
+ + +

seL4 Test Status

+ +

The following list shows the current status of all seL4 GitHub test workflows +on the main branch.

+ +

Main Tests

+ +

seL4Test +Proofs +Proof Sync +seL4Bench +CAmkES +CAmkES VM

+ +
+ +

Main repositories

+ +

seL4

+ +

Compile +C Parser +RefMan +Proof Sync +CI +seL4Test +Trigger +XML

+ +

l4v

+ +

CI +Trigger +External +Weekly Clean +Proofs

+ +

sel4bench

+ +

CI +seL4Bench

+ +

camkes-tool

+ +

CAmkES +CI +Trigger +Unit

+ +

camkes-vm-examples

+ +

Deploy +CI

+ +

capdl

+ +

Build +CI +Trigger

+ +

sel4-tutorials

+ +

CI +Test

+ +

microkit

+ +

CI +SDK

+ +

rust-sel4

+ +

CI

+ +
+ +

All repositories

+ +

cakeml_libs

+ +

CI +Trigger

+ +

camkes

+ +

CI +Trigger

+ +

camkes-manifest

+ +

CI

+ +

camkes-tool

+ +

CAmkES +CI +Trigger +Unit

+ +

camkes-vm

+ +

CI +Trigger

+ +

camkes-vm-examples

+ +

Deploy +CI

+ +

camkes-vm-examples-manifest

+ +

CI

+ +

camkes-vm-images

+ +

CI +Trigger

+ +

camkes-vm-linux

+ +

CI +Trigger

+ +

capdl

+ +

Build +CI +Trigger

+ +

ci-actions

+ +

Deploy CAmkES Test +Deploy CAmkES Unit +Deploy CAmkES VM +Deploy CParser Builder +Deploy CParser Run +Deploy Link Check +Deploy Preprocess Test +Deploy RumpRun +Deploy Proof Run +Deploy seL4 Bench +Deploy seL4 HW +Deploy seL4 Sim +Deploy Tutorial Test +Deploy webserver image +Isabelle Mirror +CI

+ +

docs

+ +

Build +CI

+ +

global-components

+ +

CI +Trigger

+ +

graph-refine

+ +

Binary decompilation +Build +Build +CI +Trigger

+ +

l4v

+ +

CI +Trigger +External +Weekly Clean +Proofs

+ +

mcs-examples

+ +

CI

+ +

microkit

+ +

CI +SDK

+ +

projects_libs

+ +

CI +Trigger

+ +

pruner

+ +

CI +Trigger

+ +

refos

+ +

CI

+ +

rumprun-sel4-demoapps

+ +

CI +Hello World

+ +

rust-microkit-demo

+ +

CI

+ +

rust-microkit-http-server-demo

+ +

CI

+ +

rust-root-task-demo

+ +

CI

+ +

rust-sel4

+ +

CI

+ +

seL4

+ +

Compile +C Parser +RefMan +Proof Sync +CI +seL4Test +Trigger +XML

+ +

seL4-CAmkES-L4v-dockerfiles

+ +

Deploy +CI

+ +

seL4_libs

+ +

CI +seL4Test +Trigger

+ +

seL4_projects_libs

+ +

CI +seL4Test +Trigger

+ +

seL4_tools

+ +

CI +seL4Test +Trigger

+ +

sel4-tutorials

+ +

CI +Test

+ +

sel4-tutorials-manifest

+ +

CI

+ +

sel4bench

+ +

CI +seL4Bench

+ +

sel4bench-manifest

+ +

CI

+ +

sel4runtime

+ +

CI +seL4Test +Trigger

+ +

sel4test

+ +

CI +seL4Test +Trigger

+ +

sel4test-manifest

+ +

CI +seL4Test

+ +

sel4webserver

+ +

CI +Web Server Demo

+ +

sel4webserver-manifest

+ +

CI

+ +

util_libs

+ +

CI +seL4Test Sim +Trigger

+ +

verification-manifest

+ +

CI +Trigger

+ +

website

+ +

CI

+ +

whitepaper

+ +

build PDF +License

+ +
+ +
+
+ + + +
+
+
+ + diff --git a/processes/test-status.md b/processes/test-status.md deleted file mode 100644 index b614e3d0b6c..00000000000 --- a/processes/test-status.md +++ /dev/null @@ -1,326 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2022 seL4 Project a Series of LF Projects, LLC. -layout: test ---- - - - -# seL4 Test Status - -The following list shows the current status of all seL4 GitHub test workflows -on the main branch. - -## Main Tests - -[![seL4Test](https://github.com/seL4/seL4/actions/workflows/sel4test-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/sel4test-deploy.yml?query=branch%3Amaster) -[![Proofs](https://github.com/seL4/l4v/actions/workflows/proof-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/l4v/actions/workflows/proof-deploy.yml?query=branch%3Amaster) -[![Proof Sync](https://github.com/seL4/seL4/actions/workflows/preprocess-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/preprocess-deploy.yml?query=branch%3Amaster) -[![seL4Bench](https://github.com/seL4/sel4bench/actions/workflows/sel4bench.yml/badge.svg?branch=master)](https://github.com/seL4/sel4bench/actions/workflows/sel4bench.yml?query=branch%3Amaster) -[![CAmkES](https://github.com/seL4/camkes-tool/actions/workflows/camkes-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-tool/actions/workflows/camkes-deploy.yml?query=branch%3Amaster) -[![CAmkES VM](https://github.com/seL4/camkes-vm-examples/actions/workflows/camkes-vm-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-vm-examples/actions/workflows/camkes-vm-deploy.yml?query=branch%3Amaster) - ------ - - -## Main repositories - - -### [seL4](https://github.com/seL4/seL4/) - -[![Compile](https://github.com/seL4/seL4/actions/workflows/compilation-checks.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/compilation-checks.yml?query=branch%3Amaster) -[![C Parser](https://github.com/seL4/seL4/actions/workflows/cparser.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/cparser.yml?query=branch%3Amaster) -[![RefMan](https://github.com/seL4/seL4/actions/workflows/manual.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/manual.yml?query=branch%3Amaster) -[![Proof Sync](https://github.com/seL4/seL4/actions/workflows/preprocess-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/preprocess-deploy.yml?query=branch%3Amaster) -[![CI](https://github.com/seL4/seL4/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/push.yml?query=branch%3Amaster) -[![seL4Test](https://github.com/seL4/seL4/actions/workflows/sel4test-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/sel4test-deploy.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/seL4/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/trigger.yml?query=branch%3Amaster) -[![XML](https://github.com/seL4/seL4/actions/workflows/xml_lint.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/xml_lint.yml?query=branch%3Amaster) - -### [l4v](https://github.com/seL4/l4v/) - -[![CI](https://github.com/seL4/l4v/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/l4v/actions/workflows/push.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/l4v/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/l4v/actions/workflows/trigger.yml?query=branch%3Amaster) -[![External](https://github.com/seL4/l4v/actions/workflows/external.yml/badge.svg?branch=master)](https://github.com/seL4/l4v/actions/workflows/external.yml?query=branch%3Amaster) -[![Weekly Clean](https://github.com/seL4/l4v/actions/workflows/weekly-clean.yml/badge.svg?branch=master)](https://github.com/seL4/l4v/actions/workflows/weekly-clean.yml?query=branch%3Amaster) -[![Proofs](https://github.com/seL4/l4v/actions/workflows/proof-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/l4v/actions/workflows/proof-deploy.yml?query=branch%3Amaster) - -### [sel4bench](https://github.com/seL4/sel4bench/) - -[![CI](https://github.com/seL4/sel4bench/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/sel4bench/actions/workflows/push.yml?query=branch%3Amaster) -[![seL4Bench](https://github.com/seL4/sel4bench/actions/workflows/sel4bench.yml/badge.svg?branch=master)](https://github.com/seL4/sel4bench/actions/workflows/sel4bench.yml?query=branch%3Amaster) - -### [camkes-tool](https://github.com/seL4/camkes-tool/) - -[![CAmkES](https://github.com/seL4/camkes-tool/actions/workflows/camkes-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-tool/actions/workflows/camkes-deploy.yml?query=branch%3Amaster) -[![CI](https://github.com/seL4/camkes-tool/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-tool/actions/workflows/push.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/camkes-tool/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-tool/actions/workflows/trigger.yml?query=branch%3Amaster) -[![Unit](https://github.com/seL4/camkes-tool/actions/workflows/unit.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-tool/actions/workflows/unit.yml?query=branch%3Amaster) - -### [camkes-vm-examples](https://github.com/seL4/camkes-vm-examples/) - -[![Deploy](https://github.com/seL4/camkes-vm-examples/actions/workflows/camkes-vm-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-vm-examples/actions/workflows/camkes-vm-deploy.yml?query=branch%3Amaster) -[![CI](https://github.com/seL4/camkes-vm-examples/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-vm-examples/actions/workflows/push.yml?query=branch%3Amaster) - -### [capdl](https://github.com/seL4/capdl/) - -[![Build](https://github.com/seL4/capdl/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/seL4/capdl/actions/workflows/build.yml?query=branch%3Amaster) -[![CI](https://github.com/seL4/capdl/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/capdl/actions/workflows/push.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/capdl/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/capdl/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [sel4-tutorials](https://github.com/seL4/sel4-tutorials/) - -[![CI](https://github.com/seL4/sel4-tutorials/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/sel4-tutorials/actions/workflows/push.yml?query=branch%3Amaster) -[![Test](https://github.com/seL4/sel4-tutorials/actions/workflows/test.yml/badge.svg?branch=master)](https://github.com/seL4/sel4-tutorials/actions/workflows/test.yml?query=branch%3Amaster) - -### [microkit](https://github.com/seL4/microkit/) - -[![CI](https://github.com/seL4/microkit/actions/workflows/push.yml/badge.svg?branch=main)](https://github.com/seL4/microkit/actions/workflows/push.yml?query=branch%3Amain) -[![SDK](https://github.com/seL4/microkit/actions/workflows/sdk.yaml/badge.svg?branch=main)](https://github.com/seL4/microkit/actions/workflows/sdk.yaml?query=branch%3Amain) - -### [rust-sel4](https://github.com/seL4/rust-sel4/) - -[![CI](https://github.com/seL4/rust-sel4/actions/workflows/push.yaml/badge.svg?branch=main)](https://github.com/seL4/rust-sel4/actions/workflows/push.yaml?query=branch%3Amain) - ------ - -## All repositories - - -### [cakeml_libs](https://github.com/seL4/cakeml_libs/) - -[![CI](https://github.com/seL4/cakeml_libs/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/cakeml_libs/actions/workflows/push.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/cakeml_libs/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/cakeml_libs/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [camkes](https://github.com/seL4/camkes/) - -[![CI](https://github.com/seL4/camkes/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/camkes/actions/workflows/push.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/camkes/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/camkes/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [camkes-manifest](https://github.com/seL4/camkes-manifest/) - -[![CI](https://github.com/seL4/camkes-manifest/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-manifest/actions/workflows/push.yml?query=branch%3Amaster) - -### [camkes-tool](https://github.com/seL4/camkes-tool/) - -[![CAmkES](https://github.com/seL4/camkes-tool/actions/workflows/camkes-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-tool/actions/workflows/camkes-deploy.yml?query=branch%3Amaster) -[![CI](https://github.com/seL4/camkes-tool/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-tool/actions/workflows/push.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/camkes-tool/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-tool/actions/workflows/trigger.yml?query=branch%3Amaster) -[![Unit](https://github.com/seL4/camkes-tool/actions/workflows/unit.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-tool/actions/workflows/unit.yml?query=branch%3Amaster) - -### [camkes-vm](https://github.com/seL4/camkes-vm/) - -[![CI](https://github.com/seL4/camkes-vm/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-vm/actions/workflows/push.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/camkes-vm/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-vm/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [camkes-vm-examples](https://github.com/seL4/camkes-vm-examples/) - -[![Deploy](https://github.com/seL4/camkes-vm-examples/actions/workflows/camkes-vm-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-vm-examples/actions/workflows/camkes-vm-deploy.yml?query=branch%3Amaster) -[![CI](https://github.com/seL4/camkes-vm-examples/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-vm-examples/actions/workflows/push.yml?query=branch%3Amaster) - -### [camkes-vm-examples-manifest](https://github.com/seL4/camkes-vm-examples-manifest/) - -[![CI](https://github.com/seL4/camkes-vm-examples-manifest/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-vm-examples-manifest/actions/workflows/push.yml?query=branch%3Amaster) - -### [camkes-vm-images](https://github.com/seL4/camkes-vm-images/) - -[![CI](https://github.com/seL4/camkes-vm-images/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-vm-images/actions/workflows/push.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/camkes-vm-images/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-vm-images/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [camkes-vm-linux](https://github.com/seL4/camkes-vm-linux/) - -[![CI](https://github.com/seL4/camkes-vm-linux/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-vm-linux/actions/workflows/push.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/camkes-vm-linux/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/camkes-vm-linux/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [capdl](https://github.com/seL4/capdl/) - -[![Build](https://github.com/seL4/capdl/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/seL4/capdl/actions/workflows/build.yml?query=branch%3Amaster) -[![CI](https://github.com/seL4/capdl/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/capdl/actions/workflows/push.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/capdl/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/capdl/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [ci-actions](https://github.com/seL4/ci-actions/) - -[![Deploy CAmkES Test](https://github.com/seL4/ci-actions/actions/workflows/deploy-camkes-test.yml/badge.svg?branch=master)](https://github.com/seL4/ci-actions/actions/workflows/deploy-camkes-test.yml?query=branch%3Amaster) -[![Deploy CAmkES Unit](https://github.com/seL4/ci-actions/actions/workflows/deploy-camkes-unit.yml/badge.svg?branch=master)](https://github.com/seL4/ci-actions/actions/workflows/deploy-camkes-unit.yml?query=branch%3Amaster) -[![Deploy CAmkES VM](https://github.com/seL4/ci-actions/actions/workflows/deploy-camkes-vm.yml/badge.svg?branch=master)](https://github.com/seL4/ci-actions/actions/workflows/deploy-camkes-vm.yml?query=branch%3Amaster) -[![Deploy CParser Builder](https://github.com/seL4/ci-actions/actions/workflows/deploy-cparser-builder.yml/badge.svg?branch=master)](https://github.com/seL4/ci-actions/actions/workflows/deploy-cparser-builder.yml?query=branch%3Amaster) -[![Deploy CParser Run](https://github.com/seL4/ci-actions/actions/workflows/deploy-cparser-run.yml/badge.svg?branch=master)](https://github.com/seL4/ci-actions/actions/workflows/deploy-cparser-run.yml?query=branch%3Amaster) -[![Deploy Link Check](https://github.com/seL4/ci-actions/actions/workflows/deploy-link-check.yml/badge.svg?branch=master)](https://github.com/seL4/ci-actions/actions/workflows/deploy-link-check.yml?query=branch%3Amaster) -[![Deploy Preprocess Test](https://github.com/seL4/ci-actions/actions/workflows/deploy-preprocess.yml/badge.svg?branch=master)](https://github.com/seL4/ci-actions/actions/workflows/deploy-preprocess.yml?query=branch%3Amaster) -[![Deploy RumpRun](https://github.com/seL4/ci-actions/actions/workflows/deploy-rumprun.yml/badge.svg?branch=master)](https://github.com/seL4/ci-actions/actions/workflows/deploy-rumprun.yml?query=branch%3Amaster) -[![Deploy Proof Run](https://github.com/seL4/ci-actions/actions/workflows/deploy-run-proofs.yml/badge.svg?branch=master)](https://github.com/seL4/ci-actions/actions/workflows/deploy-run-proofs.yml?query=branch%3Amaster) -[![Deploy seL4 Bench](https://github.com/seL4/ci-actions/actions/workflows/deploy-sel4bench.yml/badge.svg?branch=master)](https://github.com/seL4/ci-actions/actions/workflows/deploy-sel4bench.yml?query=branch%3Amaster) -[![Deploy seL4 HW](https://github.com/seL4/ci-actions/actions/workflows/deploy-sel4test-hw.yml/badge.svg?branch=master)](https://github.com/seL4/ci-actions/actions/workflows/deploy-sel4test-hw.yml?query=branch%3Amaster) -[![Deploy seL4 Sim](https://github.com/seL4/ci-actions/actions/workflows/deploy-sel4test-sim.yml/badge.svg?branch=master)](https://github.com/seL4/ci-actions/actions/workflows/deploy-sel4test-sim.yml?query=branch%3Amaster) -[![Deploy Tutorial Test](https://github.com/seL4/ci-actions/actions/workflows/deploy-tutorials.yml/badge.svg?branch=master)](https://github.com/seL4/ci-actions/actions/workflows/deploy-tutorials.yml?query=branch%3Amaster) -[![Deploy webserver image](https://github.com/seL4/ci-actions/actions/workflows/deploy-webserver.yml/badge.svg?branch=master)](https://github.com/seL4/ci-actions/actions/workflows/deploy-webserver.yml?query=branch%3Amaster) -[![Isabelle Mirror](https://github.com/seL4/ci-actions/actions/workflows/isabelle-mirror.yml/badge.svg?branch=master)](https://github.com/seL4/ci-actions/actions/workflows/isabelle-mirror.yml?query=branch%3Amaster) -[![CI](https://github.com/seL4/ci-actions/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/ci-actions/actions/workflows/push.yml?query=branch%3Amaster) - -### [docs](https://github.com/seL4/docs/) - -[![Build](https://github.com/seL4/docs/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/seL4/docs/actions/workflows/build.yml?query=branch%3Amaster) -[![CI](https://github.com/seL4/docs/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/docs/actions/workflows/push.yml?query=branch%3Amaster) - -### [global-components](https://github.com/seL4/global-components/) - -[![CI](https://github.com/seL4/global-components/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/global-components/actions/workflows/push.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/global-components/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/global-components/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [graph-refine](https://github.com/seL4/graph-refine/) - -[![Binary decompilation](https://github.com/seL4/graph-refine/actions/workflows/binary-decompilation.yml/badge.svg?branch=master)](https://github.com/seL4/graph-refine/actions/workflows/binary-decompilation.yml?query=branch%3Amaster) -[![Build](https://github.com/seL4/graph-refine/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/seL4/graph-refine/actions/workflows/build.yml?query=branch%3Amaster) -[![Build](https://github.com/seL4/graph-refine/actions/workflows/docker-build.yml/badge.svg?branch=master)](https://github.com/seL4/graph-refine/actions/workflows/docker-build.yml?query=branch%3Amaster) -[![CI](https://github.com/seL4/graph-refine/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/graph-refine/actions/workflows/push.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/graph-refine/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/graph-refine/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [l4v](https://github.com/seL4/l4v/) - -[![CI](https://github.com/seL4/l4v/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/l4v/actions/workflows/push.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/l4v/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/l4v/actions/workflows/trigger.yml?query=branch%3Amaster) -[![External](https://github.com/seL4/l4v/actions/workflows/external.yml/badge.svg?branch=master)](https://github.com/seL4/l4v/actions/workflows/external.yml?query=branch%3Amaster) -[![Weekly Clean](https://github.com/seL4/l4v/actions/workflows/weekly-clean.yml/badge.svg?branch=master)](https://github.com/seL4/l4v/actions/workflows/weekly-clean.yml?query=branch%3Amaster) -[![Proofs](https://github.com/seL4/l4v/actions/workflows/proof-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/l4v/actions/workflows/proof-deploy.yml?query=branch%3Amaster) - -### [mcs-examples](https://github.com/seL4/mcs-examples/) - -[![CI](https://github.com/seL4/mcs-examples/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/mcs-examples/actions/workflows/push.yml?query=branch%3Amaster) - -### [microkit](https://github.com/seL4/microkit/) - -[![CI](https://github.com/seL4/microkit/actions/workflows/push.yml/badge.svg?branch=main)](https://github.com/seL4/microkit/actions/workflows/push.yml?query=branch%3Amain) -[![SDK](https://github.com/seL4/microkit/actions/workflows/sdk.yaml/badge.svg?branch=main)](https://github.com/seL4/microkit/actions/workflows/sdk.yaml?query=branch%3Amain) - -### [projects_libs](https://github.com/seL4/projects_libs/) - -[![CI](https://github.com/seL4/projects_libs/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/projects_libs/actions/workflows/push.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/projects_libs/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/projects_libs/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [pruner](https://github.com/seL4/pruner/) - -[![CI](https://github.com/seL4/pruner/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/pruner/actions/workflows/push.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/pruner/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/pruner/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [refos](https://github.com/seL4/refos/) - -[![CI](https://github.com/seL4/refos/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/refos/actions/workflows/push.yml?query=branch%3Amaster) - -### [rumprun-sel4-demoapps](https://github.com/seL4/rumprun-sel4-demoapps/) - -[![CI](https://github.com/seL4/rumprun-sel4-demoapps/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/rumprun-sel4-demoapps/actions/workflows/push.yml?query=branch%3Amaster) -[![Hello World](https://github.com/seL4/rumprun-sel4-demoapps/actions/workflows/rump-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/rumprun-sel4-demoapps/actions/workflows/rump-deploy.yml?query=branch%3Amaster) - -### [rust-microkit-demo](https://github.com/seL4/rust-microkit-demo/) - -[![CI](https://github.com/seL4/rust-microkit-demo/actions/workflows/push.yaml/badge.svg?branch=main)](https://github.com/seL4/rust-microkit-demo/actions/workflows/push.yaml?query=branch%3Amain) - -### [rust-microkit-http-server-demo](https://github.com/seL4/rust-microkit-http-server-demo/) - -[![CI](https://github.com/seL4/rust-microkit-http-server-demo/actions/workflows/push.yaml/badge.svg?branch=main)](https://github.com/seL4/rust-microkit-http-server-demo/actions/workflows/push.yaml?query=branch%3Amain) - -### [rust-root-task-demo](https://github.com/seL4/rust-root-task-demo/) - -[![CI](https://github.com/seL4/rust-root-task-demo/actions/workflows/push.yaml/badge.svg?branch=main)](https://github.com/seL4/rust-root-task-demo/actions/workflows/push.yaml?query=branch%3Amain) - -### [rust-sel4](https://github.com/seL4/rust-sel4/) - -[![CI](https://github.com/seL4/rust-sel4/actions/workflows/push.yaml/badge.svg?branch=main)](https://github.com/seL4/rust-sel4/actions/workflows/push.yaml?query=branch%3Amain) - -### [seL4](https://github.com/seL4/seL4/) - -[![Compile](https://github.com/seL4/seL4/actions/workflows/compilation-checks.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/compilation-checks.yml?query=branch%3Amaster) -[![C Parser](https://github.com/seL4/seL4/actions/workflows/cparser.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/cparser.yml?query=branch%3Amaster) -[![RefMan](https://github.com/seL4/seL4/actions/workflows/manual.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/manual.yml?query=branch%3Amaster) -[![Proof Sync](https://github.com/seL4/seL4/actions/workflows/preprocess-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/preprocess-deploy.yml?query=branch%3Amaster) -[![CI](https://github.com/seL4/seL4/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/push.yml?query=branch%3Amaster) -[![seL4Test](https://github.com/seL4/seL4/actions/workflows/sel4test-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/sel4test-deploy.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/seL4/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/trigger.yml?query=branch%3Amaster) -[![XML](https://github.com/seL4/seL4/actions/workflows/xml_lint.yml/badge.svg?branch=master)](https://github.com/seL4/seL4/actions/workflows/xml_lint.yml?query=branch%3Amaster) - -### [seL4-CAmkES-L4v-dockerfiles](https://github.com/seL4/seL4-CAmkES-L4v-dockerfiles/) - -[![Deploy](https://github.com/seL4/seL4-CAmkES-L4v-dockerfiles/actions/workflows/docker-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/seL4-CAmkES-L4v-dockerfiles/actions/workflows/docker-deploy.yml?query=branch%3Amaster) -[![CI](https://github.com/seL4/seL4-CAmkES-L4v-dockerfiles/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/seL4-CAmkES-L4v-dockerfiles/actions/workflows/push.yml?query=branch%3Amaster) - -### [seL4_libs](https://github.com/seL4/seL4_libs/) - -[![CI](https://github.com/seL4/seL4_libs/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/seL4_libs/actions/workflows/push.yml?query=branch%3Amaster) -[![seL4Test](https://github.com/seL4/seL4_libs/actions/workflows/sel4test-sim.yml/badge.svg?branch=master)](https://github.com/seL4/seL4_libs/actions/workflows/sel4test-sim.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/seL4_libs/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/seL4_libs/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [seL4_projects_libs](https://github.com/seL4/seL4_projects_libs/) - -[![CI](https://github.com/seL4/seL4_projects_libs/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/seL4_projects_libs/actions/workflows/push.yml?query=branch%3Amaster) -[![seL4Test](https://github.com/seL4/seL4_projects_libs/actions/workflows/sel4test-sim.yml/badge.svg?branch=master)](https://github.com/seL4/seL4_projects_libs/actions/workflows/sel4test-sim.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/seL4_projects_libs/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/seL4_projects_libs/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [seL4_tools](https://github.com/seL4/seL4_tools/) - -[![CI](https://github.com/seL4/seL4_tools/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/seL4_tools/actions/workflows/push.yml?query=branch%3Amaster) -[![seL4Test](https://github.com/seL4/seL4_tools/actions/workflows/sel4test-sim.yml/badge.svg?branch=master)](https://github.com/seL4/seL4_tools/actions/workflows/sel4test-sim.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/seL4_tools/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/seL4_tools/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [sel4-tutorials](https://github.com/seL4/sel4-tutorials/) - -[![CI](https://github.com/seL4/sel4-tutorials/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/sel4-tutorials/actions/workflows/push.yml?query=branch%3Amaster) -[![Test](https://github.com/seL4/sel4-tutorials/actions/workflows/test.yml/badge.svg?branch=master)](https://github.com/seL4/sel4-tutorials/actions/workflows/test.yml?query=branch%3Amaster) - -### [sel4-tutorials-manifest](https://github.com/seL4/sel4-tutorials-manifest/) - -[![CI](https://github.com/seL4/sel4-tutorials-manifest/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/sel4-tutorials-manifest/actions/workflows/push.yml?query=branch%3Amaster) - -### [sel4bench](https://github.com/seL4/sel4bench/) - -[![CI](https://github.com/seL4/sel4bench/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/sel4bench/actions/workflows/push.yml?query=branch%3Amaster) -[![seL4Bench](https://github.com/seL4/sel4bench/actions/workflows/sel4bench.yml/badge.svg?branch=master)](https://github.com/seL4/sel4bench/actions/workflows/sel4bench.yml?query=branch%3Amaster) - -### [sel4bench-manifest](https://github.com/seL4/sel4bench-manifest/) - -[![CI](https://github.com/seL4/sel4bench-manifest/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/sel4bench-manifest/actions/workflows/push.yml?query=branch%3Amaster) - -### [sel4runtime](https://github.com/seL4/sel4runtime/) - -[![CI](https://github.com/seL4/sel4runtime/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/sel4runtime/actions/workflows/push.yml?query=branch%3Amaster) -[![seL4Test](https://github.com/seL4/sel4runtime/actions/workflows/sel4test-sim.yml/badge.svg?branch=master)](https://github.com/seL4/sel4runtime/actions/workflows/sel4test-sim.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/sel4runtime/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/sel4runtime/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [sel4test](https://github.com/seL4/sel4test/) - -[![CI](https://github.com/seL4/sel4test/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/sel4test/actions/workflows/push.yml?query=branch%3Amaster) -[![seL4Test](https://github.com/seL4/sel4test/actions/workflows/sel4test-sim.yml/badge.svg?branch=master)](https://github.com/seL4/sel4test/actions/workflows/sel4test-sim.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/sel4test/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/sel4test/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [sel4test-manifest](https://github.com/seL4/sel4test-manifest/) - -[![CI](https://github.com/seL4/sel4test-manifest/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/sel4test-manifest/actions/workflows/push.yml?query=branch%3Amaster) -[![seL4Test](https://github.com/seL4/sel4test-manifest/actions/workflows/sel4test-sim.yml/badge.svg?branch=master)](https://github.com/seL4/sel4test-manifest/actions/workflows/sel4test-sim.yml?query=branch%3Amaster) - -### [sel4webserver](https://github.com/seL4/sel4webserver/) - -[![CI](https://github.com/seL4/sel4webserver/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/sel4webserver/actions/workflows/push.yml?query=branch%3Amaster) -[![Web Server Demo](https://github.com/seL4/sel4webserver/actions/workflows/sel4webserver-deploy.yml/badge.svg?branch=master)](https://github.com/seL4/sel4webserver/actions/workflows/sel4webserver-deploy.yml?query=branch%3Amaster) - -### [sel4webserver-manifest](https://github.com/seL4/sel4webserver-manifest/) - -[![CI](https://github.com/seL4/sel4webserver-manifest/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/sel4webserver-manifest/actions/workflows/push.yml?query=branch%3Amaster) - -### [util_libs](https://github.com/seL4/util_libs/) - -[![CI](https://github.com/seL4/util_libs/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/util_libs/actions/workflows/push.yml?query=branch%3Amaster) -[![seL4Test Sim](https://github.com/seL4/util_libs/actions/workflows/sel4test-sim.yml/badge.svg?branch=master)](https://github.com/seL4/util_libs/actions/workflows/sel4test-sim.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/util_libs/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/util_libs/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [verification-manifest](https://github.com/seL4/verification-manifest/) - -[![CI](https://github.com/seL4/verification-manifest/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/verification-manifest/actions/workflows/push.yml?query=branch%3Amaster) -[![Trigger](https://github.com/seL4/verification-manifest/actions/workflows/trigger.yml/badge.svg?branch=master)](https://github.com/seL4/verification-manifest/actions/workflows/trigger.yml?query=branch%3Amaster) - -### [website](https://github.com/seL4/website/) - -[![CI](https://github.com/seL4/website/actions/workflows/push.yml/badge.svg?branch=master)](https://github.com/seL4/website/actions/workflows/push.yml?query=branch%3Amaster) - -### [whitepaper](https://github.com/seL4/whitepaper/) - -[![build PDF](https://github.com/seL4/whitepaper/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/seL4/whitepaper/actions/workflows/build.yml?query=branch%3Amaster) -[![License](https://github.com/seL4/whitepaper/actions/workflows/license.yaml/badge.svg?branch=master)](https://github.com/seL4/whitepaper/actions/workflows/license.yaml?query=branch%3Amaster) diff --git a/projects/buildsystem/host-dependencies.html b/projects/buildsystem/host-dependencies.html new file mode 100644 index 00000000000..bc393abbfec --- /dev/null +++ b/projects/buildsystem/host-dependencies.html @@ -0,0 +1,738 @@ + + + + + + + Setting up your machine to build seL4 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/buildsystem/host-dependencies.md b/projects/buildsystem/host-dependencies.md deleted file mode 100644 index 2bf59930a5a..00000000000 --- a/projects/buildsystem/host-dependencies.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -redirect_from: - - /HostDependencies -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Setting up your machine to build seL4 - -This page describes how to set up your development host machine for building and -running the seL4 kernel. There are additional steps if you are planning to use -[CAmkES] or [Rust] on top of seL4. You do not need this step if you are using -the Microkit, because it comes with pre-compiled seL4 binaries. - -[CAmKES]: {% link projects/camkes/setting-up.md %} -[Rust]: {% link projects/rust/how-to-use.md %} - -{% include seL4-deps.md %} - -## Test - -To test whether your build environment works, we recommend running the seL4 test -suite in `qemu`. For instance: - -```sh -# target directory -mkdir sel4test -cd sel4test - -# get the sources -repo init -u https://github.com/seL4/sel4test-manifest.git -repo sync - -# create build directory -mkdir build -cd build - -# configure build -../init-build.sh -DSIMULATION=TRUE -DAARCH32=TRUE -DPLATFORM=sabre - -# build -ninja - -# run -./simulate -``` - -This should start `qemu` and run a series of tests. Don't worry if error -messages appear, they are explicit tests for errors. - -An output of `All is well in the universe` at the end indicates a successful -test run. To exit `qemu`, press `Ctrl-a`, then `x`. diff --git a/projects/buildsystem/incorporating.html b/projects/buildsystem/incorporating.html new file mode 100644 index 00000000000..89701d7d921 --- /dev/null +++ b/projects/buildsystem/incorporating.html @@ -0,0 +1,834 @@ + + + + + + + Incorporating into your project | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/buildsystem/incorporating.md b/projects/buildsystem/incorporating.md deleted file mode 100644 index 7f73006bcb4..00000000000 --- a/projects/buildsystem/incorporating.md +++ /dev/null @@ -1,290 +0,0 @@ ---- -parent: /projects/buildsystem/ -redirect_from: - - /Developing/Building/Incorporating -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Incorporating into your project - -This page describes the CMake-based build system in detail, with sufficient -information for integrating it into new projects. There are a few different -pieces that can be fit together in different ways depending on your project's -needs and desired customisation. This is reflected in the split of CMake files -spread across several repositories. - -## Basic structure - -The build system is in two pieces. One piece is in the [seL4 kernel -repository](https://github.com/seL4/seL4), which contains the compiler toolchain -and flags settings as well as helpers for generating configurations. The other -piece is in -[seL4_tools/cmake-tool](https://github.com/seL4/seL4_tools/tree/master/cmake-tool), -which contains helpers for combining libraries and binaries into a final system -image (along with the kernel). - -This structure means that the kernel is completely responsible for building -itself, but exports the settings and binaries for use by the rest of the build -system. - -The `cmake-tool` directory has the following files of interest: - -- `default-CMakeLists.txt`: An example `CMakeLists.txt` file, which could be - used as the `CMakeLists.txt` file in the top-level directory of a project. - Simply, this file includes `all.cmake`, under the assumption of a directory - structure where the `cmake-tool` repository is in a directory named `tools`. - To use this file, [project - manifests](repo-cheatsheet.html) are expected to create - a symbolic link to this file, named `CMakeLists.txt`, at the top-level project - directory. -- `all.cmake`: A wrapper that includes `base.cmake`, `projects.cmake` and - `configuration.cmake`. This file can be used by projects which do not alter - these three files. -- `base.cmake`: Constructs the basic build targets (`kernel`, `libsel4`, and - `elfloader-tool`), in addition to basic compilation flags and helper routines, - required to build an seL4 project, and can be used as a base for further - targets in a project through the `add_subdirectory` routine or otherwise. -- `projects.cmake`: Adds build targets through `add_subdirectory` assuming a - default project layout. Essentially it adds any `CMakeLists.txt` files it - finds in any subdirectories of the projects directory. - that emulates the legacy `autoconf.h` header. Since the `autoconf.h` header -- `configuration.cmake`: Provides a target for a library called `Configuration` - contained configuration variables for the *entire* project this rule needs to - come after all other targets and scripts which add to the configuration space. -- `common.cmake`: File included by `base.cmake` with some generic helper routines. -- `flags.cmake`: File included by `base.cmake` which sets up build flags and - linker invocations. -- `init-build.sh`: A shell script which performs the initial configuration and - generation for a new CMake build directory. -- `helpers/*`: Helper functions that are commonly imported by `common.cmake` - -## Kernel directory - -The file `base.cmake` assumes that the seL4 kernel is in a specific location. -Consider the following example: - -```none -awesome_system/ -├── kernel/ -│ └── CMakeLists.txt -├── projects/ -│ ├── awesome_system/ -│ │ └── CMakeLists.txt -│ └── seL4_libs/ -│ └── CMakeLists.txt -├── tools/ -│ └── cmake-tool/ -│ ├── base.cmake -│ ├── all.cmake -│ └── default-CMakeLists.txt -├── .repo/ -└── CMakeLists.txt -> tools/cmake-tool/default-CMakeLists.txt -``` - -When `awesome_system/` is used as the root source directory to initialise a -CMake build directory and `tools/cmake-tool/all.cmake` is used, `base.cmake` -expects the kernel to be at `awesome_system/kernel`. - -The kernel can be placed in a different location, as described below. - -```none -awesome_system/ -├── seL4/ -│ └── CMakeLists.txt -├── projects/ -│ ├── awesome_system/ -│ │ └── CMakeLists.txt -│ └── seL4_libs/ -│ └── CMakeLists.txt -├── tools/ -│ └── cmake-tool/ -│ ├── base.cmake -│ ├── all.cmake -│ └── default-CMakeLists.txt -├── .repo/ -└── CMakeLists.txt -> tools/cmake-tool/default-CMakeLists.txt -``` - -For the example above, where the kernel is in a directory called `seL4`, the -default kernel location can be overridden when invoking `cmake` with -`-DKERNEL_PATH=seL4`. - -## Advanced structures - -Other project layouts can be used. Consider the following example: - -```none -awesome_system/ -├── seL4/ -│ └── CMakeLists.txt -├── awesome/ -│ └── CMakeLists.txt -├── seL4_libs/ -│ └── CMakeLists.txt -├── buildsystem/ -│ └── cmake-tool/ -│ ├── base.cmake -│ ├── all.cmake -│ └── default-CMakeLists.txt -└── .repo/ -``` - -The example above departs from the default in the following ways: - -- no `CMakeLists.txt` file in the root directory, -- `tools` directory has been renamed to `buildsystem`, -- `kernel` directory has been renamed to `seL4`, -- and the `projects` directory is omitted. - -We now describe how to achieve such a project structure: - -To place the `CMakeLists.txt` in `awesome_system/awesome` directory then -initialise CMake, assuming a build directory that is also in the -`awesome_system` directory, do something like: - -```sh -sel4@host:~/awesome_directory$ cmake -DCROSS_COMPILER_PREFIX=toolchain-prefix -DCMAKE_TOOLCHAIN_FILE=../seL4/gcc.cmake -DKERNEL_PATH=../seL4 -G Ninja ../awesome -``` - -Importantly, the path for `CMAKE_TOOLCHAIN_FILE` is resolved immediately by -CMake, and so is relative to the build directory, whereas the `KERNEL_PATH` is -resolved whilst processing `awesome_system/awesome/CMakeLists.txt` and is -relative to that directory. - -The contents of `awesome_system/awesome/CMakeLists.txt` would be something like: - -```cmake -cmake_minimum_required(VERSION 3.7.2) -include(../buildsystem/cmake-tool/base.cmake) -add_subdirectory(../seL4_libs seL4_libs) -include(../buildsystem/cmake-tool/configuration.cmake) -``` - -This looks pretty much like `all.cmake` except that we do not include -`projects.cmake` as we do not have a projects folder. `projects.cmake` would be -redundant to include, as it would not resolve any files. `all.cmake` cannot be -included as we need to include specific subdirectories (in the example -`seL4_libs`) between setting up the base flags and environment and finalising -the Configuration library. We needed to give an explicit build directory (the -second argument in `add_subdirectory`) as we are giving a directory that is not -a subdirectory of the root source directory. - -For simplicity, the kernel path can be encoded directly into the projects -top-level `CMakeLists.txt`. To achieve this the following line: - -```cmake -set(KERNEL_PATH ../seL4) -``` - -should be included before - -```cmake -include(../buildsystem/cmake-tool/base.cmake) -``` - -in `awesome_system/awesome/CMakeLists.txt`, thus removing the need for -`-DKERNEL_PATH` in the `cmake` invocation. - -## Configuration - -For compatibility with the legacy build system, various helpers and systems -exist in order to achieve the following: - -- Automate configuration variables that appear in the `cmake-gui` with various - kinds of dependencies. -- Generate C-style configuration headers that declare these variables in format - similar to the legacy build system. -- Generate `autoconf.h` headers so legacy code using `#include ` - works. - -The following fragment of CMake script demonstrates how these three things fit -together: - -```cmake -set(configure_string "") -config_option(EnableAwesome HAVE_AWESOME "Makes library awesome" DEFAULT ON) -add_config_library(MyLibrary "${configure_string}") -generate_autoconf(MyLibraryAutoconf "MyLibrary") -target_link_libraries(MyLibrary PUBLIC MyLibrary_Config) -target_link_libraries(LegacyApplication PRIVATE MyLibrary MyLibraryAutoconf) -``` - -In the above example, line by line: - -- `set(configure_string "")`: Initialise `configure_string` as blank, as various - `config_*` helpers automatically append to this variable. -- `config_option(EnableAwesome HAVE_AWESOME "Makes library awesome" DEFAULT - ON)`: Declare a configuration variable which appears in CMake scripts and the - `cmake-gui` as `EnableAwesome`, while appearing in C headers as - `CONFIG_HAVE_AWESOME`. -- `add_config_library(MyLibrary "${configure_string}")`: Generate a - `MyLibrary_Config` target, which is an [interface - library](https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#interface-libraries) - that has a generated C header based on the configuration string. Also add - `MyLibrary` to a global list of configuration libraries, which can be used to - generate a library containing contains "all the configurations in the system" - (`autoconf.h` in the legacy build system). -- `generate_autoconf(MyLibraryAutoconf "MyLibrary")`: Generates a - `MyLibraryAutoconf` target, which is an [interface - library](https://cmake.org/cmake/help/latest/manual/cmake-buildsystem.7.html#interface-libraries) - that depends upon `MyLibrary_Config`, and provides an `autoconf.h` file - including the configuration header from `MyLibrary_Config`. -- `target_link_libraries(MyLibrary PUBLIC MyLibrary_Config)`: Allows `MyLibrary` - to `#include` the generated configuration header by doing - `#include ` -- `target_link_libraries(LegacyApplication PRIVATE MyLibrary MyLibraryAutoconf)` - Allows `LegacyApplication` to `#include ` from - `MyLibraryAutoconf`. The `autoconf.h` in this case will contain - `#include `. - -For more details of the different `config_*` helpers read the comments on the -functions in -[kernel/tools/helpers.cmake](https://github.com/seL4/seL4/blob/master/tools/helpers.cmake). - -## Helper functions - -Several CMake functions exist for reuse in seL4 projects, which we now describe. - -### Kernel provided helpers - -All of the helper functions described in the above section are provided in -`tools/helpers.cmake` in the seL4 repository. Other functions in this file are -only useful for the kernel build itself. - -### `cmake-tool` provided helpers - -These helper functions are provided for user-level projects, in `common.cmake` and -all the files in `helpers/`. Notable functions are: - -- `DeclareRootserver(rootserver_target)`: Declares a CMake executable, - `rootserver_target`, as the root server for the system. This can only be used - once in a project and does the following: - - changes build flags for the target, - - creates necessary extra targets for chain loading, - - creates the `rootserver_image` target which will create the final binary - images in `images`. -- `MakeCPIO`: Declares rules to create a linkable CPIO archive from a list of - input files. -- `GenerateSimulateScript`: Creates a target called `simulate_gen` which will - generate a `./simulate` shell script in the build directory for simulating the - project on [QEMU](https://www.qemu.org/) if the target platform is supported. - An application is responsible for ensuring that the system configuration can - be simulated if it uses this function. Other functions are provided such as - `SetSimulationScriptProperty` to allow the application's CMake scripts to - customise the simulation command generated. -- `ApplyCommonSimulationSettings`: Attempts to change the kernel system - configuration to disable features that are not compatible with simulation. -- `ApplyCommonReleaseVerificationSettings(release, verification)`: Sets flags - for different combinations of 'release' (performance optimised builds) and - 'verification' (verification friendly features) builds. Please see [meta - configuration options](using.html#meta-configuration-options) for more detail - on these options. - -### Other provided helpers - -Projects such as [CAmkES](../camkes/), the [CAmkES x86 VMM](../camkes-vm/), -and [Rumprun](https://github.com/seL4/rumprun-sel4-demoapps) may provide -additional helper functions to allow applications to configure themselves. -Generally helper scripts will be called some variant of `helpers.cmake`, and -should be included in any CMake scripts that use them. diff --git a/projects/buildsystem/index.html b/projects/buildsystem/index.html new file mode 100644 index 00000000000..090cb436208 --- /dev/null +++ b/projects/buildsystem/index.html @@ -0,0 +1,612 @@ + + + + + + + System configuration and building | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/buildsystem/index.md b/projects/buildsystem/index.md deleted file mode 100644 index d33fde8f6a3..00000000000 --- a/projects/buildsystem/index.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -redirect_from: - - /Developing/Building/ -project: buildsystem -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# System configuration and building - -seL4, CAmkES, and the C support libraries use the [CMake](https://cmake.org/) -family of tools to implement their build system. The seL4 build system refers to a -collection of CMake scripts that manage: - -- **system configuration:** configuration options such as platform flags and application settings, -- **dependency structures:** tracking build order dependencies, and -- **builds:** generating binary artefacts that can then be deployed on hardware. - -This document covers how to use the seL4 build system to: - -- perform system configuration and builds, -- incorporating the build system into a project, and -- produce kernel stand-alone configuration and builds - -## CMake basics - -For a complete guide to CMake see the [extensive -documentation](https://cmake.org/cmake/help/latest/), but for the purposes here -we will assume a particular workflow with CMake involving out-of-tree builds. - -CMake is not itself a build tool, but rather is a build generator. This means -that it generates build scripts, typically Makefiles or Ninja scripts, which -will be then used by a tool like Make or Ninja to perform the actual build. - -### Pre-requisites - -It is assumed that - -- CMake of an appropriate version is installed. -- You are using the Ninja CMake generator. -- You have the [required dependencies](host-dependencies.html) installed to - build your project and understand how to check out - [repo](repo-cheatsheet.html) collections. - -### Steps - -- [Configuring and building seL4 projects](using.html) -- [Incorporating the build system into a project](incorporating.html) - -## Interfacing with other build systems - -The page on [standalone kernel builds](standalone.html) shows how to generate a -bare kernel binary without user-level image or loader, for use in other build -system or in formal verification. The kernel build system produces `.json` and -`.yaml` files with information on the configuration that was used to produce the -binary, for consumption in other build systems. - -## Gotchas - -List of easy mistakes that can be made when using CMake - -- Configuration files passed to to cmake with `-C` *must* end in `.cmake`, - otherwise CMake will silently throw away your file diff --git a/projects/buildsystem/old/index.html b/projects/buildsystem/old/index.html new file mode 100644 index 00000000000..ad0334a01e5 --- /dev/null +++ b/projects/buildsystem/old/index.html @@ -0,0 +1,1053 @@ + + + + + + + Our old deprecated Build System | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+
+

This page is archived and is no longer receiving updates.

+

It remains here because some of the content may still be useful.

+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/buildsystem/old/index.md b/projects/buildsystem/old/index.md deleted file mode 100644 index 9c9c1b013e7..00000000000 --- a/projects/buildsystem/old/index.md +++ /dev/null @@ -1,507 +0,0 @@ ---- -archive: true -redirect_from: - - /Developing/Building/OldBuildSystem -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Our old deprecated Build System - -_For the new build system see the [build system overview](../)._ - -## Anatomy of the Build System - The following files are the components -of a project repository that are part of the build system (as opposed to -code and tools related to the project): - -- **[.config](#config)** - Your current - configuration (auto-generated) -- **apps/** - - **[Kbuild](#appskbuild)** - Application targets and - dependencies - - **[Kconfig](#kconfig)** - Applications menu - - **myapp/** - - **[Kconfig](#kconfig)** - Myapp-specific settings - - **[Makefile](#appsmyappmakefile)** - How to build Myapp -- **configs/*** - Pre-made configurations for the project -- **[Kconfig](#kconfig)** - Top-level menu -- **kernel/Makefile** - How to build seL4 -- **libs/** - - **[Kbuild](#libskbuild)** - Library targets and - dependencies - - **[Kconfig](#kconfig)** - Libraries menu - - **libfoo/** - - **[Kconfig](#kconfig)** - Libfoo-specific settings - - **[Makefile](#libslibfoomakefile)** - How to build Libfoo - -- **[Makefile](#makefile)** - Top-level build specialisation -- **[Makefile.flags](#makefileflags)** - Top-level build - tuning -- **tools/common/** - - **[common.mk](#commonmk)** - Boiler plate for building - applications/libraries - - **[Kconfig](#kconfig)** - Menu options for toolchains - and other common settings - - **[project-arm.mk](#projectmk)** - ARM-specific boiler - plate for a top-level build - - **[project-ia32.mk](#projectmk)** - IA32-specific - boiler plate for a top-level build - - **[project.mk](#projectmk)** - - Architecture-independent boiler plate for a top-level build - - **[Makefile.flags](#makefileflags)** - Shared build - system tuning - - **kbuild/*** - Kbuild from the Linux source tree. For - documentation, refer to the Kbuild mailing list. - -### Build configuration - Prior to building a project you need to -specify a configuration (settings, components, etc.) that you want to -build. Kconfig is a tool for simplifying and automating this process. In -an seL4 project you can enter make menuconfig in the top level directory -to be presented with a terminal menu for choosing which components to -build. Note that you will need the package libncurses5-dev installed to -display terminal menus. It is possible to select a configuration without -using the terminal menus, but techniques for doing this are not -discussed on this page. - -The menu config interface - -Use arrow keys and Enter to navigate the menu, Space bar to -select/deselect items and Esc-Esc to return to the parent level in the -menu hierarchy. On exiting the menu system you will be asked whether you -wish to save your configuration. If you choose to do so it will be -written to the file .config in the top level directory. - -Many projects will have a default list of configurations for building -common scenarios. These are located in the configs/ directory. You can -load one of these by running make config_file where config_file is the -filename of the configuration you want to load. Whenever you load one of -these pre-made configurations it is usually wise to run make -silentoldconfig. This scans your project for configuration settings that -have changed since the pre-made configuration was created and updates -the configuration with the defaults of these changed settings. This is -not always what you want, but it generally works. - -Your current configuration is stored in the file .config. This file -looks like a Makefile fragment and that is actually exactly how it is -used by build system when it comes time to build your project. One -gotcha to be aware of is that the comments in this file aren't -completely comments, which you will find out if you try to edit them. -Kconfig parses these comments and will throw all manner of strange -errors if it thinks one is malformed. - -Pre-made configurations are stored in configs/. To make a new -configuration, pick the settings you want in the menus then copy your -.config to configs/. Note that all the configurations in this directory -must end in \_defconfig for the build system to identify them correctly. - -The other file(s) you will want to care about is Kconfig. These files -tell Kconfig how to construct the menu hierarchy. A formal description -of the Kconfig options and syntax can be found at -. -Symbols are defined by using the 'config' statement. These symbols are -given the prefix 'CONFIG_' when the configuration is written to the -.config file. - -#### .config -**.config** is autogenerated by running -make some_default_config or make menuconfig. In general, you shouldn't -modify this file manually, but the syntax is pretty obvious if you want -to. As noted below, it is not recommended to touch the comments in this -file. They are parsed by the build system and "malformed" comments can -cause strange and mysterious errors. - -#### apps/Kbuild -**apps/Kbuild** needs to fill the -apps-y variable with the targets of the applications to be built. To do -this you can reference the CONFIG_-prefixed variables from Kconfig. A -typical apps/Kbuild will look something like the following: -```make -apps-$(CONFIG_MY_APP) += myapp - -hello: libfoo -``` -If your application has more complicated dependencies, -for example if it depends on libbar only when the -MYAPP_EXTRA_FUNCTIONALITY variable is selected, you can use the -following pattern: -```make -apps-$(CONFIG_MY_APP) += myapp - -hello-y = libfoo -hello-$(CONFIG_MYAPP_EXTRA_FUNCTIONALITY) += libbar -hello: $(hello-y) -``` - -#### Kconfig -The Kconfig files (**Kconfig, -apps/Kconfig, apps/myapp/Kconfig, libs/Kconfig, libs/libfoo/Kconfig, -tools/common/Kconfig**) describe the structure of the menu you are -presented with when you type make menuconfig. The syntax of these files -is described at - and -they are broken up in the obvious way; that is, apps/Kconfig contains -settings common to all applications in your project, libs/libfoo/Kconfig -contains settings specific to libfoo, ... The Kconfig files together -determine the build configuration process that is described in more -detail below. - -#### apps/myapp/Makefile - -Your application Makefile, -**apps/myapp/Makefile**, should populate a set of variables and then -include common.mk. It will typically look something like the following: -```make -TARGETS := $(notdir $(SOURCE_DIR)).bin - -CFILES := $(patsubst $(SOURCE_DIR)/%,%,$(wildcard $(SOURCE_DIR)/src/*.c)) -ASMFILES := $(patsubst $(SOURCE_DIR)/%,%,$(wildcard $(SOURCE_DIR)/crt/arch-$(ARCH)/crt0.S)) - -LIBS := sel4c sel4 sel4rootserver sel4platsupport - -include $(SEL4_COMMON)/common.mk -``` -TARGETS should contain the list -of output files that this application needs built. CFILES and ASMFILES -list the C and assembly sources of your application, respectively. LIBS -lists the libraries this application will be linked against (without -their "lib" prefix). You can also use your Makefile to modify the flags -that are passed to the compiler or the linker when building your -application. To do this, modify the variables CFLAGS and LDFLAGS, -respectively. For example, you can use "LDFLAGS += -T -path/to/linker.lds" to use a custom linker script for your application -or "CFLAGS := $(filter-out -Wall,$(CFLAGS))" to turn off compiler -warnings for your application. Note that these modifications should be -added **after** including common.mk. - -#### libs/Kbuild -Like apps/Kbuild describes top-level -application dependencies, **libs/Kbuild** describes top-level library -dependencies. Similarly, it fills the variable libs-y with the libraries -to be built. A typical libs/Kbuild would look like: -```make -libs-$(CONFIG_LIB_FOO) += libfoo -libs-$(CONFIG_LIB_BAR) += libbar - -libfoo: common -libbar: common libfoo -``` - -#### libs/libfoo/Makefile -The Makefile for a particular -library, **libs/libfoo/Makefile**, should just contain some variable -configuration and then include common.mk. Note that by using generic -environment variables you can often use the following template with no -modification for your library: -```make -# Library archive(s) that will be built. -TARGETS := $(notdir ${SOURCE_DIR}).a - -# Source files required to build the target. -CFILES := $(patsubst $(SOURCE_DIR)/%,%,$(wildcard ${SOURCE_DIR}/src/*.c)) -ASMFILES := $(patsubst $(SOURCE_DIR)/%,%,$(wildcard ${SOURCE_DIR}/src/*.S)) - -# Header files/directories this library provides. -HDRFILES := $(wildcard ${SOURCE_DIR}/include/*) - -include $(SEL4_COMMON)/common.mk -``` - -You can modify the compiler or linker flags applied when building your -library by modifying the NK_CFLAGS or NK_LDFLAGS variable -respectively. The process for doing this is identical to that for -apps/myapp/Makefile described above. - -#### Makefile -Something that may be unexpected at -first is that you don't need to provide any project-specific targets in -your top-level Makefile. Generally this file just needs to make -app-images the default target and include project.mk. It's possible you -may want to override the default (by defining a target before including -project.mk) or provide some external targets of your own (after -including project.mk). You will most likely just want to mimic the -content of the file from the reference examples: -```make -# app-images is provided in project.mk. -all: app-images - -include tools/common/project.mk - -# Extra project-specific targets. simulate-kzm: -qemu-arm -nographic -M kzm -kernel images/hello-image-arm-imx31 -``` - -#### project.mk -**tools/common/project.mk** contains -some generic targets and supporting infrastructure for building the -various components of your system. It is from this Makefile that the -application and library Makefiles are invoked. The architecture specific -elements of this are contained in **tools/common/project-arm.mk** and -**tools/common/project-ia32.mk**. Your top-level Makefile should -import tools/common/project.mk to take advantage of the build system -support. - -#### common.mk -**tools/common/common.mk** is the -equivalent of tools/common/project.mk for the application-/library-level -compilation (as opposed to top-level). This probably won't make much -sense unless you are familiar with the two-stage build process that is -being invoked when you type "make", but you generally won't need to -concern yourself with the inner workings of this file anyway. This file -contains a collection of generic compiler flags and targets shared -between all projects. It has evolved over time (in some instances in -response to bugs in toolchains), so it is possible there are sections of -this file that are deprecated. If you find something incorrect or -deprecated feel free to correct or modify it, but be aware that even -seemingly innocuous changes to this file are quite likely to break other -people's builds. - -#### Makefile.flags -**Makefile.flags** and -**tools/common/Makefile.flags** contain a set of options that are -applied globally at the top level. These generally contain -compiler-specific options to discriminate between your target platforms. -The shared settings in tools/common/Makefile.flags should be more than -sufficient for most projects, but projects with more esoteric build -requirements may need to use Makefile.flags to override or extend the -shared settings. Most projects will have an empty Makefile.flags because -there is almost always a more appropriate place to put an override. - -# Build Execution - **Note:** ''If you are accustomed to Kbuild from -the Linux kernel, note that we do not use Kbuild in the same way it is -used in Linux. In particular, components are built with their own -Makefiles, not with the Kbuild generic targets that build object files -at a directory-level granularity. It is best not to assume any behaviour -you may be familiar with from Kbuild.'' - -Where Kconfig handles the configuration of your build process, the -remainder of the build system manages dependencies and rules within a -build. The tools/Kbuild directory itself is a black hole of despair and -I would encourage you not to look in there unless you have a high -tolerance for pain. All other relevant files are covered above. - -## Frequently Asked Questions - **Why do I need to specify the same -list of dependencies in apps/myapp/Makefile, apps/Kbuild and -apps/myapp/Kconfig?** - -While these dependency lists appear to serve an identical function, they -actually do not. apps/myapp/Makefile defines the contents of LIBS to be -the libraries that your application is linked against. apps/Kbuild -defines the dependencies (libraries or otherwise) of your applications. -apps/myapp/Kconfig defines the dependency structure of Kconfig menu -items that may or may not map to build targets. In practice, most of our -use cases have an identical list for these three, but they have been -kept separate to allow a finer grained control over the build system -when necessary. - -If this really is a serious irritation to you and your dependencies -really are the same in all three places, you can replace your dependency -line in apps/Kbuild with: -```make -myapp: $(shell grep "depends on" $(APPS_ROOT)/myapp/Kconfig | sed -e 's/depends on//g' -e 's/[&_]//g' | tr A-Z a-z) -``` -and your LIBS line in -apps/myapp/Makefile with: -```make -LIBS := $(patsubst lib%,%,$(shell grep "depends on" $(SOURCE_DIR)/Kconfig | sed -e 's/depends on//g' -e 's/[&_]//g' | tr A-Z a-z)) -``` - -This will make apps/myapp/Kconfig the -canonical source of your dependency information. - ----- -**Why do I need to pick which libraries get built when this is -determined by my application's dependencies? Why does deslecting -libraries hide the applications that depend on them?** - -This is related to the question above. These options exist in Kconfig so -you can build libraries in isolation from any applications that depend -on them. In general this is not something you want to do, but there are -cases where we do need this functionality available. When you deselect -an item in Kconfig it hides all the items that depend on that item. If -this is not the behaviour you want you should consider using a select -clause instead of a depends on clause. - -Be aware that while select and depends on can express the same -dependency relationship that will correctly apply transitively, they do -not play well together. An automated selection caused by a select will -not take depends on clauses into account and automatic deselection -caused by depends on will not take select clauses into account. Used -exclusively however, either can be used in a given scenario. E.g. a -dependency of FOO on BAR, that depends on MOO can be expressed as: - -``` -config FOO - bool "foo" - depends on BAR - -config BAR - bool "bar" - depends on MOO - -config MOO - bool "moo" -``` - -or as: - -``` -config FOO - bool "foo" - select BAR - -config BAR - bool "bar" - select MOO - -config MOO - bool "moo" -``` -The difference will be in the behaviour in menuconfig, not in the -actual dependency inferred by Kconfig. - ----- -**How do I debug what the build system is doing?** - -Use make V=2 or make V=3. Be aware that V=3 generates a lot of output. - ----- -**What is this $(call cc-option... business?** - -cc-option is defined in tools/kbuild/Kbuild.include. It is used as -$(call cc-option, flags1, flags2). It passes flags1 to your compiler -($(CC), not $(HOST_CC)) and returns flags1 if they are accepted. If -your compiler returns an error it returns flags2. It is basically a way -of probing what flags your compiler supports. - ----- -**What is the difference between CFLAGS, HOSTCFLAGS and -NK_CFLAGS?** - -There are two compilers in the build system, CC and HOSTCC. CC is the -compiler that is used to build your project, while HOSTCC is the -compiler that is used to build the tools that are used to build your -project. HOSTCC is typically your operating system's native GCC, while -CC is often a cross-compiler. The contents of HOSTCFLAGS are used when -invoking HOSTCC, while the other two FLAGS variables are used with CC. -The contents of CFLAGS is used when compiling the kernel. NK_CFLAGS -applies to applications and libraries. The terminology stems from Linux, -where there are kernel flags and Non-Kernel flags. To avoid confusion, -the build system treats CFLAGS and NK_CFLAGS identically in your -application/library Makefiles and you can modify either for the same -effect. - ----- -**How do I dump the contents of Makefile variables? How do I -determine what context my rules are executed in?** - -```make -$(foreach var,$(.VARIABLES),$(warning $(var)=$($(var)))) -``` - ----- -**Why do some projects' libs/Kbuild use a sel4libs-y variable?** - -This is hangover from a previous abstraction for portability. This extra -level of indirection serves no purpose in the current build system. If -you encounter a libs/Kbuild that looks like the following: -```make -sel4libs-$(CONFIG_LIB_FOO) += libfoo -sel4libs-$(CONFIG_LIB_BAR) += libbar -... - -libs-y += $(sel4libs-y) -... -``` -please update it to remove sel4libs-y: -```make -libs-$(CONFIG_LIB_FOO) += libfoo -libs-$(CONFIG_LIB_BAR) += libbar -... -``` - -**What does it mean when I get errors like make[1]: *** No rule -to make target '-lfoo', needed by \`bar'. Stop.? Why is "-lfoo" a -target?** - -Library targets are automatically generated by the build system. This -error usually indicates that your apps/Kbuild or libs/Kbuild does not -correctly describe the dependencies for one of your targets. - ----- -**Why is the documentation for Kbuild and Kconfig so poor?** - -Kbuild and Kconfig exist in the Linux kernel source tree. Attempts have -been made to separate them out and make them independent, but nothing -particularly successful has come from this. As a result the only -reliable and current source of documentation for both is in the Linux -kernel, where maintainers tend to have an attitude of "the source is the -documentation." Most of the time the best way to determine -Kbuild/Kconfig behaviour is to try something and see what happens. - ----- -**Why does the build system silently ignore typos in variable -names?** - -This is partly related to their origins from Kbuild and Kconfig and -partly a limitation of GNU Make. In many instances variables are -expanded in such a way that the system is provided with no feedback as -to whether the variable was undefined or whether it was set to nothing. -Either way, there's not much to be done here other than pair program -your Makefiles. - ----- -**Why do some items in menuconfig get indented for no apparent -reason? E.g. Twinkle library for seL4.** - -I have no idea. As near as I can tell it has something to do with the -starting character, but if you manage to get to the bottom of this -please fix. - ----- -**When trying to compile libsel4muslcsys, why do I get errors like -fatal error: stdio.h: No such file or directory?** - -You likely have a configuration line in your libs/Kbuild that causes one -of libmuslc or libsel4muslcsys to depend on the other. In this file -neither should depend on the other. - -There is a circular dependency between libmuslc and libsel4muslcsys. -This is known and intentional; libsel4muslcsys provides the backend seL4 -support for libmuslc's functionality. This dependency should not be -expressed in the build system or you will experience compilation errors -like the above. When the build system is configured such that neither -library depends on each other, it will correctly stage the libc headers -that libsel4muslcsys is expecting to find and correctly link the symbol -references in libmuslc to the provided symbols in libsel4muslcsys. - ----- -**I'm trying to do something unusual that is not natively supported -by the build system, so I added my own rules to apps/my_app/Makefile. -Now nothing seems to get built. What's going on?** - -Adding custom rules is fine, but they need to come after the line where -you include common.mk - -An app's Makefile is invoked with no explicit target (make), so the -first target encountered is built. This is intended to be default, -supplied by common.mk, but if you introduce a rule before including this -file, your target supersedes default. As a side note, it is possibly -worth modifying the parent Makefile to directly call make default to -remove this gotcha. - ----- -**Kbuild and Kconfig are GPL-ed. Does this mean the code I build with them is automatically GPL-ed?** - -No. This is a well-established issue, which has been dealt with in other -projects before. Using a GPL-ed build system or linking against GPL-ed -libraries does not force your project to be GPL-ed. - ----- -**This build system is terrible. Why aren't we using \?** - -All build systems suck. The only thing worse than your current build -system is your future build system. Life goes on. diff --git a/projects/buildsystem/repo-cheatsheet.html b/projects/buildsystem/repo-cheatsheet.html new file mode 100644 index 00000000000..cadee5dfdfd --- /dev/null +++ b/projects/buildsystem/repo-cheatsheet.html @@ -0,0 +1,766 @@ + + + + + + + Repo Cheatsheet | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/buildsystem/repo-cheatsheet.md b/projects/buildsystem/repo-cheatsheet.md deleted file mode 100644 index 114856d8077..00000000000 --- a/projects/buildsystem/repo-cheatsheet.md +++ /dev/null @@ -1,212 +0,0 @@ ---- -redirect_from: - - /RepoCheatsheet -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Repo Cheatsheet - -Repo is a tool developed by the Android Open Source Project. We use repo for source dependency management. - -This page describes how we typically structure our manifests and also explains some common repo commands that we use in our workflows. - -Below is a set of example manifests for the sel4test project. They are located at . - -- `common.xml`: - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -- `master.xml`: - -```xml - - - - - - - -``` - - -## Manifest layout - -We provide a brief overview of manifests as used in our projects in this section, please find more details in the full description of the manifest layout which can be found [here](https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.md). - -> `` - -The `remote` element specifies a remote where git repositories can be found. - -> `` - -The `project` element declares a repository. -- `name` is the repository name at the `remote` -- `path` is the repository checkout location relative to the directory the project was initialised in. -- `revision` specifies what version of the repository to use. Branches and revision hashes are supported. Tags are supported but the attribute value must be structured as `refs/tags/tagname`. -- `linkfile` element specifies a symlink from the repository to somewhere else in the project layout. - - `src` is a path relative to the repository checkout. - - `dest` is a path relative to the project directory. - -> `` - -The `default` element specifies attribute defaults that may be ommitted from `project` elements. -If attributes are ommitted, the values from the default element will be used instead. - -### Pinned manifests - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -A pinned manifest uses pinned git revisions for all of its repositories. It is good practice to create a pinned manifest that refers to a working version of a project. For projects that we maintain, we provide at least two manifests: default.xml and master.xml See the [Releases](../../releases.html) page for more information about what manifests we make available. - -## Commands - -### `init` and `sync` - -`repo init` and `repo sync` are the most commonly used commands. Their purpose is for selecting a manifest and downloading all of the repositories and setting up a project directory structure. Often project READMEs will provide the following instructions: -``` -mkdir source_dir -cd source_dir -repo init -u https://github.com/seL4/sel4test-manifest.git -repo sync -``` - -This will initialise a new directory with the git repos checked out in the locations described by the manifest file. - -init is for selecting a manifest to use, and sync is for checking out that manifest. - -`init` -- `-u` git url. Note: GitHub `ssh` urls do not work using the generated URL they provide: `git@github.com:seL4/sel4test-manifest.git` has to be changed to `ssh://git@github.com/seL4/sel4test-manifest.git` -- `-m` manifest name, default is default.xml. -- `-b` branch or revision, or tag if using format `refs/tags/tagname`. Default is default.xml - -`sync` - -This command synchronises your project directory with what the manifest describes. If you have made commits in your branches, this may result in them getting _lost_ as repo switches the HEAD back to what the manifest describes. If this happens, use `git reflog` to find the untracked commit, or use branches to keep track of commits as branches will remain in your local checkouts. - -`sync` has several flags for specifying how to checkout from remotes such as `-j` for parallel checkouts. Use `repo sync --help` for a list and description. - -### `diff` and `status` - -These two commands are similar to running git diff or git status in every git repository. - - -### `diffmanifests` - -This command allows you to list the commit differences between two manifests of the same project. - -``` -changed projects : - - kernel changed from master to 757c3ac98246afd0593367f1fa19054316a77495 - [-] 62445b35 x86: Correct labels for port out operations - [-] d9780ec7 manual: label object groups in parse_doxygen_xml.py - [-] 63c5ac6d manual: use level 3 for syscalls - [-] deba85b2 manual: promote sel4_arch API docs level - [-] b5ee12f0 manual: group generated API methods by object type - [-] da1e73fe manual: use int level in parse_doxygen_xml.py - [-] c2212688 x86: IOPort invocation has proper structure - [-] 7b8f6106 x86: Consistently compare against PPTR_USER_TOP - [-] 1b0a7181 manual: s/Polling Send/Non-Blocking Send - [-] 84b065b0 manual: use fontenc package - - projects/tools changed from master to 930b6467eae8404e4a72555b693120ac0d64fc48 - [-] 121782a CMake add error condition - -``` - -## FAQ - -### How do I check out a released version of a project such as seL4test? - -> -``` -repo init -u https://github.com/seL4/sel4test-manifest.git -b refs/tags/{{site.sel4_master}} -repo sync -``` - -### How do I change manifests of an already checked out project? - -> -``` -repo init -m master.xml -repo sync -``` - -This will change from the current manifest to `master.xml` in the manifest repository - -### How do I create a pinned manifest? - -> -``` -repo manifest -r -o pinned.xml -``` - -### Is there a faster way to checkout and sync a project? -> -``` -repo init -u https://github.com/seL4/sel4test-manifest.git --no-clone-bundle --depth=1 -repo sync --jobs=8 --fetch-submodules --current-branch --no-clone-bundle -``` diff --git a/projects/buildsystem/standalone.html b/projects/buildsystem/standalone.html new file mode 100644 index 00000000000..4dfb574f252 --- /dev/null +++ b/projects/buildsystem/standalone.html @@ -0,0 +1,693 @@ + + + + + + + Standalone seL4 builds | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/buildsystem/standalone.md b/projects/buildsystem/standalone.md deleted file mode 100644 index 028257e8178..00000000000 --- a/projects/buildsystem/standalone.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -redirect_from: - - /Developing/Building/seL4Standalone -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Standalone seL4 builds - -This page contains documentation for building the seL4 kernel as a standalone -binary without any user-level system image or any loaders that run before the -kernel. This is typically used when a project wants to fully control the -user-level image and pre-kernel initialisation. The only standalone kernel -builds the seL4 Foundation currently maintains are for verified configurations. -This page assumes familiarity with using `cmake`. - -{% include note.html %} -This text assumes that you know what to do with a generated `kernel.elf` binary. -For an explanation see at the bottom of the page. -{% include endnote.html %} - -## Building a kernel standalone - -### Initialising build directory with existing configuration - -Building the kernel standalone requires initialising a CMake build directory -using the seL4 repo as the root CMake project: - -```none -├── seL4/ -│ └── CMakeLists.txt -├── build/ -``` - -The build directory is initialised as follows: - -```sh -cd build/ -cmake -DCROSS_COMPILER_PREFIX= -DCMAKE_TOOLCHAIN_FILE=../seL4/gcc.cmake -G Ninja -C ../seL4/configs/X64_verified.cmake ../seL4/ -``` - -The example uses the `X64_verified.cmake` file for configuration values. - -To find available verified configurations: - -```sh -ls ../seL4/configs/*.cmake -# ../seL4/configs/ARM_HYP_verified.cmake ../seL4/configs/X64_verified.cmake -# etc -``` - -A typical verified configuration (`cat ../seL4/configs/X64_verified.cmake`): - -```cmake -#!/usr/bin/env -S cmake -P -# -# Copyright 2020, Data61, CSIRO (ABN 41 687 119 230) -# -# SPDX-License-Identifier: GPL-2.0-only -# - -# If this file is executed then build the kernel.elf and kernel_all_pp.c file -include(${CMAKE_CURRENT_LIST_DIR}/../tools/helpers.cmake) -cmake_script_build_kernel() - -set(KernelPlatform "pc99" CACHE STRING "") -set(KernelSel4Arch "x86_64" CACHE STRING "") -set(KernelVerificationBuild ON CACHE BOOL "") -set(KernelMaxNumNodes "1" CACHE STRING "") -set(KernelOptimisation "-O2" CACHE STRING "") -set(KernelRetypeFanOutLimit "256" CACHE STRING "") -set(KernelBenchmarks "none" CACHE STRING "") -set(KernelDangerousCodeInjection OFF CACHE BOOL "") -set(KernelFastpath ON CACHE BOOL "") -set(KernelPrinting OFF CACHE BOOL "") -set(KernelNumDomains 16 CACHE STRING "") -set(KernelMaxNumBootinfoUntypedCap 166 CACHE STRING "") -set(KernelRootCNodeSizeBits 19 CACHE STRING "") -set(KernelMaxNumBootinfoUntypedCaps 50 CACHE STRING "") -set(KernelFSGSBase "inst" CACHE STRING "") -``` - -At this point you could use `ccmake .` to browse the configuration. - -### Building the kernel target - -To build the kernel target, run - -```sh -ninja kernel.elf -``` - -Looking in the build directory: - -```sh -ls -# autoconf generated kernel_bf_gen_target_11_pbf_temp.c -# build.ninja generated_prune kernel_bf_gen_target_111_pbf_temp.c -# circular_includes_valid kernel_all_copy.c kernel.elf -# cmake_install.cmake kernel_all_pp_prune_wrapper_temp.c libsel4 -# CMakeCache.txt kernel_all_pp_prune.c linker_ld_wrapper_temp.c -# CMakeFiles kernel_all.c linker.lds_pp -# gen_config kernel_all.i -# gen_headers kernel_bf_gen_target_1_pbf_temp.c -``` - -The `kernel.elf` can now be used in other build environments. - -```sh -file kernel.elf -# kernel.elf: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped -``` - -Note the directory `gen_config/` which contains configuration info for this -build as `.h`, `.json` and `.yaml` files for use in further build stages or -other build systems. - -## Installing - -The build directory contains many more artefacts than needed to use a standalone -kernel build. - -If you have used `-DCMAKE_INSTALL_PREFIX=` when configuring CMake -and then run `cmake --install `, you can have all the install -artefacts placed in ``. The directory structure is the following: - -```none -├── bin/ -│ └── kernel.elf -├── libsel4/ -| ├── include/ -| | └── ... -| | └── kernel/ -| | └── ... -| | └── gen_config.json -| └── src/ -``` - -## Why use stand alone build? - -For CMake-based build environments, the standalone build is usually not needed. - -However, the standalone build is useful when the kernel is being used in a -different environment that does not use CMake. One example for this is the -[Microkit](../microkit/) which comes with pre-built kernel binaries and config -information. Another example is the formal verification project which uses the -standalone build to produce the source and binary artefacts that the -verification is performed on. - -Other use cases include projects that want to build a non-C root task, for -instance in the [Rust support](../rust/). diff --git a/projects/buildsystem/using.html b/projects/buildsystem/using.html new file mode 100644 index 00000000000..84f2120412f --- /dev/null +++ b/projects/buildsystem/using.html @@ -0,0 +1,803 @@ + + + + + + + Configuring and building an seL4 project | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/buildsystem/using.md b/projects/buildsystem/using.md deleted file mode 100644 index 7fdfefc0e0b..00000000000 --- a/projects/buildsystem/using.md +++ /dev/null @@ -1,254 +0,0 @@ ---- -redirect_from: - - /Developing/Building/Using -parent: /projects/buildsystem/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Configuring and building an seL4 project - -This page contains documentation for how to interact with and build a project -that is using this build system. For new project development, see [incorporating -the build system](incorporating.html). - -## Basic build initialisation - -In the root directory of an seL4 CMake-based project, first create a separate -build directory for the output binaries, then initialise CMake: - -```sh -mkdir build -cd build -cmake -DCROSS_COMPILER_PREFIX=arm-linux-gnueabi- -DCMAKE_TOOLCHAIN_FILE=../kernel/gcc.cmake -G Ninja .. -``` - -The components in the above invocation mean the following: - -- `-D` defines a variable, in the form `X=Y`. -- `CROSS_COMPILER_PREFIX` specifies the toolchain for cross-compilation, which - cannot be changed after build directory initialisation. For further details, - please see [Cross Compiling](#cross-compiling) below. -- `CMAKE_TOOLCHAIN_FILE` which indicates that CMake should load the specified - file as a 'toolchain' file. A toolchain file sets up the C - compiler, linker etc. for building the project. In the example above we assume a - typical project layout where seL4 is in the `kernel` directory at the top - level. The [gcc.cmake](https://github.com/seL4/seL4/blob/master/gcc.cmake)' - file from the seL4 repository sets up C compilers and linkers using the - `CROSS_COMPILER_PREFIX`. -- `-G Ninja` tells CMake to generate Ninja build scripts as opposed to GNU - Makefiles. Only Ninja scripts are supported by the kernel. -- `..` is the path to the top-level `CMakeLists.txt` file describing this - project, which in this case is placed in the root directory of the project. - -We also provide a shorthand wrapping script which abstracts the above into a -shorter command: - -```sh -../init-build -DCROSS_COMPILER_PREFIX=arm-linux-gnueabi- -``` - -After configuration, you can build the project by invoking ninja: - -```sh -ninja -``` - -After the build has completed, the resulting binaries will be in the `images/` -subdirectory. - -## Configuration - -### Types of Options - -CMake has two types of configuration options: - -- *Boolean options*, which are are either `ON` or `OFF`, -- *String options*, which can be set to any value, subject to restrictions set - by the project authors. - -String options can have 'hints', which specify can one of several fixed values. -CMake configuration editors respect these and provide a radio selection. - -### Selecting Options - -Many projects have some degree of customisation available via configuration -options. Once the build directory is initialised, you can use the following -approaches to bring up a user-interface for option configuration: - -- An `ncurses` based configuration: - -```sh -ccmake . -``` - -- Graphical configuration: - -```sh -cmake-gui . -``` - -In both cases the path `.` should resolve to the same directory used in the -build configuration. - -### Changing option values - -Any changes to configuration options will not be reflected in the user interface -unless explicitly requested by using `(c)onfigure`, which may result in changes -to the options available. For example if option `A` depends on boolean option -`B`, `A` will not show up until `B` is enabled and `(c)onfigure` is used to -reprocess the CMake files. - -To exit the configuration interface, use `(g)enerate and exit` or `(q)uit -without generation`. CMake will not permit generation if the configuration is -incomplete (`(c)onfigure` must be run and all options set). - -To rebuild after changing configuration options, invoke ninja: - -```sh -ninja -``` - -### Initial configuration - -Many of our projects support multiple configurations, where the following broad -approaches are used to present simple options to the user: - -- **CMake cache scripts**: These files can assign initial values to a number of - configuration variables. By combining one or more of these you can configure - an entire system. -- **Meta configuration options**: Meta configuration options are normally - passed as initial `-DVAR=FOO` command line arguments to CMake and will be - programatically inspected by projects' CMake scripts to (re)configure the - system. - -#### CMake cache scripts - -CMake cache scripts provide subsets of preconfigured options, which allow the -user of a project to avoid manually setting each option. Cache scripts have the -file extension `.cmake`. - -Projects may provide cache script files which each contain the cache settings -necessary to configure a single feature or option. By combining multiple -`.cmake` files, a project can be initialised in a specific way. Cache script -configurations are provided by passing `-C ` to `cmake` when initialising -the build directory. For example, given a typical project structure, one might -invoke `cmake` or `init-build.sh` with several of cache scripts as arguments. - -Multiple cached scripts can be specified on the command line, although if the -same option is set twice only one value is used. Consider an example with -several cache scripts for setting the architecture details (`arm.cmake`, -`x86.cmake`) and for setting build options (`debug.cmake`, `release.cmake`). The -intended usage is that one architectural cache file is used, and one build -options file, as demonstrated below: - -```sh -cmake -C../projects/awesome_project/configs/arm.cmake -C../projects/awesome_project/configs/debug.cmake -DCROSS_COMPILER_PREFIX=arm-linux-gnueabi- -DCMAKE_TOOLCHAIN_FILE=../kernel/gcc.cmake -G Ninja .. -``` - -While nothing prevents the usage of both `arm.cmake` and `x86.cmake` at the same -time, this does not make sense, and only one value for each option will be used. -For projects with multiple cache scripts, check which can be used together. - -#### Meta configuration options - -Some seL4 projects such as `sel4test` provide top-level variables which, used -across projects, have standardised behaviour. These options are as follows: - -- `-DPLATFORM=`: Selects the target system for the resulting - binaries. Valid values for this variable are the first value (preceding the - semicolon) on each line of the `config_choice` directive for each - architecture: - - For ARM: [List in source](https://github.com/seL4/seL4/blob/master/src/arch/arm/config.cmake#L21). - - For X86: [List in source](https://github.com/seL4/seL4/blob/master/src/arch/x86/config.cmake#L15). - - For RISC-V: [List in source](https://github.com/seL4/seL4/blob/master/src/arch/riscv/config.cmake#L15). - -- `-DRELEASE`: Set to `0` or `1`: Turning this off compiles a debug build. - Turning it on compiles the project without debugging features enabled. -- `-DVERIFICATION`: Set to `0` or `1`: This is used to generate the version of - the seL4 kernel source which is **VERIFIABLE**. This does not produce a binary - for the **verified** kernel platform. -- `-DSMP`: Set to `0` or `1`: Turns SMP (symmetric multiprocessing) support on or - off. By default it will enable support for up to 4 processors. To explicitly - set the maximum number of supported CPUs, try setting - `-DKernelMaxNumNodes=`. -- `-DSIMULATION`: Set to `0` or `1`: This produces a build of the project which - is suited for running in an emulator such as QEMU. - -Both the [seL4test](../sel4test/) and [seL4bench](../sel4bench/) projects follow this form. - -### sel4test example - -For more information on configuring, building and running the [sel4test -suite](https://github.com/seL4/sel4test), please see the [main page on -seL4test](../sel4test/). - -## Cross compiling - -[Cross compilation](https://en.wikipedia.org/wiki/Cross_compiler) refers to -compiling a program for a target machine which is different from the machine you -are using to compile the program. - -Generally, in order to cross-compile, a separate compiler is required which -specifically targets the foreign machine. - -### For ARM-based targets - -You can use the following command line options when when cross-compiling for an -ARM-based machine: - -- `-DAARCH32=TRUE`: Tells the build system that you are building for a 32-bit - ARM target. This will cause the build system to assume that you have a - cross compiler installed which targets a system with the triplet name - `arm-linux-gnueabi-`. -- `-DAARCH32HF=TRUE`: Tells the build system you're building for a 32-bit ARM - target which has hardware floating point support. Assumes you have a cross- - compiler installed which targets `arm-linux-gnueabihf-`. -- `-DAARCH64=TRUE`: Tells the build system you're building for a 64-bit ARM - target. Assumes you have a cross-compiler installed which targets - `aarch64-linux-gnu-`. - -Another option is to explicitly specify the toolchain through -`-DCROSS_COMPILER_PREFIX`, which can be used to set the prefix of the -cross-compiler to use. - -### For RISC-V based targets - -You can use the following options when cross compiling for a RISC-V target: - -- `-DRISCV32=TRUE`: Tells the build system that you are building for a 32-bit RISC-V - target. This will cause the build system to assume that you have a cross- - compiler installed which targets a system with the triplet name - `riscv32-unknown-elf-`. -- `-DRISCV64=TRUE`: Tells the build system you're building for a 64-bit RISC-V - target. Assumes you have a cross-compiler installed which targets - `riscv64-unknown-elf-`. - -Like ARM, you can explicitly specify the toolchain through -`-DCROSS_COMPILER_PREFIX`, which can be used to set the prefix of the -cross-compiler to use. - -### CMAKE_BUILD_TYPE - -The `CMAKE_BUILD_TYPE` option appears in CMake configuration editors and allows -users to configure that build type (release, debug etc.). Note that this option -is not respected by the seL4 kernel. - -## Building with Clang - -The kernel as well as, some other projects, can be built using the -[clang](https://clang.llvm.org/) compiler. To select this configuration, the -`-DTRIPLE` variable must be set in the initial configuration step i.e pass in as -an argument to the `init-build` script. - -The value of the `TRIPLE` should be the -[target](https://releases.llvm.org/8.0.0/tools/clang/docs/CrossCompilation.html#target-triple) -for which you are compiling. - -```sh -../init-build -DTRIPLE=x86_64-linux-gnu -``` - -The `CROSS_COMPILER_PREFIX` argument is unnecessary and ignored when compiling -with clang. When building for arm based targets, the target `TRIPLE` will be -equal to the `CROSS_COMPILER_PREFIX` (when using gcc) without the trailing '-'. diff --git a/projects/camkes-vm/centos.html b/projects/camkes-vm/centos.html new file mode 100644 index 00000000000..9e1f1ef4b38 --- /dev/null +++ b/projects/camkes-vm/centos.html @@ -0,0 +1,593 @@ + + + + + + + Boot CentOS on the CAmkES VM | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/camkes-vm/centos.md b/projects/camkes-vm/centos.md deleted file mode 100644 index 60c1f0607a9..00000000000 --- a/projects/camkes-vm/centos.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -parent: /projects/camkes-vm/ -redirect_from: - - /VM/CAmkESVMCentOS -repo: 'seL4/camkes-vm-examples' -include_file: apps/x86/cma34cr_centos/README.md -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Boot CentOS on the CAmkES VM - -{% include include_github_repo_markdown.md indent_headings=true %} diff --git a/projects/camkes-vm/index.html b/projects/camkes-vm/index.html new file mode 100644 index 00000000000..a3a8a53f692 --- /dev/null +++ b/projects/camkes-vm/index.html @@ -0,0 +1,1213 @@ + + + + + + + CAmkES VMM | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/camkes-vm/index.md b/projects/camkes-vm/index.md deleted file mode 100644 index 14737b00778..00000000000 --- a/projects/camkes-vm/index.md +++ /dev/null @@ -1,347 +0,0 @@ ---- -redirect_from: - - /VM/CAmkESX86VM -project: camkes-vm -repo: seL4/camkes-vm-examples -include_file: README.md -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# CAmkES VMM - -{% include include_github_repo_markdown.md %} - - - -## CAmkES x86 VM - -### Prerequisites - -- Get the dependencies for building CAmkES by following [the setup instructions] - (../camkes/setting-up.html) -- Your host machine has to have a CPU that supports Vt-x virtualization - (for Intel CPUs), or AMD-V (for AMD CPUs, but that wasn't tested). Any - newer i7 core should have Vt-x. Note that you might have to enable it - first from BIOS. You can always check by `lscpu` and look for **vmx** flag. - -### Tutorials - -Use the following tutorials to learn about the VM: - -{% assign tutorials = site.pages | where_exp: 'page', 'page.tutorial' | sort: 'tutorial-order' %} -{%- for t in tutorials %} -{%- if t.tutorial-order contains 'vm' %} -1. [{{t.title}}]({{t.url}}) {{t.description}} -{%- endif %} -{%- endfor %} - - -### Examples - -- [Centos](centos.md) -- [zmq_samples](zmq-samples.md) - - -### Booting from hard drive - - -These instructions are for ubuntu. For CentOS instructions, see -[CAmkES VM CentOS](centos.md). - -So far we've only run a tiny linux on a ram disk. What if we want to run -Ubuntu booting off a hard drive? This section will explain the changes -we need to make to our VM app to allow it to boot into a Ubuntu -environment installed on the hard drive. Thus far these examples should -have been compatible with most modern x86 machines. The rest of this -tutorial will focus on a particular machine: -[the cma34cr -single board computer](https://www.rtd.com/PC104/CM/CMA34CR/CMA34CR.htm) - -The first step is to install ubuntu natively on the cma34cr. It's -currently required that guests of the camkes vm run in 32-bit mode, so -install 32-bit ubuntu. These examples will use ubuntu-16.04. - -The plan will be to give the guest passthrough access to the hard drive, -and use a ubuntu initrd as our initial root filesystem, replacing the -buildroot one used thus far. We'll use the same kernel image as before, -as our vm requires that PAE be turned off, and it's on by default in the -ubuntu kernel. - -#### Getting the initrd image - - -We need to generate a root filesystem image suitable for ubuntu. Ubuntu -ships with a tool called mkinitramfs which generates root filesystem -images. Let's use it to generate a root filesystem image compatible with -the linux kernel we'll be using. Boot ubuntu natively on the cma34cr and -run the following command: -``` -$ mkinitramfs -o rootfs.cpio 4.8.16 -WARNING: missing /lib/modules/4.8.16 -Ensure all necessary drivers are built into the linux image! -depmod: ERROR: could not open directory /lib/modules/4.8.16: No such file or directory -depmod: FATAL: could not search modules: No such file or directory -depmod: WARNING: could not open /var/tmp/mkinitramfs_H9SRHb/lib/modules/4.8.16/modules.order: No such file or directory -depmod: WARNING: could not open /var/tmp/mkinitramfs_H9SRHb/lib/modules/4.8.16/modules.builtin: No such file or directory -``` - -The kernel we'll be using has all the necessary drivers built in, so -feel free to ignore those warnings and errors. You should now have a -file called rootfs.cpio on the cma34cr. Transfer that file to your dev -machine, and put it in `projects/vm/minimal`. Now we need to tell the -build system to take that rootfs image rather than the default buildroot -one. Edit `projects/vm-examples/minimal/CMakeLists.txt`. Change this line: - -```cmake -AddToFileServer("rootfs.cpio" ${rootfs_file}) -``` -to -```cmake -AddToFileServer("rootfs.cpio" ) -``` -where `` is replaced with the filename of the rootfs file you -added in `projects/vm/minimal`. - -Since we'll be using a real hard drive, we need to change the boot -command line we give to the guest linux. Open -`projects/vm-examples/minimal/minimal.camkes`, and change the -definition of `VM_GUEST_CMDLINE` to: -``` -#define VM_GUEST_CMDLINE "earlyprintk=ttyS0,115200 console=ttyS0,115200 i8042.nokbd=y i8042.nomux=y i8042.noaux=y io_delay=udelay noisapnp pci=nomsi debug root=/dev/sda1 rdinit=/init 2" -``` - -Try building and running after this change: -``` -BusyBox v1.22.1 (Ubuntu 1:1.22.0-15ubuntu1) built-in shell (ash) -Enter 'help' for a list of built-in commands. - -(initramfs) -``` - -You should get dropped into a shell inside the root filesystem. You can -run commands from here: -``` -(initramfs) pwd -/ -(initramfs) ls -dev run init scripts var usr sys tmp -root sbin etc bin lib conf proc -``` - -If you look inside `/dev`, you'll notice the lack of sda device. Linux -can't find the hard drive because we haven't passed it through yet. -Let's do that now! - -We're going to give the guest passthrough access to the sata controller. -The sata controller will be in one of two modes: AHCI or IDE. The mode -can be set when configuring BIOS. By default it should be AHCI. The next -part has some minor differences depending on the mode. I'll show both. -Open `projects/vm-examples/minimal/minimal.camkes` and add the following to the -configuration section: - -For AHCI: -```c -configuration { - ... - - vm0_config.pci_devices_iospace = 1; - - - vm0_config.ioports = [ - {"start":0x4088, "end":0x4090, "pci_device":0x1f, "name":"SATA"}, - {"start":0x4094, "end":0x4098, "pci_device":0x1f, "name":"SATA"}, - {"start":0x4080, "end":0x4088, "pci_device":0x1f, "name":"SATA"}, - {"start":0x4060, "end":0x4080, "pci_device":0x1f, "name":"SATA"}, - ]; - - vm0_config.pci_devices = [ - { - "name":"SATA", - "bus":0, - "dev":0x1f, - "fun":2, - "irq":"SATA", - "memory":[ - {"paddr":0xc0713000, "size":0x800, "page_bits":12}, - ], - }, - ]; - - vm0_config.irqs = [ - {"name":"SATA", "source":19, "level_trig":1, "active_low":1, "dest":11}, - ]; -} -``` - -For IDE: -```c -configuration { - ... - - vm0_config.pci_devices_iospace = 1 - - vm0_config.ioports = [ - {"start":0x4080, "end":0x4090, "pci_device":0x1f, "name":"SATA"}, - {"start":0x4090, "end":0x40a0, "pci_device":0x1f, "name":"SATA"}, - {"start":0x40b0, "end":0x40b8, "pci_device":0x1f, "name":"SATA"}, - {"start":0x40b8, "end":0x40c0, "pci_device":0x1f, "name":"SATA"}, - {"start":0x40c8, "end":0x40cc, "pci_device":0x1f, "name":"SATA"}, - {"start":0x40cc, "end":0x40d0, "pci_device":0x1f, "name":"SATA"}, - ]; - - vm0_config.pci_devices = [ - { - "name":"SATA", - "bus":0, - "dev":0x1f, - "fun":2, - "irq":"SATA", - "memory":[], - }, - ]; - - vm0_config.irqs = [ - {"name":"SATA", "source":19, "level_trig":1, "active_low":1, "dest":11}, - ]; -} -``` - -Now rebuild and run: -``` -Ubuntu 16.04.1 LTS ertos-CMA34CR ttyS0 - -ertos-CMA34CR login: -``` - -You should be able to log in and use the system largely as normal. - -### Passthrough Ethernet - - -The ethernet device is not accessible to the guest: -``` -$ ip addr -1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 - link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 - inet 127.0.0.1/8 scope host lo - valid_lft forever preferred_lft forever - inet6 ::1/128 scope host - valid_lft forever preferred_lft forever -2: sit0@NONE: mtu 1480 qdisc noop state DOWN group default qlen 1 - link/sit 0.0.0.0 brd 0.0.0.0 -``` - -An easy way to give the guest network access is to give it passthrough -access to the ethernet controller. This is done much in the same way as -enabling passthrough access to the sata controller. In the configuration -section in `projects/vm-examples/minimal/minimal.camkes`, add to the list of io -ports, pci devices and irqs to pass through: -```c -vm0_config.ioports = [ - {"start":0x4080, "end":0x4090, "pci_device":0x1f, "name":"SATA"}, - {"start":0x4090, "end":0x40a0, "pci_device":0x1f, "name":"SATA"}, - {"start":0x40b0, "end":0x40b8, "pci_device":0x1f, "name":"SATA"}, - {"start":0x40b8, "end":0x40c0, "pci_device":0x1f, "name":"SATA"}, - {"start":0x40c8, "end":0x40cc, "pci_device":0x1f, "name":"SATA"}, - {"start":0x40cc, "end":0x40d0, "pci_device":0x1f, "name":"SATA"}, - {"start":0x3000, "end":0x3020, "pci_device":0, "name":"Ethernet5"}, // <--- Add this entry -]; - -vm0_config.pci_devices = [ - { - "name":"SATA", - "bus":0, - "dev":0x1f, - "fun":2, - "irq":"SATA", - "memory":[], - }, - - // Add this entry: - { - "name":"Ethernet5", - "bus":5, - "dev":0, - "fun":0, - "irq":"Ethernet5", - "memory":[ - {"paddr":0xc0500000, "size":0x20000, "page_bits":12}, - {"paddr":0xc0520000, "size":0x4000, "page_bits":12}, - ], - }, -]; - -vm0_config.irqs = [ - {"name":"SATA", "source":19, "level_trig":1, "active_low":1, "dest":11}, - {"name":"Ethernet5", "source":0x11, "level_trig":1, "active_low":1, "dest":10}, // <--- Add this entry -]; -``` - -You should have added a new entry to each of the three lists that -describe passthrough devices. Building and running: -``` -$ ip addr -1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 - link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 - inet 127.0.0.1/8 scope host lo - valid_lft forever preferred_lft forever - inet6 ::1/128 scope host - valid_lft forever preferred_lft forever -2: enp0s2: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 - link/ether 00:d0:81:09:0c:7d brd ff:ff:ff:ff:ff:ff - inet 10.13.1.87/23 brd 10.13.1.255 scope global dynamic enp0s2 - valid_lft 14378sec preferred_lft 14378sec - inet6 2402:1800:4000:1:90b3:f9d:ae22:33b7/64 scope global temporary dynamic - valid_lft 86390sec preferred_lft 14390sec - inet6 2402:1800:4000:1:aa67:5925:2cbc:928f/64 scope global mngtmpaddr noprefixroute dynamic - valid_lft 86390sec preferred_lft 14390sec - inet6 fe80::cc47:129d:bdff:a2da/64 scope link - valid_lft forever preferred_lft forever -3: sit0@NONE: mtu 1480 qdisc noop state DOWN group default qlen 1 - link/sit 0.0.0.0 brd 0.0.0.0 -$ ping google.com -PING google.com (172.217.25.142) 56(84) bytes of data. -64 bytes from syd15s03-in-f14.1e100.net (172.217.25.142): icmp_seq=1 ttl=51 time=2.17 ms -64 bytes from syd15s03-in-f14.1e100.net (172.217.25.142): icmp_seq=2 ttl=51 time=1.95 ms -64 bytes from syd15s03-in-f14.1e100.net (172.217.25.142): icmp_seq=3 ttl=51 time=1.99 ms -64 bytes from syd15s03-in-f14.1e100.net (172.217.25.142): icmp_seq=4 ttl=51 time=2.20 ms -``` - -### Figuring out information about PCI devices - - -To add a new passthrough device, or access a pci device in general, we -need to know which io ports it uses, which interrupts it's associated -with, and the physical addresses of any memory-mapped io regions it -uses. The easiest way to find this information is to boot linux -natively, and run the command `lspci -vv`. - -### Configuring a Linux kernel build - -We provide a custom kernel image with our CAmkES VM project, found [here](https://github.com/seL4/camkes-vm-linux/tree/master/images/kernel). -This kernel image is produced from building Linux 4.8.16, specifically configured with the following [.config file](https://github.com/seL4/camkes-vm-linux/tree/master/linux_configs/4.8.16). - -However you may decide to build your own Linux kernel image (which may be a different version). When doing so, it is important to ensure the build is configured with the following Kbuild settings: - -``` -# General kernel settings -CONFIG_X86_32=y -CONFIG_X86=y -CONFIG_X86_32_SMP=n -CONFIG_SMP=n -CONFIG_NOHIGHMEM=y -CONFIG_PCI_MSI=n -CONFIG_X86_UP_APIC=n -# Power management and ACPI settings -CONFIG_SUSPEND=n -CONFIG_HIBERNATION=n -CONFIG_PM=n -CONFIG_ACPI=n -# Virtio Settings -CONFIG_VIRTIO=y -CONFIG_VIRTIO_PCI=y -CONFIG_VIRTIO_NET=y -``` - -You can configure these settings by either manually editing your kernel `.config` file in the root project directory or by interactively running `make menuconfig`. diff --git a/projects/camkes-vm/zmq-samples.html b/projects/camkes-vm/zmq-samples.html new file mode 100644 index 00000000000..2c45ed4a045 --- /dev/null +++ b/projects/camkes-vm/zmq-samples.html @@ -0,0 +1,796 @@ + + + + + + + ZeroMQ examples | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/camkes-vm/zmq-samples.md b/projects/camkes-vm/zmq-samples.md deleted file mode 100644 index 6a0e3847396..00000000000 --- a/projects/camkes-vm/zmq-samples.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -parent: /projects/camkes-vm/ -title: ZeroMQ examples -repo: 'seL4/camkes-vm-examples' -include_file: 'apps/x86/zmq_samples/README.md' -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -{% include include_github_repo_markdown.md %} diff --git a/projects/camkes/cli.html b/projects/camkes/cli.html new file mode 100644 index 00000000000..bd30b2e2244 --- /dev/null +++ b/projects/camkes/cli.html @@ -0,0 +1,591 @@ + + + + + + + CAmkES CLI | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/camkes/cli.md b/projects/camkes/cli.md deleted file mode 100644 index 8cb5718c119..00000000000 --- a/projects/camkes/cli.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -parent: /projects/camkes/ -redirect_from: - - /CAmkESCLI -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# CAmkES CLI - -The CAmkES CLI is a command line tool for initialising and managing CAmkES -projects. It is loosely based on the rust build tool "cargo". It is structured -as a command line tool with various subcommands. Usage for each can be viewed -with `camkes-cli --help`. - -For an example project that can be managed by the CLI, see: - - -## Examples - -### Create a new project from a template - - -This creates new directory named `hello`. - -```sh -camkes-cli new hello --template hello_world -``` - -### Initialise a fresh checkout of existing project - -```sh -git clone https://github.com/sel4proj/camkes-cli-example -cd camkes-cli-example -camkes-cli init -``` - -### Build a project for x86 - -Run from inside project directory: - -```sh -camkes-cli build x86 -``` - -### Run a project in qemu-system-i386 (builds first) - -```sh -camkes-cli run x86 -``` - -### Generate boilerplate for a component - -Generate boilerplate for a component named BlahServer with some interfaces: - -```sh -camkes-cli component BlahServer --dataport Buf b --consumes Signal sig -``` diff --git a/projects/camkes/components.html b/projects/camkes/components.html new file mode 100644 index 00000000000..f5f91e284c0 --- /dev/null +++ b/projects/camkes/components.html @@ -0,0 +1,2259 @@ + + + + + + + CAmkES Components | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/camkes/components.md b/projects/camkes/components.md deleted file mode 100644 index 05dca7589de..00000000000 --- a/projects/camkes/components.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -parent: /projects/camkes/ -project: camkes -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 Proofcraft Pty Ltd ---- - - -# CAmkES Components - -## Example Applications - -Most of these examples can be found on the [examples & demos -page](../../examples.html). - -{% include component_list.md project='camkes' type='camkes-application' no_status=true %} - -## Reusable components - -{% include component_list.md project='camkes' type='camkes-component' no_status=true %} - -## CAmkES Connectors - -{% include component_list.md project='camkes' type='camkes-connector' %} diff --git a/projects/camkes/differences.html b/projects/camkes/differences.html new file mode 100644 index 00000000000..de4cb9285f9 --- /dev/null +++ b/projects/camkes/differences.html @@ -0,0 +1,778 @@ + + + + + + + Differences between CAmkES 2 and 3 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+
+

This page is archived and is no longer receiving updates.

+

It remains here because some of the content may still be useful.

+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/camkes/differences.md b/projects/camkes/differences.md deleted file mode 100644 index cdb99645cc5..00000000000 --- a/projects/camkes/differences.md +++ /dev/null @@ -1,255 +0,0 @@ ---- -parent: /projects/camkes/ -redirect_from: - - /CAmkESDifferences -archive: true -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- -# Differences between CAmkES 2 and 3 - - -## Rich Types for Settings - - -Previously all attribute settings were treated as strings by templates. -Settings are now interpreted as an appropriate python type. -```c -// list -foo.bar = [0x60, 0x64]; - -// boolean -moo.cow = true; - -// string -baz.qux = "hello"; - -// dict -crazy.stuff = { "key" : ["polymorphic", 42, "list", - {"hello":true} ] }; - -// appropriate numeric type -arithmetic.expressions = 1 << (2 ** 2) == 3 ? -2 : 0x9; -``` - -Arbitrary ids are no longer allowed as setting values: -```c -a.b = c; // error -``` - -## Parametrised Buf Type - - -The `Buf` dataport type can now be optionally parametrised by the -size (in bytes) of the dataport. The syntax for this is `Buf(size)`. -If left unspecified, the default size is 4096 bytes. - -It is an error to connect dataport interfaces of different sizes. - -E.g. -```c -component Foo { - dataport Buf(8192) dp; -} - -component Bar { - dataport Buf(8192) dp; -} - -assembly { - composition { - component Foo foo; - component Bar bar; - connection seL4SharedData conn(from foo.dp, to bar.dp); - } -} -``` - -## Asynch Connector Renamed - - -The `seL4Asynch` connector has been renamed to -`seL4Notification`. - -## Non-Volatile Dataports - - -Previously, c symbols used to access dataports had volatile pointer -types. Users were encouraged to use volatile pointers to prevent the -compiler optimizing away, or re-ordering, accesses to shared memory. - -This is no longer the case. The c symbols referring to dataports are -regular (ie. non-volatile) pointer types, and programmers are required -to explicitly "acquire" and "release" dataports to prevent harmful -re-ordering (at both compile time and runtime). The motivations for this -change are: * Treating dataports as always volatile prevents the -compiler from re-ordering any accesses to them, even in cases where it -won't affect the correctness of programs. Using non-volatile dataports -allows the compiler to make better optimizations. * Preventing compiler -reordering (ie. with volatile) is not sufficient to make shared memory -coherent in a multicore environment. Changes made to shared memory by -one core may become visible to other cores in a different order. * -Using functions from the standard library on dataports (e.g. passing a -string in a dataport to `strlen`) requires casting from a volatile -pointer to a regular pointer - an undefined operation in c. - -For a dataport interface `foo`, a component has access to -`foo_acquire()` and `foo_release()` functions (they may -instead be macros). Call `foo_acquire()` between multiple reads -from a dataport, where the correct behaviour of the program depends on -the contents of the dataport possibly changing between reads. Call -`foo_release()` between multiple writes to a dataport, where the -correct behaviour of the program depends on writes preceding the -`foo_release()` in the program code being performed strictly before -the writes following it. - -## Many-to-Many Connections - - -There is new syntax for connections with multiple from/to sides. The -following fragments are equivalent (except for connection names): -```c -connection seL4RPCCall foo(from a.x, to c.z); -connection seL4RPCCall bar(from b.y, to c.z); -``` -```c -connection seL4RPCCall foobar(from a.x, from b.y, to c.z); -``` - -Both syntaxes are supported by CAmkES 3. - -## Hardware Component Configuration Attributes - - -The attributes for configuring hardware components have changed. Below -is a CAmkES 2 spec, followed by the equivalent CAmkES 3 spec. These -changes are not backwards compatible. - -These component definitions are the same in CAmkES 2 and 3: -```c -component Device { - hardware; - dataport Buf registers; - emits Interrupt interrupt; - provides IOPort port; -} - -component Driver { - dataport Buf registers; consumes Interrupt interrupt; uses IOPort - port; -} -``` - -The composition section of the spec is the same for CAmkES 2 and 3: -```c -assembly { - composition { - component Device device; - component Driver driver; - - connection seL4HardwareMMIO mmio(from driver.registers, to device.registers); - connection seL4HardwareInterrupt interrupt(from device.interrupt, to driver.interrupt); - connection seL4HardwareIOPort ioport(from driver.port, to device.port); - } - configuration { - // see below - } - -} -``` - -CAmkES 2 configuration: -```c -configuration { - device.registers_attributes = "0x12345000:0x1000"; // string in format "paddr:size" - device.interrupt_attributes = 27; // irq number - device.port_attributes = "0x40:0x40"; // string in format "start_port:end_port" -} -``` - -CAmkES 3 configuration: -```c -configuration { - device.registers_paddr = 0x12345000; // separate attribute for paddr and size - device.registers_size = 0x1000; - device.interrupt_irq_number = 27; // attribute name has changed - device.port_attributes = "0x40:0x40"; // unchanged -} -``` - -## Interrupt API - - -In CAmkES 2, interrupts were abstracted as CAmkES events, emitted from a -hardware component. For a component with an interface `foo` -connected to an interrupt, components could call `foo_wait()`, -`foo_poll()`, and `foo_reg_callback()`, as with a regular -event. - -In CAmkES 3, interrupts are still abstracted as events in the ADL -(CAmkES spec). Component implementations however, use a different -interface for interacting with interrupts than with regular event -interfaces. More specifically, a component with an interface `foo` -connected with the `seL4HardwareInterrupt` connection has access to -`foo_acknowledge()` which acknowledges the associated interrupt to -the kernel. In addition, the component implementation must provide a -definition of a function `void foo_handler(void)`. The standard -event methods (`foo_wait()`, `foo_poll()`, and `foo_reg_callback()`) are not implemented for interrupts. - -The user-provided function `foo_handler()` will be called by a -dedicated interrupt-handling thread (one thread per interface connected -with `seL4HardwareInterrupt`). Unlike callbacks registered with -`*_reg_callback`, interrupt handlers do not need to be explicitly -registered, and do not become unregistered after calling. - -## Hierarchical Components - - -The syntax for defining hierarchical components has changed in CAmkES 3. -CAmkES 2 had special connectors used to export an interface of a -sub-component: -```c -component Serial { - - // interface of this component - provides UartIface serial; - - composition { - - // internal components - component UartDevice uart_device; - component UartDriver uart_driver; - - // internal connection - connection seL4HardwareMMIO conn(from uart_device.regs, to uart_driver.regs); - - // export interface of driver component as interface of this component - connection ExportRPC exp(from uart_driver.uart, to serial); - - } -} -``` - -CAmkES 3 introduces special syntax for exposing interfaces of -sub-components: -```c -component Serial { - - // interface of this component - provides UartIface serial; - - composition { - - // internal components - component UartDevice uart_device; - component UartDriver uart_driver; - - // internal connection - connection seL4HardwareMMIO conn(from uart_device.regs, to uart_driver.regs); - - // export interface of driver component as interface of this component - export uart_driver.uart -> serial; - - } -} -``` diff --git a/projects/camkes/features.html b/projects/camkes/features.html new file mode 100644 index 00000000000..7476052adca --- /dev/null +++ b/projects/camkes/features.html @@ -0,0 +1,947 @@ + + + + + + + CAmkES Features | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/camkes/features.md b/projects/camkes/features.md deleted file mode 100644 index 09e6c12cd6c..00000000000 --- a/projects/camkes/features.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -parent: /projects/camkes/ -project: camkes -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 Proofcraft Pty Ltd ---- - -# CAmkES Features - -### CAmkES Architecture Description Language (ADL) - -Features of the CAmkES ADL are listed below. Features that are more experimental -may not be compatible with the CDL-refinement CAmkES tooling. The Status field for -each feature aims to indicate any known compatibility issues related to a feature. - -{% include component_list.md project='camkes' list='features' type='adl-feature' code=false %} - -See also the list of [CAmkES components](components.html). diff --git a/projects/camkes/hardware.html b/projects/camkes/hardware.html new file mode 100644 index 00000000000..8dbe340abbd --- /dev/null +++ b/projects/camkes/hardware.html @@ -0,0 +1,551 @@ + + + + + + + Supported platforms | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/camkes/hardware.md b/projects/camkes/hardware.md deleted file mode 100644 index eb86219c9c5..00000000000 --- a/projects/camkes/hardware.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 Proofcraft Pty Ltd ---- -# Supported platforms - -The CAmkES component platform is supported by all [seL4-supported -platforms](../../Hardware/index.html). \ No newline at end of file diff --git a/projects/camkes/imgs b/projects/camkes/imgs deleted file mode 120000 index 0c57936981b..00000000000 --- a/projects/camkes/imgs +++ /dev/null @@ -1 +0,0 @@ -../../_repos/sel4/camkes-tool/docs/imgs/ \ No newline at end of file diff --git a/projects/camkes/imgs/assembly.png b/projects/camkes/imgs/assembly.png new file mode 100644 index 00000000000..f854d032273 Binary files /dev/null and b/projects/camkes/imgs/assembly.png differ diff --git a/projects/camkes/imgs/attribute.png b/projects/camkes/imgs/attribute.png new file mode 100644 index 00000000000..0b19cf992a9 Binary files /dev/null and b/projects/camkes/imgs/attribute.png differ diff --git a/projects/camkes/imgs/component.png b/projects/camkes/imgs/component.png new file mode 100644 index 00000000000..d9d3997b0d2 Binary files /dev/null and b/projects/camkes/imgs/component.png differ diff --git a/projects/camkes/imgs/composition.png b/projects/camkes/imgs/composition.png new file mode 100644 index 00000000000..4db4bad9ce9 Binary files /dev/null and b/projects/camkes/imgs/composition.png differ diff --git a/projects/camkes/imgs/connection.png b/projects/camkes/imgs/connection.png new file mode 100644 index 00000000000..d765b3162e3 Binary files /dev/null and b/projects/camkes/imgs/connection.png differ diff --git a/projects/camkes/imgs/dataport.png b/projects/camkes/imgs/dataport.png new file mode 100644 index 00000000000..f46faf26c61 Binary files /dev/null and b/projects/camkes/imgs/dataport.png differ diff --git a/projects/camkes/imgs/direction.png b/projects/camkes/imgs/direction.png new file mode 100644 index 00000000000..cf13ba24300 Binary files /dev/null and b/projects/camkes/imgs/direction.png differ diff --git a/projects/camkes/imgs/echo.svg b/projects/camkes/imgs/echo.svg new file mode 100644 index 00000000000..f696b1116d4 --- /dev/null +++ b/projects/camkes/imgs/echo.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + echo + client + + + + + + diff --git a/projects/camkes/imgs/event.png b/projects/camkes/imgs/event.png new file mode 100644 index 00000000000..9264b89530e Binary files /dev/null and b/projects/camkes/imgs/event.png differ diff --git a/projects/camkes/imgs/instance.png b/projects/camkes/imgs/instance.png new file mode 100644 index 00000000000..06682cbdf8c Binary files /dev/null and b/projects/camkes/imgs/instance.png differ diff --git a/projects/camkes/imgs/method.png b/projects/camkes/imgs/method.png new file mode 100644 index 00000000000..14c65d32a90 Binary files /dev/null and b/projects/camkes/imgs/method.png differ diff --git a/projects/camkes/imgs/parameter.png b/projects/camkes/imgs/parameter.png new file mode 100644 index 00000000000..d02f500c8e3 Binary files /dev/null and b/projects/camkes/imgs/parameter.png differ diff --git a/projects/camkes/imgs/procedure.png b/projects/camkes/imgs/procedure.png new file mode 100644 index 00000000000..29463199fcd Binary files /dev/null and b/projects/camkes/imgs/procedure.png differ diff --git a/projects/camkes/imgs/setting.png b/projects/camkes/imgs/setting.png new file mode 100644 index 00000000000..fdf3d5324a9 Binary files /dev/null and b/projects/camkes/imgs/setting.png differ diff --git a/projects/camkes/imgs/type.png b/projects/camkes/imgs/type.png new file mode 100644 index 00000000000..496c965d7c4 Binary files /dev/null and b/projects/camkes/imgs/type.png differ diff --git a/projects/camkes/index.html b/projects/camkes/index.html new file mode 100644 index 00000000000..eb072ea2358 --- /dev/null +++ b/projects/camkes/index.html @@ -0,0 +1,613 @@ + + + + + + + CAmkES | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/camkes/index.md b/projects/camkes/index.md deleted file mode 100644 index cb6c20d8427..00000000000 --- a/projects/camkes/index.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -redirect_from: - - /CAmkES/ -project: camkes -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# CAmkES - -CAmkES stands for component architecture for microkernel-based embedded systems. -It is a software development and runtime framework for quickly and reliably -building microkernel-based multi-server (operating) systems. It follows a -component-based software engineering approach, resulting in a system that is -modelled as a set of interacting software components. These software components -have explicit interaction interfaces and a system design that explicitly details -the connections between the components. - -The development framework provides: - -- a language to describe component interfaces, components, and whole - component-based systems -- a tool that processes these descriptions to combine programmer-provided - component code with generated scaffolding and glue code to build a complete, - bootable, system image -- full integration in the seL4 environment and build system - -## Overview - -To get started with CAmkES we recommend following the [CAmkES -tutorial](../../Tutorials/hello-camkes-0.html). - -The following additional resources are available: - -- [Terminology and Glossary](manual.md#terminology) -- [CAmkES Manual](manual.md) -- List of [CAmkES features](features.md) -- List of pre-build [CAmkES components](components.md) -- [Virtual Machines](../virtualization/index.md) as CAmkES components -- [Visual CAmkES](visual-camkes/), a tool for visualising the components and - connections making up an application -- [Command Line Interface](cli.md) of the CAmkES tool -- [Implementation](internals.md) - -## Get CAmkES - -- Make sure that you already have the tools to [build seL4 and - CAmkES](../buildsystem/host-dependencies.html). -- Download CAmkES: - -```sh -mkdir camkes-project -cd camkes-project -repo init -u https://github.com/seL4/camkes-manifest.git -repo sync -``` - -## Build and run simple application - -The following will configure, build, and run a simple example CAmkES -system: - -```sh -cd camkes-project -mkdir build -cd build -../init-build.sh -DPLATFORM=sabre -DAARCH32=1 -DCAMKES_APP=adder -DSIMULATION=1 -ninja -./simulate -``` \ No newline at end of file diff --git a/projects/camkes/internals.html b/projects/camkes/internals.html new file mode 100644 index 00000000000..9d487e87882 --- /dev/null +++ b/projects/camkes/internals.html @@ -0,0 +1,762 @@ + + + + + + + CAmkES Internals | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/camkes/internals.md b/projects/camkes/internals.md deleted file mode 100644 index 15b4120106f..00000000000 --- a/projects/camkes/internals.md +++ /dev/null @@ -1,235 +0,0 @@ ---- -parent: /projects/camkes/ -redirect_from: - - /CAmkESInternals -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# CAmkES Internals - -## Overview - - -From the top, the CAmkES tool (typically found in "tools/camkes/camkes.sh") is a program that generates a **single** file that makes up part of the source of an seL4 application. There are a variety of types of files it can generate: - -- a capdl spec describing the cap distribution of the entire - CAmkES spec -- a C file containing generated glue code for a component or - connector -- a Makefile that knows how to invoke the CAmkES tool to generate - all the files required to compile the application (besides the - Makefile itself) - -A typical build of a CAmkES application looks like: - -1. Generate makefile (this file will be called "camkes-gen.mk") - -2. Invoke generated makefile - - 1. Copy sources into build directory - 2. Generated glue code for components and connectors - 3. Compile each component - 4. Run CapDL filters - 5. Generate CapDL spec - 6. Compile CapDL loader - -## Caching - - -Remember that the CAmkES tool only generates one file each time it's -run, and in a single build it's typically run many times. This means, -all the input files must be parsed again for each output file. The CapDL -database is built up by logic in the templates that generate glue code, -which means that when the capdl spec is generated, all the templates -must be re-instantiated to get the spec into the right state. This all -seems to unnecessarily repeat a lot of work. - -To get around this, CAmkES contains several caches: - -### CAmkES Accelerator - - -Output files are cached with keys computed from hashes of the CAmkES -spec. This prevents re-generating most files during a single build of a -CAmkES app. - -### Data Structure Cache - - -This stores the AST and CapDL database persistently (using pickle) -across each invocation of the CAmkES tool in a single build of a CAmkES -app. This removes the need to parse the CAmkES spec multiple times in a -single build, and also removes the need to re-instantiate component and -connector templates to re-build the CapDL database. - -## Creating Component Address Spaces - - -CAmkES creates a CapDL spec representing the entire application (ie. all -components and connections). Part of the spec is the hierarchy of paging -objects comprising the address space of each component. This is actually -done by the python CapDL library. After each component is compiled, but -before the CapDL Filters (see below) are applied, -[the python capdl library is invoked (search for get_spec)](https://github.com/seL4/camkes-tool/blob/master/camkes/runner/__main__.py) to inspect -the ELF file produced by compiling the component and create all the -paging structures it needs. - - -### Collapse Shared Frames - - -Dataport connections in CAmkES establish a region of shared memory -between components. When a pair of components share memory, there must -be common frames mapped into both of their address spaces. When each -component gets compiled, any dataports are just treated as an -appropriately sized buffer. We need a way to inform the system -initializer (the CapDL Loader) that when setting up these components' -address spaces, to make the vaddr of the symbol associated with the -dataport in each component map to the same physical memory. During -template instantiation, a database of shared memory regions is -populated. The dataport templates all update this database with the -regions of shared memory they require. The "Collapse Shared Frames" -filter queries this database to find all the regions of shared memory, -then updates the CapDL database, changing memory mappings in the address -space of one component, so it points to the frames already mapped into -the address space of the other component. The frames in the first -component are then removed from the spec. - -### Remove TCB Caps - - -CAmkES has the option to prevent components from being given a cap to -their own TCB. This is implemented as a CapDL Filter, which examines the -cspace (CNode hierarchy) of each component (really each TCB, as -components may have several threads), and removes any caps to any TCBs -that are part of that component. - -### Guard Pages - - -This filter adds guard pages around the stacks of all threads. For each -thread in the system, the ELF that contains the program that will run on -that thread contains a symbol identifying the stack for that thread. -This filter looks up the vaddr and size of that symbol in the ELF, and -modifies the CapDL spec to make sure there's no frame mapped in -immediately before or after the stack. - -## Template Context - - -The python-looking functions called from within templates (e.g. -`alloc_cap`, `register_shared_variable`) are actually keys in a dict -defined here: -. -There are even some values (such as `seL4_EndpointObject`), modules (such -as `sys`), and seemingly built-in functions (e.g. `zip`) passed through -using this dict. You can update this dict to add new functions to the -template context. Some of these functions are called "in the context" of -the template they are instantiating. That is, for component and -connector templates, the generated code will be part of a single -component (each connector has a separate template for each side of the -connection). The most common example of this is when allocating a cap, -the cnode/cspace that will contain the cap isn't passed to `alloc_cap` in -the template code, but rather implied by the component for which the -template is being instantiated. - -### Object Space and Cap Space - - -A template context is created with an "object space" and "cap space". -These are terms from the python CapDL library. An object space tracks -all the objects that will exist in the system the CapDL spec describes. -There is a single object space for an entire CAmkES application. A cap -space tracks all the caps that will be placed in a particular cspace. -There is one cap space for each component. When calling `alloc_cap` in a -template on behalf of a component, the cap is placed in that component's -cap space. The resulting CapDL spec will include in one of that -component's CNodes, an entry for the allocated cap. - -### Template Functions - - -Here are some of the complicated functions in the template context: - -#### alloc_obj(name, type) - - -Updates the CapDL database to contain a new object with a given name and -type, returning a (python) reference to that object. Doesn't create any -caps. - -``` -/*- set ep = alloc_obj("my_ep", seL4_EndpointObject) -*/ -``` - -#### alloc_cap(name, object) - - -Updates the CapDL database, adding a named cap to a given object to the -current component's cap space, returning the CPtr of the cap. -``` -// continues from above -/*- set ep_cap = alloc_cap("my_ep_cap", ep) -*/ -seL4_Wait(/*? ep_cap ?*/); -``` - -#### alloc(name, type) - - -Effectively equivalent `to alloc_cap(name, alloc_obj(name, type))` - -## Simple - - -Simple is an interface in the seL4 libraries for accessing information -about your environment, typically about which capabilities are -available. CAmkES has an implementation of simple which a component can -use to access (some of) its caps. It's implemented as a jinja template: - - -A component instance can be built with this simple implementation by -adding the following to the assembly: -``` -configuration { - instance_name.simple = true; -} -``` - -## Template Instantiation Order - - -CAmkES instantiates templates in the following order: makefile, -components, connections, simple, capdl. The makefile has to come first -since it defines the build rules that instantiate all the other -templates. Simple must come after components and connections as it needs -to generate code to give access to caps allocated in component and -connection templates. Capdl must be last as it needs to be run after -compiling all components (including code generated by the simple -template). Since each template may be instantiated while producing any -output file, in order for caching to work correctly, the order of -template instantiation must be deterministic, at least in a single -invocation of the CAmKES-tool. - -Note that components and connections will be instantiated in arbitrary -(but deterministic) order. An implication of this, is that if multiple -components want a cap to the same object (e.g. an endpoint which two -components use to communicate), each template that needs to talk about a -cap to the object must first allocate it unless it's already allocated. -This is because you can't talk about a cap to an object until that -object has been allocated. Typically in such a situation, you'll see the -following template code on both sides of the connection: -``` -/*- set ep = alloc_obj('ep_obj_name', seL4_EndpointObject) -*/ -/*- set ep_cap = alloc_cap('this_components_ep_cap', ep) -*/ - -// do something with ep_cap -``` - -Looking at the code, it appears the endpoint will be allocated twice, as -both sides of the connection will call `alloc_obj`. Digging deeper into -the implementation of `alloc_obj`, we see it calls a function called -`guard`. `guard` is a bit of a misnomer. A more appropriate name might be -`allocate_unless_already_allocated`. It checks whether there's already -an object by the given name, returns the object if it exists, otherwise -allocates and returns it. diff --git a/projects/camkes/manual.html b/projects/camkes/manual.html new file mode 100644 index 00000000000..1565ef7d061 --- /dev/null +++ b/projects/camkes/manual.html @@ -0,0 +1,4253 @@ + + + + + + + CAmkES Manual | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/camkes/manual.md b/projects/camkes/manual.md deleted file mode 100644 index a09b9dbc97f..00000000000 --- a/projects/camkes/manual.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -toc: true -repo: seL4/camkes-tool -include_file: docs/index.md -redirect_from: - - /CAmkES/Terminology - - /projects/camkes/terminology.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# CAmkES Manual - -{% include include_github_repo_markdown.md %} diff --git a/projects/camkes/next.html b/projects/camkes/next.html new file mode 100644 index 00000000000..ed2f796897a --- /dev/null +++ b/projects/camkes/next.html @@ -0,0 +1,652 @@ + + + + + + + CAmkES Next | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+
+

This page is archived and is no longer receiving updates.

+

It remains here because some of the content may still be useful.

+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/camkes/next.md b/projects/camkes/next.md deleted file mode 100644 index 175f74705f3..00000000000 --- a/projects/camkes/next.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -redirect_from: - - /CAmkESNext -archive: true -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# CAmkES Next - -CAmkES Next refers to the `next` branch of camkes-tools. It is the -active development branch of camkes. - -{% include note.html %} -This branch was used before the release of CAmkES 3. The current development -branch is `master` and contains all previous work from the `next` branch. The -latest release is {{site.camkes}}. -{% include endnote.html %} - -Github: - -Main CAmkES page: [CAmkES](./) - -Summary of differences between CAmkES next and CAmkES master: -[differences](differences.html) - -## Setting up your machine - - -The following commands were tested on a fresh installation of Ubuntu -16.04. This will install the tools and libraries required to build seL4 -and CAmkES Next. Note that the dependencies are different from those of -the "master" branch of CAmkES. -``` -apt-get install git repo libncurses-dev python-pip libxml2-utils cmake ninja-build clang libssl-dev libsqlite3-dev \ -libcunit1-dev gcc-multilib expect qemu-system-x86 qemu-system-arm gcc-arm-none-eabi binutils-arm-none-eabi - -pip install six plyplus pyelftools orderedset jinja2 - -curl -sSL https://get.haskellstack.org/ | sh -``` - -If you are using Ubuntu 14.04, then you will need to install some extra -packages and update your compiler. Instead of the above do the following -(the main changes are: replace repo with phablet-tools, add python-dev, -and install gcc-5 and gcc-5-multilib from the PPA and set it as the -default gcc): -``` -add-apt-repository ppa:ubuntu-toolchain-r/test -apt-get update -apt-get install git phablet-tools libncurses-dev python-dev python-pip libxml2-utils cmake ninja-build clang libssl-dev \ -libsqlite3-dev libcunit1-dev gcc-multilib expect qemu-system-x86 qemu-system-arm gcc-arm-none-eabi binutils-arm-none-eabi \ -gcc-5 gcc-5-multilib -update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 60 - -pip install camkes-deps - -curl -sSL https://get.haskellstack.org/ | sh -``` - -On Archlinux: -``` -pacman -S binutils gcc-multilib arm-none-eabi-binutils arm-none-eabi-gcc ccache clang moreutils cpio python python-pip expect \ -cmake ninja m4 automake autoconf pkg-config valgrind cppcheck python-pylint qemu qemu-arch-extra openssl bcunit - -yaourt -S bcunit-cunit-compat spin - -pip install camkes-deps - -curl -sSL https://get.haskellstack.org/ | sh -``` - -If you are using Debian, or Ubuntu 16.10 or higher, you'll need to -modify the compiler/linker flags for building ghc. Modify -`~/.stack/programs/x86_64-linux/ghc-8.0.1/lib/ghc-8.0.1/settings`. -Replace the lines: -``` - ("C compiler flags", " -fno-stack-protector"), - ("C compiler link flags", ""), -``` -with -``` - ("C compiler flags", " -fno-PIE -fPIC -fno-stack-protector"), - ("C compiler link flags", "-no-pie -fPIC"), -``` - -See [this stack issue on GitHub](https://github.com/commercialhaskell/stack/issues/2712) for more information. - -## Download and build example CAmkES app - - -Create and enter an empty working directory before running the commands -below. -```bash -# Download CAmkES, seL4, user libraries and example apps -repo init -u https://github.com/seL4/camkes-manifest.git -m next.xml -repo sync - -# Select an app to build (build configs for example apps can be found in the "configs" directory) -make arm_simple_defconfig - -# Compile it -make - -# Run the app in qemu -qemu-system-arm -M kzm -nographic -kernel images/capdl-loader-experimental-image-arm-imx31 -``` diff --git a/projects/camkes/releases.md b/projects/camkes/releases.md deleted file mode 100644 index 88b6eb07792..00000000000 --- a/projects/camkes/releases.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -permalink: /releases/camkes.html -redirect_from: - - /camkes_release -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# CAmkES releases - -{% assign coll = site['releases'] | where: "project", "camkes" %} -{% comment %} -Sort sorts by string sorting so a version of 2.3.0 is higher than 10.0.0. -Because of this we need to split the list into two before sorting. -{% endcomment %} -{% assign releases_1 = coll | where_exp:"item", "item.version_digits != 2" | sort: "version" %} -{% assign releases_2 = coll | where_exp:"item", "item.version_digits == 2" | sort: "version" %} -{% assign releases = releases_1 | concat: releases_2 %} - -{% for release in releases reversed %} -{%- assign seL4_link = '[' | append: release.seL4 | append: '](' | - append: '/releases/sel4/' | append: release.seL4 | - append: '.html)' %} -- Release [{{ release.title }}]({{ release.url | relative_url }}), for seL4 {{seL4_link}} {% if forloop.first %}(latest){% endif %} -{% endfor %} diff --git a/projects/camkes/seL4SharedDataWithCaps.html b/projects/camkes/seL4SharedDataWithCaps.html new file mode 100644 index 00000000000..7439d52c7d0 --- /dev/null +++ b/projects/camkes/seL4SharedDataWithCaps.html @@ -0,0 +1,585 @@ + + + + + + + seL4SharedDataWithCaps | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+
+

This page is archived and is no longer receiving updates.

+

It remains here because some of the content may still be useful.

+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/camkes/seL4SharedDataWithCaps.md b/projects/camkes/seL4SharedDataWithCaps.md deleted file mode 100644 index 0a036e0c49d..00000000000 --- a/projects/camkes/seL4SharedDataWithCaps.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -archive: true -parent: /projects/camkes/ -redirect_from: - - /seL4SharedDataWithCaps -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# seL4SharedDataWithCaps - - -`seL4SharedDataWithCaps` is a CAmkES connector for connecting dataport -interfaces, where one side of the interface has caps to the frames -backing the dataport. This is different from the common dataport -connector `seL4SharedData`, in which neither side has caps to the frames. -`seL4SharedData` is used in the CAmkES VM to implement Cross VM Dataports, -which require the VMM to map memory backing a dataport into the VM's -address space - an operation which requires caps to the frames. - -The templates and connector definition for `seL4SharedDataWithCaps` is in -[global-components](https://github.com/seL4/global-components). - -For an example of this connector in action, see the -[CAmkES VM](https://github.com/seL4/camkes-vm-examples/blob/master/apps/x86/optiplex9020/optiplex9020.camkes#L46). - -### Usage - - -Connect a pair of dataport interfaces, as with `seL4SharedData`. The `to` -component instance on the side of the connection will have caps to the -dataport frames in its cspace. The connector implements the following -interface, which provides access to the caps mapping the dataport: -[dataport_caps.h](https://github.com/seL4/camkes-vm/blob/3883770209ba2bfb4f85ed2b7d387731e2601b7d/common/include/dataport_caps.h). - -The interface on the `to` side of each `seL4SharedDataWithCaps` connection -must be configured with a unique id and size: -``` -._id = = 1>; -._size = ; -``` - -Specifying a non-unique or non-positive id is an error. Specifying a -size other than the size of the type of the dataport is an error. -Omitting this configuration for an interface connected with -`seL4SharedDataWithCaps` is an error. diff --git a/projects/camkes/setting-up.html b/projects/camkes/setting-up.html new file mode 100644 index 00000000000..6009cd46000 --- /dev/null +++ b/projects/camkes/setting-up.html @@ -0,0 +1,817 @@ + + + + + + + Setting up your machine to use CAmkES | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/camkes/setting-up.md b/projects/camkes/setting-up.md deleted file mode 100644 index e861a067910..00000000000 --- a/projects/camkes/setting-up.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Setting up your machine to use CAmkES - -This page describes how to set up your development host machine for building and -using the CAmkES component system on top of seL4. The first steps are the build -dependencies for the seL4 kernel. You will need these, including Google's repo -tool. The steps are repeated below for convenience. In addition, projects using -CAmkES need Haskell and some extra Python libraries. Instructions for these -are underneath. - -{% include seL4-deps.md %} - - -## CAmkES Build Dependencies - -### More Python - -The Python dependencies required by the CAmkES build toolchain can be installed via pip: - -```sh -pip3 install --user camkes-deps -``` - -{% include pip-instructions.md %} - -### Haskell Dependencies - -The CAmkES build toolchain additionally requires Haskell. You can install the -[Haskell stack](https://haskellstack.org) on your distribution by running: - -```sh -curl -sSL https://get.haskellstack.org/ | sh -``` - -If you prefer not to bypass your distribution's package manager, you can do - -```sh -sudo apt-get install haskell-stack -``` - -### Build Dependencies - -{% include tabs.html %} - -{% include tab.html title="Ubuntu" %} - -These instructions are intended for Ubuntu LTS version 22.04. - -Install the following packages: - -```sh -sudo apt-get install clang gdb -sudo apt-get install libssl-dev libclang-dev libcunit1-dev libsqlite3-dev -sudo apt-get install qemu-kvm -``` - -{% include endtab.html %} - -{% include tab.html title="Debian" %} - -The dependencies listed in our docker files -[repository](https://github.com/seL4/seL4-CAmkES-L4v-dockerfiles) will work for -a Debian Bullseye installation or later. You can refer to this repository for an -up-to-date list of base build dependencies. Specifically refer to the -dependencies listed in the [CAmkES -docker setup](https://github.com/seL4/seL4-CAmkES-L4v-dockerfiles/blob/master/scripts/camkes.sh). - -{% include endtab.html %} - -{% include endtabs.html %} - - -### CAmkES repository collection checkout - -To check out a consistent collection of CAmkEs, tools, libraries, and kernel -from the `camkes-manifest` repository, run the following: - -```sh -mkdir camkes-project -cd camkes-project -repo init -u https://github.com/seL4/camkes-manifest.git -repo sync -``` - -To run a simple demo example: - -```sh -cd camkes-project -mkdir build -cd build -../init-build.sh -DPLATFORM=sabre -DAARCH32=1 -DCAMKES_APP=adder -DSIMULATION=1 -ninja -./simulate -``` diff --git a/projects/camkes/status.html b/projects/camkes/status.html new file mode 100644 index 00000000000..29bd2a2d0d8 --- /dev/null +++ b/projects/camkes/status.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/camkes/terminology.html b/projects/camkes/terminology.html new file mode 100644 index 00000000000..eb437e0aa76 --- /dev/null +++ b/projects/camkes/terminology.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/camkes/visual-camkes/index.html b/projects/camkes/visual-camkes/index.html new file mode 100644 index 00000000000..d45eecaa012 --- /dev/null +++ b/projects/camkes/visual-camkes/index.html @@ -0,0 +1,808 @@ + + + + + + + VisualCAmkES | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/camkes/visual-camkes/index.md b/projects/camkes/visual-camkes/index.md deleted file mode 100644 index a0b7339df07..00000000000 --- a/projects/camkes/visual-camkes/index.md +++ /dev/null @@ -1,234 +0,0 @@ ---- -parent: /projects/camkes/ -redirect_from: - - /VisualCAmkES/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# VisualCAmkES - -VisualCAmkES, also known as Visualisation of CAmkES, is a tool that allows one -to visually understand a CAmkES system, how it works and how the different -components are connected together. This makes understanding easier and more -intuitive than traversing CAmkES code. An example of a graph generated by this -tool is shown below - -Example Output from VisualCAmkES - -Currently this program loads in a top-level camkes file and generates a graph -from it. It also lets the user interact with the graph (zoom, pan and move -nodes). The tool is a foundation for a CAmkES IDE. To create a CAmkES IDE, one - must first be able to display a current CAmkES system and allow interaction. -And that is what this project does. Since it was clear that this project should -become an IDE in the future, the code has been written with that in mind. - -The tool is written in python, for two reason. Python provides cross-platform -compatibility, which doesn’t require heavy, insecure Java virtual machine. The -tool uses the CAmkES Ast and Parser API, and since this was written in python, -this tool was also written in python. - -## How to Install - -Follow the [setup instructions for CAmkES](../setting-up.md) to obtain a -repository collection checkout. The tool should is found in -`projects/camkes-tool/camkes/visualCAmkES/`. - -Running the tool requires a few added dependencies: Graphviz and Qt. Qt is a -framework, which includes GUI, Network, Concurrency and other things. This -installation procedure assumes you have the rest of CAmkES working. - -### Installing Qt - -For Debian/Ubuntu users, there are two ways to install this. The easy way is to -apt-get the items. The "long" way is to build from source. For Mac, use homebrew. - -Qt is quite big, and the majority of it is unnecessary for VisualCAmkES. So we -recommend to build from source for personal computers. - -#### From apt-get - -```bash -sudo apt-get install python-pyqt5 -sudo apt-get install python-pyqt5.qtsvg -``` - -#### From source - -```bash -cd /some/temp/directory/like/Downloads -git clone https://github.com/qt/qt5.git -cd qt5 -git checkout 5.5 -./init-repository --no-webkit --module-subset=qtbase,qtsvg - -# Check where Qt will install - needed for PyQt5 -./configure --help -# Have a look at where qt will be installed, for me it was installed in /usr/local/Qt-5.5.1 - -./configure -release -nomake examples -nomake tests -opensource -confirm-license # add "-qt-xcb" for linux - -make -j4 # This takes a long time (1-3 hrs) -make install -``` - -### Installing Graphviz - -For Linux: - -```bash -sudo apt-get install graphviz -sudo pip install graphviz -sudo pip install pydotplus -``` - -For Mac: - -```bash -brew install graphviz -``` - -### Installing other dependencies - -```bash -sudo pip install ansi2html -``` - -## How to use - -This program is easy to use, yet quite powerful. To start the application, from -the root of the repository collection checkout, run: - -```bash -python projects/camkes-tool/camkes/visualCAmkES/visualCAmkES -``` - -### Opening a File - -To open a file, click File->Open. Then select a **top-level -camkes file**. Your graph will load. - -### Manipulating the graph - -In the right, you have a few buttons: - -VisualCAmkES Corner UI buttons - -The button's name should be self-explanatory. Autolayout will use graphviz to -reposition the nodes into a "nice" format. In my experience, graphviz never -gives a nice layout, but it does give a good starting point for you. - -You can move the instances around by click & dragging each box. The -connections will continually redraw as you move the box. There is a -minimum distance to see the symbol for each connection. - -### Exporting and Saving - -As you change the graph, **the program automatically saves a .layout file**, -which contains the current -position of each box. This means that you can close the python -application, and when you reopen it, your latest layout will appear. - -You can export an image, into either PNG or SVG. - -1. Clicking Save Image or File->Export Image. -2. Choose either PNG or SVG from the combo-box (first input). - a. For PNG, resolutions is mandatory. - b. For SVG, no input is mandatory. -3. Click OK. -4. Choose a place to save your file, and name your picture. - -### Import Paths - -In some cases, users may have external import paths which is usually a -parameter to the camkes parser. In order to visualise these camkes -projects, the user can add import paths by doing the following: - - 1. Click Edit -> Add import paths - - 2. In the dialog box, type (or paste) your import paths. These need to be - absolute paths. To add many paths, have spaces between your paths. - - `/home/someUser/camkes-next/projects/FileExtender /home/someUser/camkes-next/projects/common` - -A keyboard shortcut is also implemented, Cmd + I or Cmd + I . - -### Key-mappings - -The key-mappings are as follows: - -|Task |Linux/Windows|Mac | -|--------------------|-------------|-------| -|Open |Ctrl + O |Cmd + O| -|Autolayout |Ctrl + L |Cmd + L| -|Export (Save) Image |Ctrl + E |Cmd + E| -|Zoom In |Ctrl + = |Cmd + =| -|Zoom Out |Ctrl + - |Cmd + -| -|Add Import Paths |Ctrl + I |Cmd + I| - -## How it works - -### High-level overview - -UML Diagram of VisualCAmkES - -The above is quick UML class diagram. A few other classes isn't shown like -SaveOptionDialog - but these are helper classes. - -The program is written in object-oriented style, Model-View-Controller -(MVC) paradigm. If you don't know what MVC is, its pretty much: Model -represents the data, the backend; View represents the front-end, what -the user sees; Controller keeps the Model and View in sync. Qt works on -a Model-View paradigm, which is very similar - except the Controller and -View are the same thing. - - 1. GraphController is the QMainWindow - and starts of the program. It - takes the chosen file from the user, gets an AST presentation from - the ASTModel, and passes it on to the GraphWidget (the view). - 2. GraphWidget will traverse the AST, creating InstanceWidget for - Instances and ConnectionWidget for Connections. - 3. GraphWidget is a QGraphicsView - containing QGraphicsScene. - InstanceWidget and ConnectionWidget are QGraphicWidget and - QGraphicItem respectively. QGraphicScene handles the placements of - QGraphicItems, and has functions for scaling (i.e. zoom), panning, - moving of nodes etc. - 4. The program primary works by events. Events are like mouse clicks, - button presses etc. - -Throughout my code, I use lazy instantiation. Most (if not all) global -variables are declared as properties. Lazy instantiation is when -properties are created only when they are first called. Lazy -instantiation is done because subclasses might have different -expectation of properties's class. - -The getters and settings may trigger other events such as updating the -screen. Furthermore - it seems that when a property is passed down the -different classes, say from GraphWidget to ConnectionWidget, the getter -from GraphWidget is invoked. Hence, events can be triggered in -GraphWidget when ConnectionWidget access the properties. - -### Layout - -In order to save the layout information - the program saves a -.visualCAmkES.layout file. It starts with a . because it is purposefully hidden -(which won't work on windows ...). This file is a json file containing -dictionaries. The key is the instance name, the value is another dictionary. The -latter dictionary contains the position and whether it was hidden. Feel free to -view the .layout file, but changing it can risk losing the layout. - -### Additional implementation details - -- When connection widgets are deleted, ConnectionWidget.delete() - must be called on the object. This is because connection widget - is tracked by the from and to instance widgets, so it needs to - delete itself from them. -- Context menu is a bit weirdly implemented. This is what I mean - by weird: normally you would just create the menu and it all - works - including closing of the menu. However this doesn't work - with QGraphicScenes. So the solution is to add the context menu - to the scene, and manually close it if the mouse was clicked - anywhere outside the context menu. - -Traversing the code using PyCharm IDE is highly recommended. diff --git a/projects/capdl/c-loader-app.html b/projects/capdl/c-loader-app.html new file mode 100644 index 00000000000..082accc14af --- /dev/null +++ b/projects/capdl/c-loader-app.html @@ -0,0 +1,601 @@ + + + + + + + capDL Loader | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/capdl/c-loader-app.md b/projects/capdl/c-loader-app.md deleted file mode 100644 index 41793deaf32..00000000000 --- a/projects/capdl/c-loader-app.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. -repo_link: https://github.com/seL4/capdl/blob/master/capdl-loader-app/ ---- - -# capDL Loader - -The capDL loader is a C program that is intended to run as the initial root task -in a system. It creates seL4 kernel objects and capabilities according to a -declarative [capDL specification](lang-spec.html). - - -## Formal Correctness - -The capDL loader is an implementation of an algorithm that is formally specified -and proved correct (on the model level, but not the implementation level) in the -theorem prover Isabelle/HOL. - -The correctness statement is that the loader will bring the system into a state -that contains only the capabilities and objects in the capDL specification in -addition to capabilities that remain inert in the loader's capability space -after it has terminated. The input capDL specification must satisfy certain -wellformedness criteria for this theorem to hold. They are documented in the -formal definition in the [verification repository][wellformed]. - -The formal model for the capDL initialiser is documented in a research publication -by [Boyton et al (2013)], as well as in [Boyton's PhD thesis (2014)]. - -The Isabelle formalisation is part of the seL4 proofs that are continually -updated and maintained in the [l4v repository][sys-init]. - -## Implementation and use - -The implementation of the capDL loader is comparatively small. It consists entirely -of the following three source files: - -* [`src/main.c`]({{page.repo_link}}/src/main.c): The implementation of the initialiser. -* [`include/capdl.h`]({{page.repo_link}}/include/capdl.h): C type definitions for capDL specifications. -* [`include/capdl_spec.h`]({{page.repo_link}}/include/capdl_spec.h): Interface link point for the input capDL spec. - -The capDL loader expects to be linked against an object file that contains the -input capDL specification for the symbol `extern CDL_Model capdl_spec`. -Typically, this would be a C file that is generated by the [capDL translator -tool](index.html#capdl-translator) from a textual or XML capDL specification. - -The C loader contains more features than the formal model allows in wellformed -specifications. The formal verification does not hold for these features, but -they remain usable. For instance, they can be used for debugging and prototyping -or for systems that do not require formal verification. - -The capDL loader is used in CAmkES applications as the system initialisation -task, and is invoked as part of the CAmkES build in all of the CAmkES examples. - -Expecting to be linked against the specification can be limiting for some build -system setups, because the specification must be compiled against the capDL loader -sources. We would welcome contributions that allow providing the specification -at runtime instead. - - -[wellformed]: https://github.com/seL4/l4v/blob/master/sys-init/WellFormed_SI.thy -[sys-init]: https://github.com/seL4/l4v/tree/master/sys-init - -[Boyton et al (2013)]: https://trustworthy.systems/publications/nicta_full_text/7047.pdf "Formally Verified System Initialisation" -[Boyton's PhD thesis (2014)]: https://trustworthy.systems/publications/nicta_full_text/9141.pdf "Secure architectures on a verified microkernel" diff --git a/projects/capdl/cdl-utils.html b/projects/capdl/cdl-utils.html new file mode 100644 index 00000000000..29e533e19a4 --- /dev/null +++ b/projects/capdl/cdl-utils.html @@ -0,0 +1,573 @@ + + + + + + + cdl_utils | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/capdl/cdl-utils.md b/projects/capdl/cdl-utils.md deleted file mode 100644 index 9005cd6ed3b..00000000000 --- a/projects/capdl/cdl-utils.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -parent: /projects/capdl/ -title: cdl_utils -repo: 'seL4/capdl' -include_file: 'cdl_utils/README.md' -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -{% include include_github_repo_markdown.md %} diff --git a/projects/capdl/index.html b/projects/capdl/index.html new file mode 100644 index 00000000000..090831611a2 --- /dev/null +++ b/projects/capdl/index.html @@ -0,0 +1,686 @@ + + + + + + + Capability Distribution Language (capDL) | seL4 docs + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/capdl/index.md b/projects/capdl/index.md deleted file mode 100644 index 7ce8a0c81db..00000000000 --- a/projects/capdl/index.md +++ /dev/null @@ -1,140 +0,0 @@ ---- -redirect_from: - - /CapDL - -project: capdl -repo_link: https://github.com/sel4/capdl/blob/master -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. -mathjax: true ---- - -# Capability Distribution Language (capDL) - -capDL stands for *capability distribution language*. It is used to describe the -kernel objects an seL4 application needs and the distribution of capabilities in -the system. This defines which parts of the system have capabilities to which -other parts of the system, and therefore defines the access control boundaries -of the system for integrity and confidentiality. - -capDL specifications provide a clean interface for system initialisation and -capability reasoning. Their key feature is that they describe the desired state -of the system declaratively. That means, creating such system states via seL4 -system calls is done by a separate loader application that can be formally -verified once. In addition, capability distributions in seL4 determine what -future states of the system are possible. This allows formal reasoning tools to, -directly from a capDL specification, decide questions such as -*"Can component X ever gain access to resource Y in the future?"*. - -The next few sections give an overview of the [tools and -libraries](#capdl-translator) that are available and show an [example capDL -specification](#example-spec). - -Sources for the capDL tools and libraries are available here: - - -See the research paper by [Kuz et al (2010)] for more in-depth information on -the purpose and design of capDL. - -## capDL Translator - -This program transforms a capDL spec into several formats: - -- a C header file for linking against the capDL Loader to create a program that - instantiates the system described by the spec -- a dot file for visualisation with `graphviz` -- an XML file for further manipulation -- an formal model in the Isabelle/HOL proof assistant for use in proofs about - the system described by the spec - -The tool is written Haskell and can be used as a stand-alone binary. See the -repository [README]({{page.repo_link}}/translator/README.md) for information on -how to build and run the tool. - -## capDL Loader - -The capDL Loader is a program that initialises the seL4 user-level environment -to match the system described by a capDL spec, and loads programs from ELFs in a -provided `cpio` archive. It is intended to be run as the root task, that is, the -first user-level thread, which has access to all resources. - -The capDL Loader must be linked against a capDL spec - the C output of the capDL -Translator. It must also be linked against a cpio archive containing ELF images. -It creates objects and distributes caps as per the spec (if enough resources are -available), and then loads programs into memory at locations specified by the -spec. Finally, it starts all the threads it created and sleeps forever. - -See also the separate [capDL loader page](c-loader-app.html). - -## Python capDL Library - -This library is useful for building up a representation of a capDL state -programmatically in memory and then writing that as a specification to disk. It -allows the programmer to incrementally add information about kernel objects and -capability distribution. The library is used by [CAmkES](../camkes/) to build up a -spec describing the entire system, covering all components and connections. - -See the repository [README]({{page.repo_link}}/python-capdl-tool/README.md) -for information on this library. - -There is also a `cmake` target for generating object sizes and various utilities -for using capDL in build scrips available in the [repository](https://github.com/sel4/capdl). - - -## Example Spec - -Below is an example capDL specification that describes an AArch32 system -with five kernel objects: a TCB, a CNode of size $2^3$, one 4K Frame with a -specified physical address, one page table, and one page directory. The -`caps` section of the spec describes the content of those objects in terms -of references (capabilities) to other objects. - -The capDL translator tool can transform this specification into other formats, -for instance for consumption by the capDL loader. These specifications do not -need to be written manually, they are typically generated from other tools, for -instance with the help of the Python capDL library. - -For more detail on how these specification work, see also the [language -specification for capDL](lang-spec.html). - -```capdl -arch ia32 - -objects { - my_tcb = tcb - my_cnode = cnode (3 bits) - my_frame = frame (4k, paddr: 0x12345000) // paddr is optional - my_page_table = pt - my_page_directory = pd -} - -caps { - - // Specify cap addresses (ie. CPtrs) in cnodes. - my_cnode { - 1: my_tcb - 2: my_frame - 3: my_page_table - 4: my_page_directory - } - - // Specify address space layout. - // With 4gb page directories, 4mb page tables, and 4kb frames, - // the frame at paddr 0x12345000 will be mapped at vaddr 0xABCDE000. - my_pd { - 0x2AF: my_pt - } - my_pt { - 0xDE: my_frame - } - - // Specify root cnode and root paging structure of thread. - my_tcb { - vspace: my_pd - cspace: my_cnode - } - -} -``` - -[Kuz et al (2010)]: https://trustworthy.systems/publications/nicta_full_text/3679.pdf "capDL: A language for describing capability-based systems" diff --git a/projects/capdl/lang-spec.html b/projects/capdl/lang-spec.html new file mode 100644 index 00000000000..fd810fbcf8e --- /dev/null +++ b/projects/capdl/lang-spec.html @@ -0,0 +1,1144 @@ + + + + + + + capDL Language Specification | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/capdl/lang-spec.md b/projects/capdl/lang-spec.md deleted file mode 100644 index 5876d9479ca..00000000000 --- a/projects/capdl/lang-spec.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -toc: true -repo: seL4/capdl -include_file: 'capDL-tool/doc/capDL.md' -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2024 seL4 Project a Series of LF Projects, LLC. ---- - -# capDL Language Specification - -{% include include_github_repo_markdown.md indent_headings=true %} diff --git a/projects/capdl/object-sizes.html b/projects/capdl/object-sizes.html new file mode 100644 index 00000000000..0f21545cc2f --- /dev/null +++ b/projects/capdl/object-sizes.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/capdl/object-sizes.md b/projects/capdl/object-sizes.md deleted file mode 100644 index 431de7ed56b..00000000000 --- a/projects/capdl/object-sizes.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -redirect_to: https://github.com/seL4/capdl/tree/master/object_sizes/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- diff --git a/projects/capdl/python-tool.html b/projects/capdl/python-tool.html new file mode 100644 index 00000000000..9a09648e61b --- /dev/null +++ b/projects/capdl/python-tool.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/capdl/python-tool.md b/projects/capdl/python-tool.md deleted file mode 100644 index 35778bdef37..00000000000 --- a/projects/capdl/python-tool.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -redirect_to: https://github.com/seL4/capdl/tree/master/python-capdl-tool -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- diff --git a/projects/capdl/releases.md b/projects/capdl/releases.md deleted file mode 100644 index 5ddef9e44a5..00000000000 --- a/projects/capdl/releases.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -permalink: /releases/capDL.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# capDL Releases - -{% assign coll = site['releases'] | where: "project", "capdl" %} - -{% for release in coll reversed %} -{%- assign seL4_link = '[' | append: release.seL4 | append: '](' | - append: '/releases/sel4/' | append: release.seL4 | - append: '.html)' %} -- capDL Release [{{ release.title }}]({{ release.url | relative_url }}) for seL4 {{seL4_link}} {% if forloop.first %}(latest){% endif %} -{% endfor %} diff --git a/projects/capdl/translator.html b/projects/capdl/translator.html new file mode 100644 index 00000000000..151cf01fbef --- /dev/null +++ b/projects/capdl/translator.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/capdl/translator.md b/projects/capdl/translator.md deleted file mode 100644 index d3401751ef7..00000000000 --- a/projects/capdl/translator.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -redirect_to: https://github.com/seL4/capdl/tree/master/capDL-tool/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- diff --git a/projects/dockerfiles/index.html b/projects/dockerfiles/index.html new file mode 100644 index 00000000000..9e167516e9c --- /dev/null +++ b/projects/dockerfiles/index.html @@ -0,0 +1,685 @@ + + + + + + + Using Docker for seL4, Microkit, and CAmkES | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/dockerfiles/index.md b/projects/dockerfiles/index.md deleted file mode 100644 index d26539f6d46..00000000000 --- a/projects/dockerfiles/index.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -redirect_from: - - /Docker -project: dockerfiles -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Using Docker for seL4, Microkit, and CAmkES - -This page provides instructions on how to quickly set up your machine for -building the seL4 kernel and related projects. - -## Requirements - -These instructions assume you are using Debian or a derivative, such as Ubuntu, -and are using Bash for your shell. However, it should be informative enough for -users of other distributions/shells to adapt. - -To begin, you will need at least these two programs: - -* make (`sudo apt install make`) -* docker (See [here](https://get.docker.com) or - [here](https://docs.docker.com/engine/installation) for installation - instructions) - -For convenience, add your account to the Docker group: - -```bash -sudo usermod -aG docker $(whoami) -``` - -Note that after doing so you may have to logout of your account and log back in -for the change to have affect. - -## Setting up a build environment - -To get a running build environment for seL4, run: - -```bash -git clone https://github.com/seL4/seL4-CAmkES-L4v-dockerfiles.git -cd seL4-CAmkES-L4v-dockerfiles -make user -``` - -This will give you a terminal inside a container that has all the relevant tools -to build, simulate, and test seL4 and related projects. - -The first time you run this, docker will fetch the relevant images, which may -take a while. - -To map a particular directory into the container: - -```bash -make user HOST_DIR=/scratch/seL4_stuff # as an example -# Now /host in the container maps to /scratch/seL4_stuff -``` - -To make this easier to type, you can setup a bash alias such as this: - -```bash -echo $'alias container=\'make -C ///seL4-CAmkES-L4v-dockerfiles user HOST_DIR=$(pwd)\'' >> ~/.bashrc -# now open a new terminal, or run `source ~/.bashrc` -``` - -Replace `///` to match where you cloned the git repo of the docker -files. This then allows you to run: - -```bash -container -``` - -to start the container in the current directory you are in. - -## An example workflow: - -A good workflow is to run two terminals: - -* terminal A is a normal terminal, and is used for git and editing - (e.g., vim, emacs, vscode). -* terminal B is running a Docker container, and is only used for compilation. - -This gives you the flexibility to use all the tools you are used to, -while having the seL4 dependencies separated from your machine. - -### Compiling seL4 test - -Start two terminals, terminal A (host) and terminal B (docker). - -In terminal A, run these commands: - -```bash -jblogs@host:~$ mkdir ~/seL4test -jblogs@host:~$ cd ~/seL4test -jblogs@host:~/seL4test$ repo init -u https://github.com/seL4/seL4test-manifest.git -jblogs@host:~/seL4test$ repo sync -``` - -In terminal B, run these commands: - -```bash -jblogs@host:~$ cd ~/seL4test -jblogs@host:~/seL4test$ container # using the bash alias defined above -jblogs@in-container:/host$ mkdir build-x86 -jblogs@in-container:/host$ cd build-x86 -jblogs@in-container:/host/build-x86$ ../init-build.sh -DPLATFORM=x86_64 -DSIMULATION=TRUE -jblogs@in-container:/host/build-x86$ ninja -``` - -If you need to make any code modifications or commit things to git, use terminal -A. If you need to recompile or simulate an image, use terminal B. - -{% include note.html %} -If QEMU fails when trying to simulate the image, try configuring your -Docker host to give the container more memory. -{% include endnote.html %} - -## Adding dependencies - -To add more software inside the container, modify the `extras.dockerfile`. It -contains an `apt-get` command which can be added to. After the first -modification, docker will rebuild the extras image, and cache it after that. - -## Available images - -All the prebuilt docker images are available on [DockerHub -here](https://hub.docker.com/u/trustworthysystems) These images are used by the -Trustworthy Systems Continuous Integration (CI) software, and so represent a -standard software setup we use. - -The CI software always uses the `latest` docker image, but images are also -tagged with the date they were built. - -## More information - -You can find the docker files and supporting Makefile in the -[repository](https://github.com/seL4/seL4-CAmkES-L4v-dockerfiles) - -Pull-requests and issues are [welcome](https://sel4.systems/Contribute/). diff --git a/projects/driver_framework/AddressingOtherDevices.html b/projects/driver_framework/AddressingOtherDevices.html new file mode 100644 index 00000000000..f38bd949f10 --- /dev/null +++ b/projects/driver_framework/AddressingOtherDevices.html @@ -0,0 +1,595 @@ + + + + + + + seL4 Driver API Persistent Device Naming Scheme | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+
+

This page is archived and is no longer receiving updates.

+

It remains here because some of the content may still be useful.

+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/driver_framework/AddressingOtherDevices.md b/projects/driver_framework/AddressingOtherDevices.md deleted file mode 100644 index b0b2e089e87..00000000000 --- a/projects/driver_framework/AddressingOtherDevices.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -archive: true -redirect_from: - - /seL4DriverAPI/AddressingOtherDevices -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# seL4 Driver API Persistent Device Naming Scheme - - -Recommended prior reading for this page is the seL4 Driver API's -[location-based device addressing scheme](ChildEnumeration.html#addressing-names). - -## Constants - - -## Functions -```c -seL4drv_connection_t *seL4drv_external_connect(); -``` -## Data structures -```c -typedef void seL4drv_connection_t; -``` - -## Description - - -The seL4 Driver API requires the use of a persistent naming scheme which -forms the basis of the IPC connection system between device instances. -It is through this naming scheme that a device instance can call to its -parent devices, and communicate with devices with which it has lateral -dependencies. - -Devices' addressable names are generated by the parent driver that -enumerates them. Child device enumeration is discussed in detail in the -[Child Enumeration](ChildEnumeration.html#addressing-names) article. - -A driver connects to an external device that it depends on by calling -`seL4drv_external_connect()`, passing in the addressable name of the -particular device that it wishes to connect to. The environment shall -search its device tree for a device which has that name, and return a -handle of type `seL4drv_connection_t *`. Notice that -`seL4drv_connection_t` is of type `void` (see [above](#data-structures)): -this is because it is an opaque handle, and the -driver is not meant to dereference this handle after receiving it. This -handle is meant to be passed to subsequent function calls to the -particular API that was connected to in order to maintain context -between the driver and the target device. - -If the environment is unable to locate a device whose addressable name -matches the one supplied in the call to `seL4drv_external_connect()`, it -shall return **NULL**. The calling driver shall take this to mean that -the device is trying to connect to does not exist, or that it exists but -the environment does not have a driver that can drive it, and so is -unusable. diff --git a/projects/driver_framework/ChildEnumeration.html b/projects/driver_framework/ChildEnumeration.html new file mode 100644 index 00000000000..06cdb8c4e51 --- /dev/null +++ b/projects/driver_framework/ChildEnumeration.html @@ -0,0 +1,756 @@ + + + + + + + Child enumeration model for the seL4 Driver API: | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+
+

This page is archived and is no longer receiving updates.

+

It remains here because some of the content may still be useful.

+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/driver_framework/ChildEnumeration.md b/projects/driver_framework/ChildEnumeration.md deleted file mode 100644 index b4292d12727..00000000000 --- a/projects/driver_framework/ChildEnumeration.md +++ /dev/null @@ -1,216 +0,0 @@ ---- -archive: true -redirect_from: - - /seL4DriverAPI/ChildEnumeration -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Child enumeration model for the seL4 Driver API: - - -## Constants -```c -#define SEL4DRV_DEVATTR_NAME_MAXLEN (32) -``` - -## Functions -```c -seL4drv_mgmt_enumerate_get_num_children(): -seL4drv_mgmt_enumerate_children(); -seL4drv_mgmt_enumerate_hotplug_subscribe(); -uint16_t seL4drv_mgmt_query_device_match(); -``` - -## Structures -```c -typedef struct seL4drv_child_attribute_ { - char attr_name[SEL4DRV_DEVATTR_NAME_MAXLEN]; - uint32_t attr_value; -} seL4drv_child_attribute_t; -``` - -## Child IDs - Each driver whose device is capable of enumerating child -devices must generate a unique child ID for each such child. The child -ID is not required to be globally unique, but it must be unique with -respect to all of of that child's sibling devices. - -The Child-ID need not be persistently unique across executions of the -driver either. The same child device may be assigned a different -child-ID if the driver is killed and then re-initialized. The purpose of -the child-ID is to form a "relational key" (to borrow a database -software term) between the driver and the environment. The same physical -child device may be given different child-IDs by its parent even within -the same execution of that parent if, for example, that child is -unplugged from the computer, and then plugged back in as a hot-plug -event; the parent driver may assign that child device a different -child-ID when it is plugged back in. - -The Environment and the host OS may choose to use some other internal -representation of such child IDs that best suits its device tree, but -this child ID shall be passed back to the driver exactly as originally -given by the driver, for any API call into the driver that requires a -child ID. - -## Addressing Names - Each driver whose device is capable of -enumerating child devices must also generate a unique addressing name -for each of the children. This name does not need to be globally unique, -but it is expected to be unique with respect to all of that child -device's siblings. This addressing name must target the device by its -**location** relative to its parent bus technology. - -This persistent name must always uniquely identify the same device -microcontroller relative to its parent's bus technology. For example, if -on an ISA bus, there are 4 ATA/IDE disks, and the parent ISA bus driver -wishes to generate a persistent name for each of the disks, it should -name them by their persistent locations on the ATA wire. Perhaps they -might be "ATA0-master", "ATA0-slave", "ATA1-master" and "ATA1-slave". - -NB: the intention is not to uniquely identify the attached, removable -peripheral DISK that is attached to the ATA/IDE microcontroller, but to -identify the ATA/IDE microcontroller itself, which is wired onto the -silicon. The swappable disk that happens to be attached to the -interfacing microcontroller will be persistently named by the Operating -System according to that OS's own convention. That is beyond the scope -of this specification. - -In the case of a PCI device, the persistent name might be the -location-based combination which would -uniquely, and persistently identify a particular PCI unit across -executions. Again, the intention is not to identify the particular -peripheral that is connected on that PCI . -The recognition of a particular PCI peripheral card such as a specific -graphics card, should be left up to the higher layer Operating System -which will name that peripheral according to its own convention. - -In the case of a USB device, the persistent name might be an 8-bit -location-based hub-relative identifier for the USB port, starting from -the root hub down the tree of hubs to that USB port. The actual port's -persistent name might be a simple 8-bit integer that identifies that -port's hub, concatenated with that port's address on that hub. The -parent hub might have been named by the root hub. Once again, the -generation of a persistent name for a specific USB flash disk that -happens to be plugged into any particular USB port will be handled by -the host Operating System, and is not the focus of this naming scheme. -The addressable naming scheme is attempting to determine the -bus-relative location, and not the particular peripheral that is -attached to that location/port. - -## Procedural flow - The intention of the enumeration API is to enable -the environment to both build and maintain its "device tree", which it -uses to track the status and availability of hardware. The enumeration -API enables initial discovery of hardware devices, as well as dynamic -discovery and removal of devices from the tree as they appear and -disappear. - -The environment should begin an enumeration sequence by calling -`seL4drv_mgmt_enumerate_get_num_children()` on the target device -instance, in order to ask the driver to tell it how many child devices -it **currently** has. The parent driver shall report **all** such -child devices, regardless of whether or not they are powered on. All -devices which are operationally viable and functional should be reported -to the environment. By implication, faulty or malfunctioning devices, if -they can be recognized as such (e.g., if the firmware informs the driver -that a device is faulty) should be omitted. - -After that, the environment should call -`seL4drv_mgmt_enumerate_children()` to actually get information on all -the target device instance's children. The environment shall pass to -this function a block of memory that is suitably sized to enable the -driver to fill out the childrens' information. Please see the -description of `seL4drv_mgmt_enumerate_get_num_children()` in its -section below to understand how to determine how much memory to allocate -when requesting child device information. - -The driver will then fill out this information for each child device, -and return the information to the environment. - -## Hotplug device enumeration - The API supports hotplug device -enumeration through the means of a "subscription" function. The driver -does not initiate a notification to the environment. Rather, the -environment posts an indication of interest (subscription notification), -along with an asynchronous context preserving cookie. The driver shall -keep this context cookie until a hotplug event occurs (whether the -addition or removal of a device), and at such a time, it shall generate -the asynchronous callback that completes the asynchronous roundtrip for -the "subscription" invocation. - -When the environment finally gets such a callback, it shall simply -refresh its information about the children of the target device, by once -again calling `seL4drv_mgmt_enumerate_get_num_children()`, and doing -a re-run of `seL4drv_mgmt_enumerate_children()`. The environment can -then compare the **Child IDs** of the newly returned list of devices -with those that it previously had in its device tree, and perform an -update of its device tree. - -When the driver completes the asynchronous roundtrip, it shall return -the same memory that was originally passed to it by the environment. The -environment is then free to either re-subscribe to such notifications by -calling `seL4drv_mgmt_enumerate_hotplug_subscribe_ind()` again, or to -choose to indicate that it is no longer interested in subscribing to -such notifications by not calling it again. - -## API - - -### seL4drv_mgmt_enumerate_get_num_children(): Sync - This -function allows the environment to know how much memory it should -allocate for its subsequent calls to -`seL4drv_mgmt_enumerate_children()`. - -There are two values returned by this function: - -1. The number of child devices that the driver instance is - aware of. *Let this value be N_children*. -2. The number of attributes required to describe each child device. - *Let this value be N_attrs_per_child*. - -The environment is expected to allocate memory equal to -`N_attrs_per_child * sizeof(seL4drv_child_attribute_t)` for each -child device. - -If `seL4drv_mgmt_enumerate_get_num_children()` reports that there are -multiple child devices, the environment is expected to allocate memory -equal to -`N_attrs_per_child * sizeof(seL4drv_child_attribute_t) * N_children`. - -This amount of memory shall then be passed to -`seL4drv_mgmt_enumerate_children()`. - -### seL4drv_mgmt_enumerate_children(): Sync - This function shall -cause the driver to return a list of child devices and their attributes, -as well as Child IDs for each of the children, according to the its -discretion, deferring to the constraints outlined above. - -### seL4drv_mgmt_enumerate_hotplug_subscribe(): Async - This -function shall transfer to the driver a block of memory which shall be -kept by the driver until a hotplug event occurs. When such an event -occurs, the driver shall complete the asynchronous roundtrip by calling -back to the environment, returning the memory to the environment in so -doing. - -### seL4drv_mgmt_identify_device(): Sync - This function shall take -a list of attributes that describe a device, and return an unsigned -integer which states whether or not the driver can handle the device -that is described by those attributes. - -If the driver determines that the passed attributes do not describe a -device that it can manage, the driver **shall** return integer `0` -(zero). If the driver determines that the passed attributes describe a -device that it is equipped to handle, it **shall** return a positive -integer `1`. - -*It is recommended that drivers which return a value greater than `0` -should return `1` for now, since in the future, significance will be -ascribed to the values returned. At present, there is no significance -attached to the particular value returned, but for future compatibility -since values above `1` will carry significance, drivers must return `1` for -now.* diff --git a/projects/driver_framework/DriverManagement.html b/projects/driver_framework/DriverManagement.html new file mode 100644 index 00000000000..824f410e61c --- /dev/null +++ b/projects/driver_framework/DriverManagement.html @@ -0,0 +1,687 @@ + + + + + + + Power management commands for the seL4 Driver API | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+
+

This page is archived and is no longer receiving updates.

+

It remains here because some of the content may still be useful.

+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/driver_framework/DriverManagement.md b/projects/driver_framework/DriverManagement.md deleted file mode 100644 index 776e969cdd7..00000000000 --- a/projects/driver_framework/DriverManagement.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -archive: true -redirect_from: - - /seL4DriverAPI/DriverManagement -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Power management commands for the seL4 Driver API - - -## Constants -```c -/* Driver power states supported by the API. - * These are used by both seL4drv_mgmt_power() - * and seL4drv_mgmt_power_features(). - */ -#define SEL4DRV_MGMT_POWER_BOOT (1<<0) -#define SEL4DRV_MGMT_POWER_WAKEUP (1<<1) -#define SEL4DRV_MGMT_POWER_SLEEP (1<<2) -#define SEL4DRV_MGMT_POWER_DEEP_SLEEP (1<<3) -#define SEL4DRV_MGMT_POWER_SHUTDOWN (1<<4) -#define SEL4DRV_MGMT_POWER_KILL (1<<5) -``` - -## Functions -```c -void seL4drv_mgmt_critical_event_subscription_ind(); -void seL4drv_mgmt_power(); -void seL4drv_mgmt_power_features(uint32_t *features_bitmap); -void seL4drv_mgmt_enumerate_children(); -``` - -## Power state specifications - - -- SEL4DRV_MGMT_POWER_BOOT: Support for this power management - command is required of all drivers. This is actually the global - entry point for a driver, and it will be called only once during - a particular device instance's lifetime. After the driver - returns from this function call, the environment will assume - that the device has been initialized and is ready to - accept requests. -- SEL4DRV_MGMT_POWER_WAKEUP: Support for this power management - command is required of all drivers which support the SLEEP or - DEEP_SLEEP commands. Instructs the driver to resume operation - after a SLEEP or DEEP_SLEEP command. The driver is expected to - do any necessary re-initialization of the hardware to get the - driver back into an operational state. If there were - asynchronous requests outstanding before the device was put into - a low-power mode, the driver should re-trigger and resume the - normal processing of such requests. -- SEL4DRV_MGMT_POWER_SLEEP: Indicates to the driver that the - device is about to be placed into a light sleep state. In such a - state, the caches of its underlying and dependent hardware are - guaranteed not to be flushed, and there will be no need to - reinitialize the buses after wakeup. If the device does not - support such a light sleep mode, the device shall return an - error code. -- SEL4DRV_MGMT_POWER_DEEP_SLEEP: Indicates to the driver that - the environment would like to place the device into a sleep - state in which there is no guarantee that hardware caches and - buffers will be preserved. Furthermore, there is no guarantee - that bus configuration will hold across this transition. The - driver shall cleanly commit the effect of all current - operations, and place any unsatisfied asynchronous requests on - hold, before putting the device into a state that is compatible - with this sleep state. -- SEL4DRV_MGMT_POWER_SHUTDOWN: Support for this power - management command is required of all drivers. Indicates that - the device should be placed into a state in which it would be - safe to cut off power to the device. Such a state should at - least guarantee that all clients' data is quickly cleaned out to - permanent storage, and that all effects requested by clients - are committed. If it is possible to satisfy any outstanding - asynchronous requests the driver should commit to completing - them, but it should reject all future requests from that - point onward. -- SEL4DRV_MGMT_POWER_KILL: Support for this power management - command is required of all drivers. Indicates that the - environment wants to kill the device, NOW. Any outstanding - asynchronous requests should be canceled and the driver should - then place itself into a state that is compatible with the - SEL4DRV_MGMT_POWER_SHUTDOWN command. - -## API - - -### seL4drv_mgmt_critical_event_subscription_ind(): Async - This -function enables the environment to call into the driver, and give it an -asynchronous context block which it should hold on to. If at any point -the driver encounters a situation which requires it to ask the -environment to shut it down, it can asynchronously callback into the -environment to make such a request. - -The reason for this function is to enable the driver to report to the -environment when it has found itself in an invalid operational state -which it cannot recover from. This is not a necessary function to -implement, and it is likely to be a blank function for most -implementations. - -### seL4drv_mgmt_power(): Async - This operation is called by the -environment to place the device instance into one of the power states -outlined above. It is important to note that SEL4DRV_MGMT_POWER_BOOT -is actually just a global entry point into the driver. - -When it comes to placing devices into low power states, the environment -must understand that it is not the responsibility of the driver to -communicate the power management request to its children. If the -environment would like to place an entire hardware bus in a low-power -mode, then the environment must walk its own internal device tree, and -for each descendant of the target bus, it must manually ask that -descendent to enter a power state that is compatible with the power -state it wishes to place the bus into. That is, parent devices are not -responsible for recursing downward and calling their children to -instruct them to enter power states on behalf of the environment. - -The same applies for waking devices up from power states. If the -environment wishes to wake a particular child device, it must manually -ensure that all of that device's parents are in a suitable power state -to enable operation. - -### seL4drv_mgmt_power_features(): Sync - This function returns a -bitmap of the supported driver power states (See [#constants](#constants)). -All drivers are required to support at minimum, the following states: -- SEL4DRV_MGMT_POWER_BOOT -- SEL4DRV_MGMT_POWER_SHUTDOWN -- SEL4DRV_MGMT_POWER_KILL - -If any of these is not supported by the driver, the environment is free -to respond in an implementation specific manner, including refusing to -load the driver. - -The driver is only required to support the SEL4DRV_MGMT_POWER_WAKEUP -command if either the SEL4DRV_MGMT_POWER_SLEEP or -SEL4DRV_MGMT_POWER_DEEP_SLEEP command is supported. If either the -SLEEP or DEEP_SLEEP command is supported and there is no support for -the SEL4DRV_MGMT_POWER_WAKEUP command, the environment should assume -that the SLEEP or DEEP_SLEEP operations are not adequately supported. - -## Child enumeration - See the main article: diff --git a/projects/elfloader/index.html b/projects/elfloader/index.html new file mode 100644 index 00000000000..c4bdba2853b --- /dev/null +++ b/projects/elfloader/index.html @@ -0,0 +1,696 @@ + + + + + + + Elfloader | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/elfloader/index.md b/projects/elfloader/index.md deleted file mode 100644 index 1705b03cfab..00000000000 --- a/projects/elfloader/index.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Elfloader -project: elfloader -repo: 'seL4/sel4_tools' -include_file: 'elfloader-tool/README.md' -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -{% include include_github_repo_markdown.md %} diff --git a/projects/hardware_hacks/index.html b/projects/hardware_hacks/index.html new file mode 100644 index 00000000000..3610e40ed48 --- /dev/null +++ b/projects/hardware_hacks/index.html @@ -0,0 +1,587 @@ + + + + + + + Hardware Hacks | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+
+

This page is archived and is no longer receiving updates.

+

It remains here because some of the content may still be useful.

+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/hardware_hacks/index.md b/projects/hardware_hacks/index.md deleted file mode 100644 index 6170456afe5..00000000000 --- a/projects/hardware_hacks/index.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -archive: true -redirect_from: - - /HardwareHacks -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Hardware Hacks -We have built various bits and pieces to enable easier use of our -hardware. Some of these are documented here in case others might find -them useful. The issue is that we want our embedded hardware to be -shareable between multiple users and an automated test harness. The -manufacturers of most of our gadgets assume we're going to be using a -TTL to USB serial converter and Fastboot; this doesn't scale, as when -you have several plugged in, the enumeration order is not fixed, so -there's no way to tell which of many gadgets you are talking to. - -The general approach we take is: - -1. As far as possible, boot everything on power-up via DHCP and - TFTP -2. Connect a debug serial port via a [Level Converter](level-converter) to a Lantronix - serial concentrator. An ETS16P for example provides 16 - RS422/RS232 ports, and can be obtained for less than $100 - on eBay. -3. Connect power for each device via a network-controllable switch. - For most of our gadgets we're using a cubieTruck and an pair of - arduino-connected 8-way relay boards, hooked up to an old AT - power supply top give 5V or 12V depending on each - board's requirements. It doesn't matter much provided that via - the network, one can turn on, turn off, and query the power - state of a particular port. - -We use a set of MachineQueue scripts to arbitrate access to the various -gadgets. - -A few machines already have a base-management-controller; if they have -it we use it. - -One machine, the CMA34D, needed some extras; they are documented on -[CMA34DBMC](../../CMA34DBMC/). diff --git a/projects/hardware_hacks/level-converter/index.html b/projects/hardware_hacks/level-converter/index.html new file mode 100644 index 00000000000..3acb99d8307 --- /dev/null +++ b/projects/hardware_hacks/level-converter/index.html @@ -0,0 +1,569 @@ + + + + + + + Level Converter | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+
+

This page is archived and is no longer receiving updates.

+

It remains here because some of the content may still be useful.

+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/hardware_hacks/level-converter/index.md b/projects/hardware_hacks/level-converter/index.md deleted file mode 100644 index f401ea5de33..00000000000 --- a/projects/hardware_hacks/level-converter/index.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -archive: true -redirect_from: - - /LevelConverter -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Level Converter - -Most of our gadgets have serial ports that work at 1V8 or 3V3 -single-ended; our serial concentrator expects true RS422 or RS232, at -±12 to ±25V. So we need to provide a level converter/driver to convert -between the low level single-ended signals on the boards, and the -high-level differential voltages for transmission to the serial -concentrator. - -We used the suggested circuit in the -[Manufacturer's Datasheet](http://datasheets.maximintegrated.com/en/ds/MAX218.pdf), laid out on a piece of perfboard. - -Image of Level convertor circuit on prototype board - -

This picture shows one wired to convert a single channel; because most -of our gadgets need only a three-wire interface, you can convert two -channels with one chip. The converter is powered from the gadget: -provide 1V8 or 3V3 depending on the signalling level.

diff --git a/projects/index.html b/projects/index.html index 7d912ec0b9f..65bed999cda 100644 --- a/projects/index.html +++ b/projects/index.html @@ -1,7 +1,11 @@ ---- -redirect_to: / -layout: default -title: Projects -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/l4v/index.html b/projects/l4v/index.html index 7f917922965..1247e6e8c6f 100644 --- a/projects/l4v/index.html +++ b/projects/l4v/index.html @@ -1,5 +1,11 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. -redirect_to: https://sel4.systems/Verification/ ---- + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/microkit/index.html b/projects/microkit/index.html new file mode 100644 index 00000000000..407c356f2b6 --- /dev/null +++ b/projects/microkit/index.html @@ -0,0 +1,698 @@ + + + + + + + The seL4 Microkit | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/microkit/index.md b/projects/microkit/index.md deleted file mode 100644 index 3a16de197fe..00000000000 --- a/projects/microkit/index.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# The seL4 Microkit - -The seL4 Microkit is an operating system framework on top of seL4. It provides a -small set of simple abstractions that ease the design and implementation of -statically structured systems on seL4, leveraging the kernel’s benefits of -security and performance. - -The Microkit is distributed as an SDK that integrates with the build system of -your choice, significantly reducing the barrier to entry for new users of seL4. - -
- - {% include card.html - icon="arrow-right-end-on-rectangle" - title="Tutorial" - body="Learn how to use Microkit and its concepts to make a system." - link="/projects/microkit/tutorial/welcome.html" - %} - - {% include card.html - icon="book-open" - title="Manual" - body="User's manual for the Microkit SDK." - link="/projects/microkit/manual/latest/" - %} - - {% include card.html - icon="arrow-down-tray" - title="Releases" - body="SDK downloads and release notes." - link="/releases/microkit.html" - %} - - {% include card.html - icon="other/github" - title="Sources" - body="If you are planning to make contributions to the Microkit, this is - where to start." - link="https://github.com/seL4/microkit/" - %} - -
- - -The seL4 Microkit is part of the repositories managed by the seL4 Foundation. It -is currently mainly maintained and developed by the Trustworthy Systems research -group at UNSW. See also the [Microkit project page] there. - - -[Microkit project page]: https://trustworthy.systems/projects/microkit diff --git a/projects/microkit/manual/2.0.1/index.html b/projects/microkit/manual/2.0.1/index.html new file mode 100644 index 00000000000..18299689559 --- /dev/null +++ b/projects/microkit/manual/2.0.1/index.html @@ -0,0 +1,2056 @@ + + + + + + + Microkit User Manual (v2.0.1) | seL4 docs + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/microkit/manual/2.0.1/index.md b/projects/microkit/manual/2.0.1/index.md deleted file mode 100644 index 8fd82776b46..00000000000 --- a/projects/microkit/manual/2.0.1/index.md +++ /dev/null @@ -1,1254 +0,0 @@ ---- -parent: /projects/microkit/manual/latest/ -toc: true -SPDX-FileCopyrightText: 2021, Breakaway Consulting Pty. Ltd. -SPDX-License-Identifier: CC-BY-SA-4.0 -mathjax: true ---- - -# Microkit User Manual (v2.0.1) - -This is a web version of the manual, you can find a PDF [here](microkit_user_manual.pdf) as well as in the -SDK at `doc/microkit_user_manual.pdf`. - -## Introduction - -The seL4 Microkit is a small and simple operating system (OS) built on the seL4 microkernel. -Microkit is designed for building system with a *static architecture*. -A static architecture is one where system resources are assigned up-front at system initialisation time. - -### Purpose - -The Microkit is intended to: - -* provide a small and simple OS for a wide range of IoT, cyberphysical and other embedded use cases; -* provide a reasonable degree of application portability appropriate for the targeted use cases; -* make seL4-based systems easy to develop and deploy within the target areas; -* leverage seL4's strong isolation properties to support a near-minimal *trusted computing base* (TCB); -* retain seL4's trademark performance for systems built with it; -* be, in principle, amenable to formal analysis of system safety and security properties (although such analysis is beyond the initial scope). - -### Overview - -A Microkit system is built from a set of individual programs that are isolated from each other, and the system, in *protection domains*. -Protection domains can interact by calling *protected procedures* or sending *notifications*. - -Microkit is distributed as a software development kit (SDK). -The SDK includes the tools, libraries and binaries required to build a Microkit system. -The Microkit source is also available which allows you to customize or extend Microkit and produce your own SDK. - -To build a Microkit system you will write some programs that use `libmicrokit`. -Microkit programs are a little different to a typical process on a Linux-like operating system. -Rather than a single `main` entry point, a program has four distinct entry points: `init`, `notified` and, potentially, `protected`, `fault`. - -The individual programs are combined to produce a single bootable *system image*. -The format of the image is suitable for loading by the target board's bootloader. -The Microkit tool, which is provided as part of the SDK, is used to generate the system image. - -The Microkit tool takes a *system description* as input. -The system description is an XML file that specifies all the objects that make up the system. - -*Note*: Microkit does **not** impose any specific build system; you are free to choose the build system that works best for you. - -### Document Structure - -The [Concepts](#concepts) chapter describes the various concepts that make up Microkit. -It is recommended that you familiarise yourself with these concepts before trying to build a system. - -The [SDK](#sdk) chapter describes the software development kit, including its components and system requirements for use. - -The [Microkit tool](#tool) chapter describes the host system tool used for generating a system image from the system description and user-programs. - -The [libmicrokit](#libmicrokit) chapter describes the interfaces to the Microkit library. - -The [System Description File](#sysdesc) chapter describes the format of the system description XML file. - -The [Board Support Packages](#bsps) chapter describes each of the board support packages included in the SDK. - -The [Rationale](#rationale) chapter documents the rationale for some of the key design choices of in Microkit. - -The [Internals](#internals) chapter documents some of the internal details for how Microkit works. - -## Concepts {#concepts} - -This chapter describes the key concepts provided by Microkit. - -As with any set of concepts there are words that take on special meanings. -This document attempts to clearly describe all of these terms, however as the concepts are inter-related it is sometimes necessary to use a term prior to its formal introduction. - -* [system](#system) -* [protection domain (PD)](#pd) -* [virtual machine (VM)](#vm) -* [memory region](#mr) -* [channel](#channels) -* [protected procedure](#pp) -* [notification](#notification) -* [interrupt](#irq) -* [fault](#fault) - -### System {#system} - -At the most basic level Microkit provides the platform for running a *system* on a specific board. -As a *user* of Microkit you use the platform to create a software system that implements your use case. -The system is described in a declarative configuration file, and the Microkit tool takes this system description as an input and produces an appropriate system image that can be loaded on the target board. - -The key elements that make up a system are *protection domains*, *memory regions* and *channels*. - -### Protection Domains {#pd} - -A **protection domain** (PD) is the fundamental runtime abstraction in Microkit. -It is analogous, but very different in detail, to a process on a UNIX system. - -A PD provides a thread of control that executes within a fixed virtual address space. -The isolation provided by the virtual address space is enforced by the underlying hardware MMU. - -The virtual address space for a PD has mappings for the PD's *program image* along with any memory regions that the PD can access. -The program image is an ELF file containing the code and data which implements the isolated component. - -Microkit supports a maximum of 63 protection domains. - -#### Entry points - -Although a protection domain is somewhat analogous to a process, it has a considerably different program structure and life-cycle. -A process on a typical operating system will have a `main` function which is invoked by the system when the process is created. -When the `main` function returns the process is destroyed. - -By comparison a protection domain has up to four entry points: - -* `init`, `notified` which are required. -* `protected` which is optional. -* `fault` which is required if the PD has children. - -When a Microkit system is booted, all PDs in the system execute the `init` entry point. - -A PD will not execute any other entry point until `init` has finished. - -If a PD is currently executing an entry point, it will not execute any other entry point -until the current entry point has finished. - -The `notified` entry point will be invoked whenever the protection domain receives a *notification* on a *channel*. -The `protected` entry point is invoked when a PD's *protected procedure* is called by another PD. -A PD does not have to provide a protected procedure, therefore the `protected` entry point is optional. - -The `fault` entry point is invoked when a PD that is a child of another PD causes a fault. -A PD does not have to have child PDs, therefore the `fault` entry point is only required for a parent PD. - -These entry points are described in more detail in subsequent sections. - -**Note:** The processing of `init` entry points is **not** synchronised across protection domains. -Specifically, it is possible for a high priority PD's `notified` or `protected` entry point to be called prior to the completion of a low priority PD's `init` entry point. - -The overall computational model for a Microkit system is a set of isolated components reacting to incoming events. - -#### Scheduling - -The PD has a number of scheduling attributes that are configured in the system description: - -* priority (0 -- 254) -* period (microseconds) -* budget (microseconds) -* passive (boolean) - -The budget and period bound the fraction of CPU time that a PD can consume. -Specifically, the **budget** specifies the amount of time for which the PD is allowed to execute. -Once the PD has consumed its budget, it is no longer runnable until the budget is replenished; replenishment happens once every **period** and resets the budget to its initial value. -This means that the maximum fraction of CPU time the PD can consume is $\frac{budget}{period}$. - -The budget cannot be larger than the period. -A budget that equals the period (aka. a "full" budget) behaves like a traditional time slice: After executing for a full period, the PD is preempted and put at the end of the scheduling queue of its priority. In other words, PDs with equal priorities and full budgets are scheduled round-robin with a time slice defined by the period. - -The **priority** determines which of the runnable PDs to schedule. A PD is runnable if one of its entry points has been invoked and it has budget remaining in the current period. -Runnable PDs of the same priority are scheduled in a round-robin manner. - -**Passive** determines whether the PD is passive. A passive PD will have its scheduling context revoked after initialisation and then bound instead to the PD's notification object. This means the PD will be scheduled on receiving a notification, whereby it will run on the notification's scheduling context. When the PD receives a *protected procedure* by another PD or a *fault* caused by a child PD, the passive PD will run on the scheduling context of the callee. - -### Virtual Machines {#vm} - -A *virtual machine* (VM) is a runtime abstraction for running guest operating systems in Microkit. It is similar -to a protection domain in that it provides a thread of control that executes within an isolated virtual address space. - -The main difference between a VM and a PD is that VMs have a higher privilege level such that they may function as a -guest operations and have their own user-space programs at a separate exception level. - -The virtual machine is always a child of a PD. Exceptions caused by the virtual machine are delivered to the parent PD -through the `fault` entry point. - -Each virtual machine has a number of 'virtual CPU's associated with it. Each virtual CPU (vCPU) that belongs to a -virtual machine has its own thread of execution. A vCPU also has an identifier which is used to know which vCPU caused -the invocation of the `fault` entry point. - -The parent PD is responsible for starting and managing the virtual machine. Microkit provides the abstractions in -order to manage the virtual machine through seL4 but there is typically a non-trivial amount -of supporting code/infrastructure to properly start and manage a VM. - -To keep the (potentially untrusted) virtual machine isolated from the rest of the system, Microkit enforces that a -protection domain can only ever manage a single virtual machine. - -### Memory Regions {#mr} - -A *memory region* is a contiguous range of physical memory. -A memory region may have a *fixed* physical address. -For memory regions without a fixed physical address, the physical address is allocated as part of the build process. -Typically, memory regions with a fixed physical address represent memory-mapped device registers. - -Memory regions that are within main memory are zero-initialised. - -The size of a memory region must be a multiple of a supported page size. -The supported page sizes are architecture dependent. -For example, on AArch64 architectures, Microkit support 4KiB and 2MiB pages. -The page size for a memory region may be specified explicitly in the system description. -If page size is not specified, the smallest supported page size is used. - -*Note:* The page size also restricts the alignment of the memory region's physical address. -A fixed physical address must be a multiple of the specified page size. - -A memory region can be *mapped* into one or more protection domains. -The mapping has a number of attributes, which include: - -* the virtual address at which the region is mapped in the PD -* caching attributes (mostly relevant for device memory) -* permissions (read, write and execute) - -**Note:** When a memory region is mapped into multiple protection -domains, the attributes used for different mappings may vary. - -### Channels {#channels} - -A *channel* enables two protection domains to interact using protected procedures or notifications. -Each connects exactly two PDs; there are no multi-party channels. - -When a channel is created between two PDs, a *channel identifier* is configured for each PD. -The *channel identifier* is used by the PD to reference the channel. -Each PD can refer to the channel with a different identifier. -For example if PDs **A** and **B** are connected by a channel, **A** may refer to the channel using an identifier of **37** while **B** may use **42** to refer to the same channel. - -**Note:** There is no way for a PD to directly refer to another PD in the system. -PDs can only refer to other PDs indirectly if there is a channel between them. -In this case, the channel identifier is effectively a proxy identifier for the other PD. -So, to extend the prior example, **A** can indirectly refer to **B** via the channel identifier **37**. -Similarly, **B** can refer to **A** via the channel identifier **42**. - -The system supports a maximum of 63 channels and interrupts per protection domain. - -#### Protected procedures {#pp} - -A protection domain may provide a *protected procedure* (PP) which can be invoked from another protection domain. -Up to 64 words of data may be passed as arguments when calling a protected procedure. -The protected procedure return value may also be up to 64 words. - -When a protection domain calls a protected procedure, the procedure executes within the context of the providing protection domain. - -A protected call is only possible if the callee has strictly higher priority than the caller. -Transitive calls are possible, and as such a PD may call a *protected procedure* in another PD from a `protected` entry point. -However the overall call graph between PDs must form a directed, acyclic graph. -It follows that a PD can not call itself, even indirectly. -For example, `A calls B calls C` is valid (subject to the priority constraint), while `A calls B calls A` is not valid. - -When a protection domain is called, the `protected` entry point is invoked. -The control returns to the caller when the `protected` entry point returns. - -The caller is blocked until the callee returns. -Protected procedures must execute in bounded time. -It is intended that a future version of Microkit will enforce this condition through static analysis. -In the present version the caller must trust the callee to conform. - -In general, PPs are provided by services for use by clients that trust the protection domain to provide that service. - -To call a PP, a PD calls `microkit_ppcall` passing the channel identifier and a *message* structure. -A *message* structure is returned from this function. - -When a PD's protected procedure is invoked, the `protected` entry point is invoked with the channel identifier and message structure passed as arguments. -The `protected` entry point must return a message structure. - -#### Notifications {#notification} - -A notification is a (binary) semaphore-like synchronisation mechanism. -For example, a PD can *notify* another PD to indicate availability of data in a shared memory region if they share a channel. - -To notify another PD, a PD calls `microkit_notify`, passing the channel identifier. -When a PD receives a notification, the `notified` entry point is invoked with the appropriate channel identifier passed as an argument. - -Unlike protected procedures, notifications can be sent in either direction on a channel regardless of priority. - -**Note:** Notifications provide a mechanism for synchronisation between PDs, however this is not a blocking operation. -If a PD notifies another PD, that PD will become scheduled to run (if it is not already), but the current PD does **not** block. -Of course, if the notified PD has a higher priority than the current PD, then the current PD will be preempted (but not blocked) by the other PD. - -Depending on the scheduling, one PD could notify another multiple times without it being scheduled, resulting -in a single execution of the `notified` entry point. For example, if PD A notifies PD B three times on the -same channel without PD B ever executing, once PD B is scheduled it would only see one notification and hence -only enter `notified` once for that channel. - -### Interrupts {#irq} - -Hardware interrupts can be used to notify a protection domain. -The system description specifies if a protection domain receives notifications for any hardware interrupt sources. -Each hardware interrupt is assigned a channel identifier. -In this way the protection domain can distinguish the hardware interrupt from other notifications. -A specific hardware interrupt can only be associated with at most one protection domain. It should be noted that once a -hardware interrupt has been received, it will not be received again until `microkit_irq_ack` is called. The seL4 kernel -will mask the hardware interrupt until it has been acknowledged. - -Microkit does not provides timers, nor any *sleep* API. -After initialisation, activity in the system is initiated by an interrupt causing a `notified` entry point to be invoked. -That notified function may in turn notify or call other protection domains that cause other system activity, but eventually all activity indirectly initiated from that interrupt will complete, at which point the system is inactive again until another interrupt occurs. - -### Faults {#fault} - -Faults such as an invalid memory access or illegal instruction are delivered to the seL4 kernel which then forwards them to -a designated 'fault handler'. By default, all faults caused by protection domains go to the system fault handler which -simply prints out details about the fault in a debug configuration. - -When a protection domain is a child of another protection domain, the designated fault handler for the child is the parent -protection domain. The same applies for a virtual machine. - -This means that whenever a fault is caused by a child, it will be delivered to the parent PD instead of the system fault -handler via the `fault` entry point. It is then up to the parent to decide how the fault is handled. - -The default system fault handler (aka the monitor) has the highest priority and so will -execute and handle faults immediately after they occur. For child PDs that have their faults -delivered to another PD, the fault being handled depends on when the parent PD is scheduled. - -## SDK {#sdk} - -Microkit is distributed as a software development kit (SDK). - -The SDK includes support for one or more *boards*. -Three *configurations* are supported for each board: *debug*, *release*, and *benchmark*. -See [the Configurations section](#config) for more details. - -The SDK contains: - -* Microkit user manual (this document) -* Microkit tool - -Additionally, for each supported board configuration the following are provided: - -* `libmicrokit` -* `loader.elf` -* `kernel.elf` -* `monitor.elf` - -There are also examples provided in the `example` directory. - -The Microkit SDK does **not** provide, nor require, any specific build system. -The user is free to build their system using whatever build system is deemed most appropriate for their specific use case. - -The Microkit tool should be invoked by the system build process to transform a system description (and any referenced program images) into an image file which can be loaded by the target board's bootloader. - -The ELF files provided as program images should be standard ELF files and have been linked against the provided libmicrokit. - -### Configurations {#config} - -### Debug - -The *debug* configuration includes a debug build of the seL4 kernel to allow console debug output using the kernel's UART driver. - -### Release - -The *release* configuration is a release build of the seL4 kernel and is intended for production builds. The loader, monitor, and -kernel do *not* perform any serial output. - -### Benchmark - -The *benchmark* configuration uses a build of the seL4 kernel that exports the hardware's performance monitoring unit (PMU) to PDs. -The kernel also tracks information about CPU utilisation. This benchmark configuration exists due a limitation of the seL4 kernel -and is intended to be removed once [RFC-16 is implemented](https://github.com/seL4/rfcs/pull/22). - -### System Requirements - -The Microkit tool requires Linux (x86-64 or AArch64), macOS (x86-64 or AArch64). - -On Linux, the Microkit tool is statically linked and should run on any distribution. - -On macOS, the Microkit tool should run on macOS 10.12 (Sierra) or higher. - -The Microkit tool does not depend on any additional system binaries. - -## Microkit Tool {#tool} - -The Microkit tool is available in `bin/microkit`. - -The Microkit tool takes as input a system description. -The format of the system description is described in a subsequent chapter. - -Usage: - - microkit [-h] [-o OUTPUT] [-r REPORT] --board [BOARD] --config CONFIG - [--search-path [SEARCH_PATH ...]] system - -The path to the system description file, board to build the system for, and configuration to build for must be provided. - -The search paths provided tell the tool where to find any program images specified in the system description file. - -In the case of errors, a diagnostic message shall be output to `stderr` and a non-zero code returned. - -In the case of success, a loadable image file and a report shall be produced. -The output paths for these can be specified by `-o` and `-r` respectively. -The default output paths are `loader.img` and `report.txt`. - -The loadable image will be a binary that can be loaded by the board's bootloader. - -The report is a plain text file describing important information about the system. -The report can be useful when debugging potential system problems. -This report does not have a fixed format and may change between versions. -It is not intended to be machine readable. - -## Language Support - -There are native APIs for C/C++ and Rust. - -[libmicrokit](#libmicrokit) exports a C API and so can be used in any language -that supports C FFI. - -For Rust, native bindings exist but are not included in the SDK itself. They are -available at [rust-sel4](https://github.com/seL4/rust-sel4). - -## libmicrokit {#libmicrokit} - -All program images should link against `libmicrokit.a`. - -The library provides the C runtime for the protection domain, along with interfaces for the Microkit APIs. - -The component must provide the following functions: - - void init(void); - void notified(microkit_channel ch); - -If the protection domain provides a protected procedure it must also implement: - - microkit_msginfo protected(microkit_channel ch, microkit_msginfo msginfo); - -If the protection domain has children it must also implement: - - seL4_Bool fault(microkit_child child, microkit_msginfo msginfo, - microkit_msginfo *reply_msginfo); - -`libmicrokit` provides the following functions: - - microkit_msginfo microkit_ppcall(microkit_channel ch, microkit_msginfo msginfo); - void microkit_notify(microkit_channel ch); - microkit_msginfo microkit_msginfo_new(seL4_Word label, seL4_Uint16 count); - seL4_Word microkit_msginfo_get_label(microkit_msginfo msginfo); - seL4_Word microkit_msginfo_get_count(microkit_msginfo msginfo); - void microkit_irq_ack(microkit_channel ch); - void microkit_deferred_notify(microkit_channel ch); - void microkit_deferred_irq_ack(microkit_channel ch); - void microkit_pd_restart(microkit_child pd, seL4_Word entry_point); - void microkit_pd_stop(microkit_child pd); - void microkit_mr_set(seL4_Uint8 mr, seL4_Word value); - seL4_Word microkit_mr_get(seL4_Uint8 mr); - void microkit_vcpu_restart(microkit_child vcpu, seL4_Word entry_point); - void microkit_vcpu_stop(microkit_child vcpu); - void microkit_vcpu_arm_inject_irq(microkit_child vcpu, seL4_Uint16 irq, - seL4_Uint8 priority, seL4_Uint8 group, - seL4_Uint8 index); - void microkit_vcpu_arm_ack_vppi(microkit_child vcpu, seL4_Word irq); - seL4_Word microkit_vcpu_arm_read_reg(microkit_child vcpu, seL4_Word reg); - void microkit_vcpu_arm_write_reg(microkit_child vcpu, seL4_Word reg, seL4_Word value); - void microkit_arm_smc_call(seL4_ARM_SMCContext *args, seL4_ARM_SMCContext *response); - - -### `void init(void)` - -Every PD must expose an `init` entry point. -This is called by the system at boot time. - -### `void notified(microkit_channel ch)` - -The `notified` entry point is called by the system when a PD has received a notification on a channel. - -`ch` identifies the channel which has been notified (and indirectly the PD that performed the notification). - -**Note:** `ch` could identify an interrupt. - -Channel identifiers are specified in the system configuration. - -### `microkit_msginfo protected(microkit_channel ch, microkit_msginfo msginfo)` - -The `protected` entry point is optional. -This is invoked when another PD calls `microkit_ppcall` on a channel shared with the PD. - -The `ch` argument identifies the channel on which the PP was invoked. -Indirectly this identifies the PD performing the call. -Channel identifiers are specified in the system configuration. -**Note:** The channel argument is passed by the system and is unforgeable. - -The `msginfo` argument is the argument passed to the PP and is provided by the calling PD. -The contents of the message is up to a pre-arranged protocol between the PDs. -The message contents are opaque to the system. -Note: The message is *copied* from the caller. - -The returned `microkit_msginfo` is the return value of the protected procedure. -As with arguments, this is *copied* to the caller. - -### `seL4_Bool fault(microkit_child child, microkit_msginfo msginfo, microkit_msginfo *reply_msginfo)` - -The `fault` entry point being invoked depends on whether the given PD has children. -It is invoked when a child PD or VM causes a fault. - -The `child` argument identifies the child that caused the fault. - -The `msginfo` argument is given by the seL4 kernel when a fault occurs and contains information -as to what fault occurred. - -The `reply_msginfo` argument is given by libmicrokit and can be used to reply to the fault. - -The returned `seL4_Bool` is whether or not to reply to the fault with the message `reply_msginfo`. -Returning `seL4_True` will reply to the fault. Returning `seL4_False` will not reply to the fault. - -You can use `microkit_msginfo_get_label` on `msginfo` to deduce what kind of fault happened -(for example, whether it was a user exception or a virtual memory fault). - -Whether or not you reply to the fault depends on the type of fault that has occurred and how you want -to handle it. - -To find the full list of possible faults that could occur and details regarding to replying to a particular -kind of fault, please see the 'Faults' section of the -[seL4 reference manual](https://sel4.systems/Info/Docs/seL4-manual-latest.pdf). - -### `microkit_msginfo microkit_ppcall(microkit_channel ch, microkit_msginfo msginfo)` - -Performs a call to a protected procedure in a different PD. -The `ch` argument identifies the protected procedure to be called. -`msginfo` is passed as argument to the protected procedure. -Channel identifiers are specified in the system configuration. - -The protected procedure's return data is returned in the `microkit_msginfo`. - -### `void microkit_notify(microkit_channel ch)` - -Notify the channel `ch`. -Channel identifiers are specified in the system configuration. - -### `void microkit_irq_ack(microkit_channel ch)` - -Acknowledge the interrupt identified by the specified channel. - -### `void microkit_deferred_notify(microkit_channel ch)` - -The same as `microkit_notify` but will instead not actually perform the notify until -the entry point where `microkit_deferred_notify` was called returns. - -It is important to note that only a single 'deferred' API call can be made within the -same entry point. - -The purpose of this API is for performance critical code as this API saves -a kernel system call. - -### `void microkit_deferred_irq_ack(microkit_channel ch)` - -The same as `microkit_irq_ack` but will instead not actually perform the IRQ acknowledge -until the entry point where `microkit_deferred_irq_ack` was called returns. - -It is important to note that only a single 'deferred' API call can be made within the -same entry point. - -The purpose of this API is for performance critical code as this API saves -a kernel system call. - -### `void microkit_pd_restart(microkit_child pd, uintptr_t entry_point)` - -Restart the execution of a child protection domain with ID `pd` at the given `entry_point`. -This will set the program counter of the child protection domain to `entry_point`. - -### `void microkit_pd_stop(microkit_child pd)` - -Stop the execution of the child protection domain with ID `pd`. - -### `microkit_msginfo microkit_msginfo_new(uint64_t label, uint16_t count)` - -Creates a new message structure. - -The message can be passed to `microkit_ppcall` or returned from `protected`. - -### `uint64_t microkit_msginfo_get_label(microkit_msginfo msginfo)` - -Returns the label from a message. - -### `uint64_t microkit_msginfo_get_count(microkit_msginfo msginfo)` - -Returns the count of message registers in the message. - -### `uint64_t microkit_mr_get(uint8_t mr)` - -Get a message register. - -### `void microkit_mr_set(uint8_t mr, uint64_t value)` - -Set a message register. - -### `void microkit_vcpu_restart(microkit_child vcpu, seL4_Word entry_point)` - -Restart the execution of a VM's virtual CPU with ID `vcpu` at the given `entry point`. -This will set the program counter of the vCPU to `entry_point`. - -### `void microkit_vcpu_stop(microkit_child vcpu)` - -Stop the execution of the VM's virtual CPU with ID `vcpu`. - -### `void microkit_vcpu_arm_inject_irq(microkit_child vcpu, seL4_Uint16 irq, -seL4_Uint8 priority, seL4_Uint8 group, -seL4_Uint8 index)` - -Inject a virtual ARM interrupt for a virtual CPU `vcpu` with IRQ number `irq`. -The `priority` (0-31) determines what ARM GIC (generic interrupt controller) -priority level the virtual IRQ will be injected as. The `group` determines whether -the virtual IRQ will be injected into secure world (1) or non-secure world (0). -The `index` is the index of the virtual GIC list register. - -### `void microkit_vcpu_arm_ack_vppi(microkit_child vcpu, seL4_Word irq)` - -Acknowledge a ARM virtual Private Peripheral Interrupt (PPI) with IRQ number `irq` -for a VM's vCPU with ID `vcpu`. - -### `seL4_Word microkit_vcpu_arm_read_reg(microkit_child vcpu, seL4_Word reg)` - -Read a register for a given virtual CPU with ID `vcpu`. The `reg` argument is the index of the -register that is read. The list of registers is defined by the enum `seL4_VCPUReg` -in the seL4 source code. - -### `void microkit_vcpu_arm_write_reg(microkit_child vcpu, seL4_Word reg, seL4_Word value)` - -Write to a register for a given virtual CPU with ID `vcpu`. The `reg` argument is the index of the -register that is written to. The `value` argument is what the register will be set to. -The list of registers is defined by the enum `seL4_VCPUReg` in the seL4 source code. - -### `void microkit_arm_smc_call(seL4_ARM_SMCContext *args, seL4_ARM_SMCContext *response)` - -This API is available only on ARM and only when seL4 has been configured to enable the -`KernelAllowSMCCalls` option. - -The API takes in arguments for a Secure Monitor Call which will be performed by seL4. Any -response values will be placed into the `response` structure. - -The `seL4_ARM_SMCContext` structure contains fields for registers x0 to x7. - -## System Description File {#sysdesc} - -This section describes the format of the System Description File (SDF). - -The system description file is an XML file that is provided as input to the -`microkit` tool. - -The root element of the XML file is `system`. - -Within the `system` root element the following child elements are supported: - -* `protection_domain` -* `memory_region` -* `channel` - -### `protection_domain` - -The `protection_domain` element describes a protection domain. - -It supports the following attributes: - -* `name`: A unique name for the protection domain -* `priority`: The priority of the protection domain (integer 0 to 254). -* `budget`: (optional) The PD's budget in microseconds; defaults to 1,000. -* `period`: (optional) The PD's period in microseconds; must not be smaller than the budget; defaults to the budget. -* `passive`: (optional) Indicates that the protection domain will be passive and thus have its scheduling context removed after initialisation; defaults to false. -* `stack_size`: (optional) Number of bytes that will be used for the PD's stack. - Must be be between 4KiB and 16MiB and be 4K page-aligned. Defaults to 4KiB. -* `smc`: (optional, only on ARM) Allow the PD to give an SMC call for the kernel to perform. Only available when the kernel has been configured with `KernelAllowSMCCalls`. Defaults to false. - -Additionally, it supports the following child elements: - -* `program_image`: (exactly one) Describes the program image for the protection domain. -* `map`: (zero or more) Describes mapping of memory regions into the protection domain. -* `irq`: (zero or more) Describes hardware interrupt associations. -* `setvar`: (zero or more) Describes variable rewriting. -* `protection_domain`: (zero or more) Describes a child protection domain. -* `virtual_machine`: (zero or one) Describes a child virtual machine. - -The `program_image` element has a single `path` attribute describing the path to an ELF file. - -The `map` element has the following attributes: - -* `mr`: Identifies the memory region to map. -* `vaddr`: Identifies the virtual address at which to map the memory region. -* `perms`: Identifies the permissions with which to map the memory region. Can be a combination of `r` (read), `w` (write), and `x` (eXecute), with the exception of a write-only mapping (just `w`). -* `cached`: (optional) Determines if mapped with caching enabled or disabled. Defaults to `true`. -* `setvar_vaddr`: (optional) Specifies a symbol in the program image. This symbol will be rewritten with the virtual address of the memory region. -* `setvar_size`: (optional) Specifies a symbol in the program image. This symbol will be rewritten with the size of the memory region. - -The `irq` element has the following attributes: - -* `irq`: The hardware interrupt number. -* `id`: The channel identifier. Must be at least 0 and less than 63. -* `trigger`: (optional) Whether the IRQ is edge triggered ("edge") or level triggered ("level"). Defaults to "level". - -The `setvar` element has the following attributes: - -* `symbol`: Name of a symbol in the ELF file. -* `region_paddr`: Name of an MR. The symbol's value shall be updated to this MR's physical address. - -The `protection_domain` element has the same attributes as any other protection domain as well as: - -* `id`: The ID of the child for the parent to refer to. - -The `virtual_machine` element has the following attributes: - -* `name`: A unique name for the virtual machine -* `priority`: The priority of the virtual machine (integer 0 to 254). -* `budget`: (optional) The VM's budget in microseconds; defaults to 1,000. -* `period`: (optional) The VM's period in microseconds; must not be smaller than the budget; defaults to the budget. - -Additionally, it supports the following child elements: - -* `vcpu`: (one or more) Describes the virtual CPU that will be tied to the virtual machine. -* `map`: (zero or more) Describes mapping of memory regions into the virtual machine. - -The `vcpu` element has a single `id` attribute defining the identifier used for the virutal machine's vCPU. - -The `map` element has the same attributes as the protection domain with the exception of `setvar_vaddr`. - -### `memory_region` - -The `memory_region` element describes a memory region. - -It supports the following attributes: - -* `name`: A unique name for the memory region -* `size`: Size of the memory region in bytes (must be a multiple of the page size) -* `page_size`: (optional) Size of the pages used in the memory region; must be a supported page size if provided. Defaults to the largest page size for the target architecture that the memory region is aligned to. -* `phys_addr`: (optional) The physical address for the start of the memory region (must be a multiple of the page size). - -The `memory_region` element does not support any child elements. - -#### Page sizes by architecture - -Below are the available page sizes for each architecture that Microkit supports. - -##### AArch64 - -* 0x1000 (4KiB) -* 0x200000 (2MiB) - -##### RISC-V 64-bit - -* 0x1000 (4KiB) -* 0x200000 (2MiB) - -### `channel` - -The `channel` element has exactly two `end` children elements for specifying the two PDs associated with the channel. - -The `end` element has the following attributes: - -* `pd`: Name of the protection domain for this end. -* `id`: Channel identifier in the context of the named protection domain. Must be at least 0 and less than 63. -* `pp`: (optional) Indicates that the protection domain for this end can perform a protected procedure call to the other end; defaults to false. - Protected procedure calls can only be to PDs of strictly higher priority. -* `notify`: (optional) Indicates that the protection domain for this end can send a notification to the other end; defaults to true. - -The `id` is passed to the PD in the `notified` and `protected` entry points. -The `id` should be passed to the `microkit_notify` and `microkit_ppcall` functions. - -## Board Support Packages {#bsps} - -This chapter describes the board support packages that are available in the SDK. - -### Ariane (CVA6) {#ariane} - -Initial support is available for the CVA6 (formerly Ariane) core design -on the Digilent Genesys2 board. CVA6 is an open-source RISC-V (rv64i) processor. - -Microkit support expects that a compatible RISC-V SBI (e.g OpenSBI) has executed before -jumping to the beginning of the loader image. - -Note that the loader link address is 0x90000000 and this is where the binary must -be located and where OpenSBI (or U-Boot) should begin execution. - -You may compile OpenSBI with the Microkit image as a payload, or alternately install -OpenSBI (with U-Boot optionally) to the SD card. - -If you are booting from U-Boot, use the following command to start the system image: - => go 0x90000000 - -Note that the OpenSBI version from the CVA6 SDK at the time of writing has issues when -booting. It is recommended to use the mainline OpenSBI. - -### Cheshire {#cheshire} - -Support is available for [Cheshire](https://github.com/pulp-platform/cheshire). -It is an SoC design based on the CVA6 core, implementing a 64-bit RISC-V CPU. - -Microkit outputs a raw binary for this device. Several steps are required in order to boot. - -A custom version of OpenSBI is required. It can be found -[here](https://github.com/pulp-platform/opensbi/tree/cheshire). -Build the firmware payload using platform `fpga/cheshire`. - -#### Using U-Boot - -With a system pre-configured with the Cheshire ZSBL, OpenSBI and U-boot: - - => go 0x90000000 - -#### Raw systerm with no bootloader - -Without any firmware present on the SD card, it is still possible to boot Cheshire with a Microkit system. - -Using a GDB prompt via openOCD: - -1. Reset board - - => monitor reset halt - -2. Load a device tree blob (DTS available in Cheshire repo or seL4) to memory and set the a0 and a1 registers to point at it: - - > restore /path/to/cheshire.dtb binary 0xa0000000 - -(tell OpenSBI where DTB is) - - > set $a0=0xa0000000 - -(tell OpenSBI that the default hart is #0) - - > set $a1=0 - -3. Load OpenSBI - - > load /path/to/opensbi/fw_payload.elf - -4. Allow OpenSBI to boot, and interrupt it once the line `Test payload running` is emitted on serial. - - > continue - -(wait for output) - - > (Ctrl+C) - -5. Load Microkit image and execute - - > restore /path/to/loader.img binary 0x90000000 - -(execute) - - > continue - -### i.MX8MM-EVK {#imx8mm_evk} - -Microkit produces a raw binary file, so when using U-Boot you must execute the image using: - - => go 0x41000000 - -### i.MX8MP-EVK {#imx8mp_evk} - -Microkit produces a raw binary file, so when using U-Boot you must execute the image using: - - => go 0x41000000 - -### i.MX8MQ-EVK {#imx8mq_evk} - -Microkit produces a raw binary file, so when using U-Boot you must execute the image using: - - => go 0x41000000 - -### MaaXBoard {#maaxboard} - -The MaaXBoard is a low-cost ARM SBC based on the NXP i.MX8MQ system-on-chip. - -Microkit produces a raw binary file, so when using U-Boot you must execute the image using: - - => go 0x50000000 - -### Odroid-C2 {#odroidc2} - -The HardKernel Odroid-C2 is an ARM SBC based on the Amlogic Meson S905 system-on-chip. It -should be noted that the Odroid-C2 is no longer available for purchase but its successor, -the Odroid-C4, is readily available at the time of writing. - -Microkit produces a raw binary file, so when using U-Boot you must execute the image using: - - => go 0x20000000 - -### Odroid-C4 {#odroidc4} - -The HardKernel Odroid-C4 is an ARM SBC based on the Amlogic Meson S905X3 system-on-chip. - -Microkit produces a raw binary file, so when using U-Boot you must execute the image using: - - => go 0x20000000 - -### QEMU virt (AArch64) {#qemu_virt_aarch64} - -Support is available for the virtual AArch64 QEMU platform. This is a platform that is not based -on any specific SoC or hardware platform and is intended for simulating systems for -development or testing. - -It should be noted that the platform support is configured with 2GB of main memory and a single -Cortex-A53 CPU. - -You can use the following command to simulate a Microkit system: - - $ qemu-system-aarch64 \ - -machine virt,virtualization=on \ - -cpu cortex-a53 \ - -nographic \ - -serial mon:stdio \ - -device loader,file=[SYSTEM IMAGE],addr=0x70000000,cpu-num=0 \ - -m size=2G - -You can find more about the QEMU virt platform in the -[QEMU documentation](https://www.qemu.org/docs/master/system/target-arm.html). - -### QEMU virt (RISC-V 64-bit) {#qemu_virt_riscv64} - -Support is available for the virtual RISC-V (64-bit) QEMU platform. -This is a platform that is not based on any specific SoC or hardware platform -and is intended for simulating systems for development or testing. - -It should be noted that the platform support is configured with 2GB of main memory. - -You can use the following command to simulate a Microkit system: - - $ qemu-system-riscv64 \ - -machine virt \ - -nographic \ - -serial mon:stdio \ - -kernel [SYSTEM IMAGE] \ - -m size=2G - -QEMU will start the system image using its packaged version of OpenSBI. - -You can find more about the QEMU virt platform in the -[QEMU documentation](https://www.qemu.org/docs/master/system/target-riscv.html). - -### Raspberry Pi 4B {#rpi4b_1gb} - -Support is available for the Raspberry Pi 4 Model B. There are multiple models of the -Rasberry Pi 4B that have different amounts of RAM, we target the 1GB model in Microkit. -If you require more than 1GB, please file an issue or pull request to add support for -models with larger amounts of memory. - -For initial board setup, please see the instructions on the -[seL4 website](https://docs.sel4.systems/Hardware/Rpi4.html). - -When getting into the U-Boot console you want to load the Microkit binary image to -address 0x10000000 and then run `go 0x10000000`. - -For example, if you were to load the image via the MMC you would run the following -U-Boot commands: - - => fatload mmc 0 0x10000000 - => go 0x10000000 - -### Pine64 ROCKPro64 {#rockpro64} - -Microkit produces a raw binary file, so when using U-Boot you must execute the image using: - - => go 0x30000000 - -### Pine64 Star64 {#star64} - -Support is available for the Pine64 Star64 platform which is based on the -StarFive JH7110 SoC. - -The platform has a 4GB and 8GB model, we assume the 4GB model. - -The default boot flow of the Star64 is: -1. OpenSBI -2. U-Boot -3. Operating System - -This means that the system image that Microkit produces does not need to be explicitly -packaged with an SBI implementation such as OpenSBI. - -To execute the system image produced by Microkit, execute the following command in U-Boot: - - => go 0x60000000 - -### TQMa8XQP 1GB {#tqma8xqp1gb} - -The TQMa8XQP is a system-on-module designed by TQ-Systems GmbH. -The modules incorporates an NXP i.MX8X Quad Plus system-on-chip and 1GiB ECC memory. - -TQ-Systems provide the MBa8Xx carrier board for development purposes. -The instructions provided assume the use of the MBa8Xx carrier board. -If you are using a different carrier board please refer to the appropriate documentation. - -Note: There are different configured of the TQMa8Xx board which include different NXP SoCs -and different memory configurations. Such modules are not supported. - -The MBa8Xx provides access to the TQMa8XQP UART via UART-USB bridge. -To access the UART connect a USB micro cable to port **X13**. -The UART-USB bridge supports 4 individual UARTs; the UART is connected to the 2nd port. - -By default the SoM will autoboot using U-Boot. -Hit any key during the boot process to stop the autoboot. - -A new board will autoboot to Linux. -You will likely want to disable autoboot: - - => env set bootdelay -1 - => env save - -The board can be reset by pressing switch **S4** (located next to the Ethernet port). -Alternatively, you can use the `reset` command from the U-Boot prompt. - -During development the most convenient way to boot a Microkit image is via network booting. -U-Boot support booting via the *tftp* protocol. -To support this you'll want to configure the network. -U-Boot supports DHCP, however it is often more reliable to explicitly set an IP address. -For example: - - => env set ipaddr 10.1.1.2 - => env set netmask 255.255.255.0 - => env set serverip 10.1.1.1 - => env save - -To use tftp you also need to set the file to load and the memory address to load it to: - - => env set bootfile loader.img - => env set loadaddr 0x80280000 - => env save - -The system image generated by the Microkit tool is a raw binary file. - -An example sequence of commands for booting is: - - => tftpboot - => dcache flush - => icache flush - => go ${loadaddr} - -Rather than typing these each time you can create a U-Boot script: - - => env set microkit 'tftpboot; dcache flush; icache flush; go ${loadaddr}' - => env save - => run microkit - -When debugging is enabled the kernel will use the same UART as U-Boot. - -### ZCU102 {#zcu102} - -The ZCU102 can run on a physical board or on an appropriate QEMU based emulator. - -Microkit produces a raw binary file, so when using U-Boot you must execute the image using: - - => go 0x40000000 - -For simulating the ZCU102 using QEMU, use the following command: - - $ qemu-system-aarch64 \ - -m size=4G \ - -machine xlnx-zcu102,virtualization=on \ - -nographic \ - -device loader,file=[SYSTEM IMAGE],addr=0x40000000,cpu-num=0 \ - -serial mon:stdio - -It should be noted that when using U-Boot to load and run a Microkit system image, -that there may be additional setup needed. - -For the ZynqMP class of platforms, which the ZCU102 is apart of, U-Boot does not start -the Microkit system Exception Level 2 (EL2) which is necessary for Microkit to start -(this is because seL4 is configured as a hypervisor). - -You can see that when using the `go` command, U-Boot is -[unconditionally always dropping down to EL1](https://github.com/u-boot/u-boot/blob/8937bb265a7f2251c1bd999784a4ef10e9c6080d/board/xilinx/zynqmp/zynqmp.c#L234). - -To avoid this behaviour, the call to `armv8_switch_to_el1` should be replaced with -`armv8_switch_to_el2` in this `do_go_exec` function. - -### Adding Platform Support - -The following section is a guide for adding support for a new platform to Microkit. - -#### Prerequisites - -Before you can start with adding platform support to Microkit, the platform must be supported by the seL4 kernel. -You can find information on how to do so [here](https://docs.sel4.systems/projects/sel4/porting.html). - -#### Getting Microkit Components Working - -The first step to adding Microkit support is to modify the `build_sdk.py` script in order to build the required -artefacts for the new platform. This involves adding to the `SUPPORTED_BOARDS` list with the `BoardInfo` options -containing the platform specific attributes. This should be fairly self-explanatory by looking at the existing -entries with the exception of the `loader_link_address`. - -The `loader_link_address` parameter specifies the physical address of where the bootloader for Microkit (which -is responsible for setting up the system before seL4 starts) is going to be loaded. This address needs to -match where in main memory the final system image is actually loaded (e.g where a previous bootloader such as U-Boot -loads the image to). This means that the address is restricted to the platform's main memory region. - -The other component of Microkit that is platform dependent is the loader itself. The loader will attempt to access -the UART for debug output which requires a basic `putc` implementation. The UART device used in the loader should be -the same as what is used for the seL4 kernel debug output. - -It should be noted that on RISC-V platforms, the SBI will be used for `putc` so no porting is necessary. - -Once you have patched the loader and the SDK build script, there should be no other changes required to have a working -platform port. It is a good idea at this point to boot a hello world system to confirm the port is working. - -If there are issues with porting the platform, please [open an issue on GitHub](https://github.com/sel4/microkit). - -#### Contributing Platform Support - -Once you believe that the port works, you can [open a pull request](https://github.com/seL4/microkit/pulls) with required -changes as well as documentation in the manual about the platform and how to run Microkit images on it. - -## Rationale - -This section describes the rationales driving the Microkit design choices. - -### Overview - -The seL4 microkernel provides a set of powerful and flexible mechanisms that can be used for building almost arbitrary systems. -While minimising constraints on the nature of system designs and scope of deployments, this flexibility makes it challenging to design the best system for a particular use case, requiring extensive seL4 experience from developers. - -The Microkit addresses this challenge by constraining the -system architecture to one that provides enough features and power for -its target usage class (IoT, cyberphysical and other embedded systems -with a static architecture), enabling a much simpler set of developer-visible abstractions. - -### Protection Domains - -PDs are single-threaded to keep the programming model and implementations simple, and because this serves the needs of most present use cases in the target domains. -Extending the model to multithreaded applications (clients) is straightforward and can be done if needed. -Extending to multithreaded services is possible but requires additional infrastructure for which we see no need in the near future. - -### Protected Procedure Priorities - -The restriction of only calling to higher priority prevents deadlocks and reflects the notion that the callee operates on behalf of the caller, and it should not be possible to preempt execution of the callee unless the caller could be preempted as well. - -This greatly simplifies reasoning about real-time properties in the system; in particular, it means that PPs can be used to implement *resource servers*, where shared resources are encapsulated in a component that ensures mutual exclusion, while avoiding unbounded priority inversions through the *immediate priority ceiling protocol*. - -While it would be possible to achieve the same by allowing PPs between PDs of the same priority, this would be much harder to statically analyse for loop-freedom (and thus deadlock-freedom). -The drawback is that we waste a part of the priority space where a logical entity is split into multiple PDs, eg to separate out a particularly critical component to formally verify it, when the complete entity would be too complex for formal verification. -For the kinds of systems targeted by the Microkit, this reduction of the usable priority space is unlikely to cause problems. - -### Protected Procedure Argument Size - -The limitation on the size of by-value arguments is forced by the (architecture-dependent) limits on the payload size of the underlying seL4 operations, as well as by efficiency considerations. -The protected procedure payload should be considered as analogous to function arguments in the C language; similar limitations exist in the C ABIs (Application Binary Interfaces) of various platforms. - -### Limits - -The limitation on the number of protection domains in the system is relatively arbitrary. -Based on experience with the system and the types of systems being built it is possible for this to be increased in the future. - -The limitation on the number of channels for a protection domain is based on the size of the notification word in seL4. -Changing this to be larger than 64 would most likely require changes to seL4. The reason for why the limit is not a -power of two is due to part of the notification word being for internal libmicrokit use. - -## Internals - -The following section describes internal details for how the Microkit works -and all the components of Microkit. As a user of Microkit, it is not necessary -know this information, however, there is no harm in having a greater -understanding of the tools that you are using. - -![Microkit flow](assets/microkit_flow.svg) - -The diagram above aims to show the general flow of a Microkit system from -build-time to run-time. - -The user provides the SDF (System Description File) and the ELFs that -correspond to PD program images to the Microkit tool which is responsible to -for packaging everything together into a single bootable image for the target -platform. - -This final image contains a couple different things: - -* the Microkit loader -* seL4 -* the Monitor (and associated invocation data) -* the images for all the user's PDs - -When booting the image, the Microkit loader starts, jumps to the kernel, which -starts the monitor, which then sets up the entire system and starts all the PDs. - -Now, we will go into a bit more detail about each of these stages of the -booting process as well as what exactly the Microkit tool is doing. - -### Loader - -The loader starts first, it has two main jobs: - -1. Unpack all the parts of the system (kernel, monitor, PD images, etc) into - their expected locations within main memory. -2. Finish initialising the hardware such that the rest of the system can start. - -Unpacking the system image is fairly straight-forward, as all the information -about what parts of the system image need to go where is figured out by the -tool and embedded into the loader at build-time so when it starts it just goe -through an array and copies data into the right locations. - -Before the Microkit loader starts, there would most likely have been some other -bootloader such as U-Boot or firmware on the target that did its own hardware -initialisation before starting Microkit. - -However, there are certain things that seL4 expects to be initialised -that will not be done by a previous booting stage, such as: - -* changing to the right exception level -* enabling the MMU (seL4 expects the MMU to be on when it starts) -* interrupt controller setup - -Once this is all completed, the loader jumps to seL4 which starts executing. -The loader will never be executed again. - -### Monitor - -Once the kernel has done its own initialisation, it will begin the -'initial task'. On seL4, this is a thread that contains all the initial -capabilities to resources that are used to setup the rest of the system. - -Within a Microkit environment, we call the initial task the 'monitor'. - -The monitor has two main jobs: - -1. Setup all system resources (memory regions, channels, interrupts) and start - the user's protection domains. -2. Receive any faults caused by protection domains crashing or causing - exceptions. - -At build-time, the Microkit tool embeds all the system calls that the monitor -needs to make in order to setup the user's system. More details about *how* -this is done is in the section on the Microkit tool below. But from the -monitor's perspective, it just iterates over an array of system calls to make -and performs each one. - -After the system has been setup, the monitor goes to sleep and waits for any -faults from protection domains. On debug mode, this results in a message about -which PD caused an exception and details on the PD's state at the time of the fault. - -Other than printing fault details, the monitor does not do anything to handle -the fault, it will simply go back to sleep waiting for any other faults. - -### libmicrokit {#libmicrokit_internals} - -Unlike the previous sections, libmicrokit is not its own program but it is worth -a mention since it makes up the core of each protection domain in a system. - -When each PD starts, we enter libmicrokit's starting point which does some initial -setup and calls the `init` entry point specified by the user. Once that completes, -the PD will enter libmicrokit's event handler which sleeps until it receives events. - -These events could be notifies (from other PDs or from an interrupt), PPCs, and faults. -For each event, the appropriate user-specified entry point is called and then when it -returns the PD goes back to sleep, waiting on any more events. - -### Microkit tool - -The Microkit tool's ultimate job is to take in the description of the user's system, -the SDF, and convert into an seL4 system that boots and executes. - -There are obvious steps such as parsing the SDF and PD ELFs but the majority of -the work done by the tool is converting the system description into a list of -seL4 system calls that need to happen. - -In order to do this however, the Microkit tool needs to perform o a decent amount of -'emulation' to know exactly what system calls and with which arguments to make. -This requires keeping track of what memory is allocated and where, the layout of -each capability space, what the initial untypeds list will look like, etc. - -While this is non-trivial to do, it comes with the useful property that if the tool -produces a valid image, there should be no errors upon initialising the system -If there are any errors with configuring the system (e.g running out of memory), -they will be caught at build-time. This can only reasonably be done due to the -static-architecture of Microkit systems. diff --git a/projects/microkit/manual/2.1.0/index.html b/projects/microkit/manual/2.1.0/index.html new file mode 100644 index 00000000000..f56fa245305 --- /dev/null +++ b/projects/microkit/manual/2.1.0/index.html @@ -0,0 +1,2641 @@ + + + + + + + Microkit User Manual (v2.1.0) | seL4 docs + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/microkit/manual/2.1.0/index.md b/projects/microkit/manual/2.1.0/index.md deleted file mode 100644 index caf06466a10..00000000000 --- a/projects/microkit/manual/2.1.0/index.md +++ /dev/null @@ -1,1785 +0,0 @@ ---- -parent: /projects/microkit/manual/latest/ -toc: true -SPDX-FileCopyrightText: 2021, Breakaway Consulting Pty. Ltd. -SPDX-License-Identifier: CC-BY-SA-4.0 -mathjax: true ---- - -# Microkit User Manual (v2.1.0) - -This is a web version of the manual, you can find a PDF [here](microkit_user_manual.pdf) as well as in the -SDK at `doc/microkit_user_manual.pdf`. - -## Introduction - -The seL4 Microkit is a small and simple operating system (OS) built on the seL4 microkernel. -Microkit is designed for building system with a *static architecture*. -A static architecture is one where system resources are assigned up-front at system initialisation time. - -### Purpose - -The Microkit is intended to: - -* provide a small and simple OS for a wide range of IoT, cyberphysical and other embedded use cases; -* provide a reasonable degree of application portability appropriate for the targeted use cases; -* make seL4-based systems easy to develop and deploy within the target areas; -* leverage seL4's strong isolation properties to support a near-minimal *trusted computing base* (TCB); -* retain seL4's trademark performance for systems built with it; -* be, in principle, amenable to formal analysis of system safety and security properties (although such analysis is beyond the initial scope). - -### Overview - -A Microkit system is built from a set of individual programs that are isolated from each other, and the system, in *protection domains*. -Protection domains can interact by calling *protected procedures* or sending *notifications*. - -Microkit is distributed as a software development kit (SDK). -The SDK includes the tools, libraries and binaries required to build a Microkit system. -The Microkit source is also available which allows you to customize or extend Microkit and produce your own SDK. - -To build a Microkit system you will write some programs that use `libmicrokit`. -Microkit programs are a little different to a typical process on a Linux-like operating system. -Rather than a single `main` entry point, a program has four distinct entry points: `init`, `notified` and, potentially, `protected`, `fault`. - -On ARM and RISC-V, the individual programs are combined to produce a single bootable *system image*. -The format of the image is suitable for loading by the target board's bootloader. - -On x86-64, there are two ELF images invovled. One for the seL4 kernel, and one for the initialiser that -setups up the Microkit system. These are loaded by a Multiboot 2 compliant bootloader. - -The Microkit tool, which is provided as part of the SDK, is used to generate the system image(s). - -The Microkit tool takes a *system description* as input. -The system description is an XML file that specifies all the objects that make up the system. - -*Note*: Microkit does **not** impose any specific build system; you are free to choose the build system that works best for you. - -### Document Structure - -The [Concepts](#concepts) chapter describes the various concepts that make up Microkit. -It is recommended that you familiarise yourself with these concepts before trying to build a system. - -The [SDK](#sdk) chapter describes the software development kit, including its components and system requirements for use. - -The [Microkit tool](#tool) chapter describes the host system tool used for generating a system image from the system description and user-programs. - -The [libmicrokit](#libmicrokit) chapter describes the interfaces to the Microkit library. - -The [System Description File](#sysdesc) chapter describes the format of the system description XML file. - -The [Board Support Packages](#bsps) chapter describes each of the board support packages included in the SDK. - -The [Rationale](#rationale) chapter documents the rationale for some of the key design choices of Microkit. - -The [Internals](#internals) chapter documents some of the internal details for how Microkit works. - -## Concepts {#concepts} - -This chapter describes the key concepts provided by Microkit. - -As with any set of concepts there are words that take on special meanings. -This document attempts to clearly describe all of these terms, however as the concepts are inter-related it is sometimes necessary to use a term prior to its formal introduction. - -* [system](#system) -* [protection domain (PD)](#pd) -* [virtual machine (VM)](#vm) -* [memory region](#mr) -* [channel](#channels) -* [protected procedure](#pp) -* [notification](#notification) -* [interrupt](#irq) -* [fault](#fault) -* [ioport](#ioport) - -### System {#system} - -At the most basic level Microkit provides the platform for running a *system* on a specific board. -As a *user* of Microkit you use the platform to create a software system that implements your use case. -The system is described in a declarative configuration file, and the Microkit tool takes this system description as an input and produces an appropriate system image that can be loaded on the target board. - -The key elements that make up a system are *protection domains*, *memory regions* and *channels*. - -### Protection Domains {#pd} - -A **protection domain** (PD) is the fundamental runtime abstraction in Microkit. -It is analogous, but very different in detail, to a process on a UNIX system. - -A PD provides a thread of control that executes within a fixed virtual address space. -The isolation provided by the virtual address space is enforced by the underlying hardware MMU. - -The virtual address space for a PD has mappings for the PD's *program image* along with any memory regions that the PD can access. -The program image is an ELF file containing the code and data which implements the isolated component. - -Microkit supports a maximum of 63 protection domains. - -#### Entry points - -Although a protection domain is somewhat analogous to a process, it has a considerably different program structure and life-cycle. -A process on a typical operating system will have a `main` function which is invoked by the system when the process is created. -When the `main` function returns the process is destroyed. - -By comparison a protection domain has up to four entry points: - -* `init`, `notified` which are required. -* `protected` which is optional. -* `fault` which is required if the PD has children. - -When a Microkit system is booted, all PDs in the system execute the `init` entry point. - -A PD will not execute any other entry point until `init` has finished. - -If a PD is currently executing an entry point, it will not execute any other entry point -until the current entry point has finished. - -The `notified` entry point will be invoked whenever the protection domain receives a *notification* on a *channel*. -The `protected` entry point is invoked when a PD's *protected procedure* is called by another PD. -A PD does not have to provide a protected procedure, therefore the `protected` entry point is optional. - -The `fault` entry point is invoked when a PD that is a child of another PD causes a fault. -A PD does not have to have child PDs, therefore the `fault` entry point is only required for a parent PD. - -These entry points are described in more detail in subsequent sections. - -**Note:** The processing of `init` entry points is **not** synchronised across protection domains. -Specifically, it is possible for a high priority PD's `notified` or `protected` entry point to be called prior to the completion of a low priority PD's `init` entry point. - -The overall computational model for a Microkit system is a set of isolated components reacting to incoming events. - -#### Scheduling - -The PD has a number of scheduling attributes that are configured in the system description: - -* priority (0 -- 254) -* period (microseconds) -* budget (microseconds) -* passive (boolean) - -The budget and period bound the fraction of CPU time that a PD can consume. -Specifically, the **budget** specifies the amount of time for which the PD is allowed to execute. -Once the PD has consumed its budget, it is no longer runnable until the budget is replenished; replenishment happens once every **period** and resets the budget to its initial value. -This means that the maximum fraction of CPU time the PD can consume is $\frac{budget}{period}$. - -The budget cannot be larger than the period. -A budget that equals the period (aka. a "full" budget) behaves like a traditional time slice: After executing for a full period, the PD is preempted and put at the end of the scheduling queue of its priority. In other words, PDs with equal priorities and full budgets are scheduled round-robin with a time slice defined by the period. - -The **priority** determines which of the runnable PDs to schedule. A PD is runnable if one of its entry points has been invoked and it has budget remaining in the current period. -Runnable PDs of the same priority are scheduled in a round-robin manner. - -**Passive** determines whether the PD is passive. A passive PD will have its scheduling context revoked after initialisation and then bound instead to the PD's notification object. This means the PD will be scheduled on receiving a notification, whereby it will run on the notification's scheduling context. When the PD receives a *protected procedure* by another PD or a *fault* caused by a child PD, the passive PD will run on the scheduling context of the callee. - -### Virtual Machines {#vm} - -A *virtual machine* (VM) is a runtime abstraction for running guest operating systems in Microkit. It is similar -to a protection domain in that it provides a thread of control that executes within an isolated virtual address space. - -The main difference between a VM and a PD is that VMs have a higher privilege level such that they may function as a -guest operations and have their own user-space programs at a separate exception level. - -The virtual machine is always a child of a PD. Exceptions caused by the virtual machine are delivered to the parent PD -through the `fault` entry point. - -Each virtual machine has a number of 'virtual CPU's associated with it. Each virtual CPU (vCPU) that belongs to a -virtual machine has its own thread of execution. A vCPU also has an identifier which is used to know which vCPU caused -the invocation of the `fault` entry point. - -The parent PD is responsible for starting and managing the virtual machine. Microkit provides the abstractions in -order to manage the virtual machine through seL4 but there is typically a non-trivial amount -of supporting code/infrastructure to properly start and manage a VM. - -To keep the (potentially untrusted) virtual machine isolated from the rest of the system, Microkit enforces that a -protection domain can only ever manage a single virtual machine. - -### Memory Regions {#mr} - -A *memory region* is a contiguous range of physical memory. -A memory region may have a *fixed* physical address. -For memory regions without a fixed physical address, the physical address is allocated as part of the build process. -Typically, memory regions with a fixed physical address represent memory-mapped device registers. - -Memory regions that are within main memory are zero-initialised. - -The size of a memory region must be a multiple of a supported page size. -The supported page sizes are architecture dependent. -For example, on AArch64 architectures, Microkit support 4KiB and 2MiB pages. -The page size for a memory region may be specified explicitly in the system description. -If page size is not specified, the largest supported page size is used. - -*Note:* The page size also restricts the alignment of the memory region's physical address. -A fixed physical address must be a multiple of the specified page size. - -A memory region can be *mapped* into one or more protection domains. -The mapping has a number of attributes, which include: - -* the virtual address at which the region is mapped in the PD -* caching attributes (mostly relevant for device memory) -* permissions (read, write and execute) - -**Note:** When a memory region is mapped into multiple protection -domains, the attributes used for different mappings may vary. - -### Channels {#channels} - -A *channel* enables two protection domains to interact using protected procedures or notifications. -Each connects exactly two PDs; there are no multi-party channels. - -When a channel is created between two PDs, a *channel identifier* is configured for each PD. -The *channel identifier* is used by the PD to reference the channel. -Each PD can refer to the channel with a different identifier. -For example if PDs **A** and **B** are connected by a channel, **A** may refer to the channel using an identifier of **37** while **B** may use **42** to refer to the same channel. - -**Note:** There is no way for a PD to directly refer to another PD in the system. -PDs can only refer to other PDs indirectly if there is a channel between them. -In this case, the channel identifier is effectively a proxy identifier for the other PD. -So, to extend the prior example, **A** can indirectly refer to **B** via the channel identifier **37**. -Similarly, **B** can refer to **A** via the channel identifier **42**. - -The system supports a maximum of 63 channels and interrupts per protection domain. - -#### Protected procedures {#pp} - -A protection domain may provide a *protected procedure* (PP) which can be invoked from another protection domain. -Up to 64 words of data may be passed as arguments when calling a protected procedure. -The protected procedure return value may also be up to 64 words. - -When a protection domain calls a protected procedure, the procedure executes within the context of the providing protection domain. - -A protected call is only possible if the callee has strictly higher priority than the caller. -Transitive calls are possible, and as such a PD may call a *protected procedure* in another PD from a `protected` entry point. -However the overall call graph between PDs must form a directed, acyclic graph. -It follows that a PD can not call itself, even indirectly. -For example, `A calls B calls C` is valid (subject to the priority constraint), while `A calls B calls A` is not valid. - -When a protection domain is called, the `protected` entry point is invoked. -The control returns to the caller when the `protected` entry point returns. - -The caller is blocked until the callee returns. -Protected procedures must execute in bounded time. -It is intended that a future version of Microkit will enforce this condition through static analysis. -In the present version the caller must trust the callee to conform. - -In general, PPs are provided by services for use by clients that trust the protection domain to provide that service. - -To call a PP, a PD calls `microkit_ppcall` passing the channel identifier and a *message* structure. -A *message* structure is returned from this function. - -When a PD's protected procedure is invoked, the `protected` entry point is invoked with the channel identifier and message structure passed as arguments. -The `protected` entry point must return a message structure. - -#### Notifications {#notification} - -A notification is a (binary) semaphore-like synchronisation mechanism. -For example, a PD can *notify* another PD to indicate availability of data in a shared memory region if they share a channel. - -To notify another PD, a PD calls `microkit_notify`, passing the channel identifier. -When a PD receives a notification, the `notified` entry point is invoked with the appropriate channel identifier passed as an argument. - -Unlike protected procedures, notifications can be sent in either direction on a channel regardless of priority. - -**Note:** Notifications provide a mechanism for synchronisation between PDs, however this is not a blocking operation. -If a PD notifies another PD, that PD will become scheduled to run (if it is not already), but the current PD does **not** block. -Of course, if the notified PD has a higher priority than the current PD, then the current PD will be preempted (but not blocked) by the other PD. - -Depending on the scheduling, one PD could notify another multiple times without it being scheduled, resulting -in a single execution of the `notified` entry point. For example, if PD A notifies PD B three times on the -same channel without PD B ever executing, once PD B is scheduled it would only see one notification and hence -only enter `notified` once for that channel. - -### Interrupts {#irq} - -Hardware interrupts can be used to notify a protection domain. -The system description specifies if a protection domain receives notifications for any hardware interrupt sources. -Each hardware interrupt is assigned a channel identifier. -In this way the protection domain can distinguish the hardware interrupt from other notifications. -A specific hardware interrupt can only be associated with at most one protection domain. It should be noted that once a -hardware interrupt has been received, it will not be received again until `microkit_irq_ack` is called. The seL4 kernel -will mask the hardware interrupt until it has been acknowledged. - -Microkit does not provides timers, nor any *sleep* API. -After initialisation, activity in the system is initiated by an interrupt causing a `notified` entry point to be invoked. -That notified function may in turn notify or call other protection domains that cause other system activity, but eventually all activity indirectly initiated from that interrupt will complete, at which point the system is inactive again until another interrupt occurs. - -### Faults {#fault} - -Faults such as an invalid memory access or illegal instruction are delivered to the seL4 kernel which then forwards them to -a designated 'fault handler'. By default, all faults caused by protection domains go to the system fault handler which -simply prints out details about the fault in a debug configuration. - -When a protection domain is a child of another protection domain, the designated fault handler for the child is the parent -protection domain. The same applies for a virtual machine. - -This means that whenever a fault is caused by a child, it will be delivered to the parent PD instead of the system fault -handler via the `fault` entry point. It is then up to the parent to decide how the fault is handled. - -The default system fault handler (aka the monitor) has the highest priority and so will -execute and handle faults immediately after they occur. For child PDs that have their faults -delivered to another PD, the fault being handled depends on when the parent PD is scheduled. - -### I/O Ports {#ioport} - -I/O ports are x86 mechanisms to access certain physical devices (e.g. PC serial ports or PCI) using the `in` and `out` CPU instructions. The system description specifies if a protection domain have access to certain port address ranges. These accesses will be executed by seL4 and the result returned to protection domains. - -## SDK {#sdk} - -Microkit is distributed as a software development kit (SDK). - -The SDK includes support for one or more *boards*. -Three *configurations* are supported for each board: *debug*, *release*, and *benchmark*. -See [the Configurations section](#config) for more details. - -The SDK contains: - -* Microkit user manual (this document) -* Microkit tool - -Additionally, for each supported board configuration the following are provided: - -* `libmicrokit.a` -* `initialiser.elf` -* `monitor.elf` -* seL4 kernel image - * On ARM/RISC-V: `sel4.elf` - * On x86-64: `sel4_64.elf` (64-bit) and `sel4_32.elf` (32-bit) - -On ARM and RISC-V, an additional `loader.elf` is provided, which acts as the system's bootloader. - -On x86-64, 32-bit/64-bit variants of the kernel are provided as even on 64-bit platforms (e.g QEMU), -a 32-bit kernel is required. - -There are also examples provided in the `example` directory. - -The Microkit SDK does **not** provide, nor require, any specific build system. -The user is free to build their system using whatever build system is deemed most appropriate for their specific use case. - -The Microkit tool should be invoked by the system build process to transform a system description (and any referenced program images) into an image file which can be loaded by the target board's bootloader. - -The ELF files provided as program images should be standard ELF files and have been linked against the provided `libmicrokit.a`. - -### Configurations {#config} - -#### Debug - -The *debug* configuration includes a debug build of the seL4 kernel to allow console debug output using the kernel's UART driver. - -#### Release - -The *release* configuration is a release build of the seL4 kernel and is intended for production builds. The loader, monitor, initialiser and -kernel do *not* perform any serial output. - -##### Proofs - -The formal verification of seL4 applies to a specific set of seL4 configuration only. This means that making a *release* build -of a Microkit system does not imply that the seL4 kernel being used is verified. - -Currently Microkit always uses the MCS configuration of seL4 which is still undergoing verification, scheduled to complete -for RISC-V in 2026 and AArch64 in 2027. The design proofs for MCS are done but the work to show that the kernel code conforms -to the design is still undergoing. - -You can find more information about what verified seL4 configurations do exist -[here](https://docs.sel4.systems/projects/sel4/verified-configurations.html) - -A roadmap for upcoming verification is available [here](https://sel4.systems/roadmap.html). - -#### Benchmark - -The *benchmark* configuration uses a build of the seL4 kernel that exports the hardware's performance monitoring unit (PMU) to PDs. -The kernel also tracks information about CPU utilisation. This benchmark configuration exists due a limitation of the seL4 kernel -and is intended to be removed once [RFC-16 is implemented](https://github.com/seL4/rfcs/pull/22). - -#### Multi-core (SMP) configurations {#multicore_config} - -The configurations listed above default to using the uni-core configuration of seL4/Microkit. -Currently we do not want to default to using the multi-core configuration of the kernel so -separate configurations exist for users wanting to use multi-core. - -The multi-core configurations are the same as the configurations listed above, except with the -*smp-* prefix. For example, *smp-debug* for the multi-core variant of *debug*. - -On ARM/RISC-V, the number of cores available defaults to the number of cores the target board has. - -On x86-64, the number of cores available depends on how many are detected at run-time. Right now -there is a fixed upper limit, see the board-specific documentation for details. - -### System Requirements - -The Microkit tool requires Linux (x86-64 or AArch64), macOS (x86-64 or AArch64). - -On Linux, the Microkit tool is statically linked and should run on any distribution. - -On macOS, the Microkit tool should run on macOS 10.12 (Sierra) or higher. - -The Microkit tool does not depend on any additional system binaries. - -## Microkit Tool {#tool} - -The Microkit tool is available in `bin/microkit`. - -The Microkit tool takes as input a system description. -The format of the system description is described in a subsequent chapter. - -Usage: - - microkit [-h] [-o OUTPUT] [-r REPORT] [--capdl-json CAPDL_SPEC] [--image-type {binary,elf,uimage}] - --board [BOARD] --config CONFIG [--search-path [SEARCH_PATH ...]] system - -The path to the system description file, board to build the system for, and configuration to build for must be provided. - -The search paths provided tell the tool where to find any program images specified in the system description file. - -In the case of errors, a diagnostic message shall be output to `stderr` and a non-zero code returned. - -In the case of success, a loadable image file and a report shall be produced. The -type of image is specified by the `--image-type` argument. -The output paths for these can be specified by `-o` and `-r` respectively. -The default output paths are `loader.img` and `report.txt`. - -The report is a plain text file describing important information about the system. -The report can be useful when debugging potential system problems. -This report does not have a fixed format and may change between versions. -It is not intended to be machine readable. - -### Image format - -#### ARM - -On ARM, the Microkit tool will produce either a raw binary that is intended to be loaded and jumped or -an ELF. By default, the tool will produce a raw binary unless the format is specified using the `--image-type` argument. - -For the raw binary format, there is a specified entry point of the image that is documented in the board-specific -instructions in this manual, under [Board Support Packages](#bsps). If the image is not loaded at this address -it should still work by relocating itself upon boot. - -This image is expected to be loaded via a previous bootloader, typically U-Boot using the `go` command for -the binary image format and the `bootelf` command for ELFs. Note when using `bootelf` you may need to set -the `autostart` environment variable with `setenv autostart yes` to have the image executed after `bootelf`. - -See the board-specific instructions for more details. - -#### RISC-V - -On RISC-V, the Microkit tool can produce either a raw binary that is intended to be loaded and jumped, -a uImage with the Linux header or an ELF. Typically the tool will produce a uImage by default, for -board-specific details see [Board Support Packages](#bsps). - -For the raw binary format, there is a specified entry point of the image that is documented in the board-specific -instructions in this manual, under [Board Support Packages](#bsps). If the image is not loaded at this address -it should still work by relocating itself upon boot. - -For the uImage format. You may load this image anywhere in memory along with your platform's DTB, then use -the `bootm` command in U-Boot. It will copy the loader to the correct location in memory and jump to it. - -#### x86-64 - -On x86-64, the image format is always ELF, it is expected to be loaded as a Multiboot boot module. - -See [x86-64 generic support](#x86_64_generic) for more details. - -## Language Support - -There are native APIs for C/C++ and Rust. - -[libmicrokit](#libmicrokit) exports a C API and so can be used in any language -that supports C FFI. - -For Rust, native bindings exist but are not included in the SDK itself. They are -available at [rust-sel4](https://github.com/seL4/rust-sel4). - -## libmicrokit {#libmicrokit} - -All program images should link against `libmicrokit.a`. - -The library provides the C runtime for the protection domain, along with interfaces for the Microkit APIs. - -The component must provide the following functions: - - void init(void); - void notified(microkit_channel ch); - -If the protection domain provides a protected procedure it must also implement: - - microkit_msginfo protected(microkit_channel ch, microkit_msginfo msginfo); - -If the protection domain has children it must also implement: - - seL4_Bool fault(microkit_child child, microkit_msginfo msginfo, - microkit_msginfo *reply_msginfo); - -`libmicrokit` provides the following functions: - - microkit_msginfo microkit_ppcall(microkit_channel ch, microkit_msginfo msginfo); - void microkit_notify(microkit_channel ch); - microkit_msginfo microkit_msginfo_new(seL4_Word label, seL4_Uint16 count); - seL4_Word microkit_msginfo_get_label(microkit_msginfo msginfo); - seL4_Word microkit_msginfo_get_count(microkit_msginfo msginfo); - void microkit_irq_ack(microkit_channel ch); - void microkit_deferred_notify(microkit_channel ch); - void microkit_deferred_irq_ack(microkit_channel ch); - void microkit_pd_restart(microkit_child pd, seL4_Word entry_point); - void microkit_pd_stop(microkit_child pd); - void microkit_mr_set(seL4_Uint8 mr, seL4_Word value); - seL4_Word microkit_mr_get(seL4_Uint8 mr); - void microkit_vcpu_restart(microkit_child vcpu, seL4_Word entry_point); - void microkit_vcpu_stop(microkit_child vcpu); - void microkit_vcpu_arm_inject_irq(microkit_child vcpu, seL4_Uint16 irq, - seL4_Uint8 priority, seL4_Uint8 group, - seL4_Uint8 index); - void microkit_vcpu_arm_ack_vppi(microkit_child vcpu, seL4_Word irq); - seL4_Word microkit_vcpu_arm_read_reg(microkit_child vcpu, seL4_Word reg); - void microkit_vcpu_arm_write_reg(microkit_child vcpu, seL4_Word reg, seL4_Word value); - void microkit_arm_smc_call(seL4_ARM_SMCContext *args, seL4_ARM_SMCContext *response); - void microkit_x86_ioport_write_8(microkit_ioport ioport_id, seL4_Word port_addr, seL4_Word data); - void microkit_x86_ioport_write_16(microkit_ioport ioport_id, seL4_Word port_addr, seL4_Word data); - void microkit_x86_ioport_write_32(microkit_ioport ioport_id, seL4_Word port_addr, seL4_Word data); - seL4_Uint8 microkit_x86_ioport_read_8(microkit_ioport ioport_id, seL4_Word port_addr); - seL4_Uint16 microkit_x86_ioport_read_16(microkit_ioport ioport_id, seL4_Word port_addr); - seL4_Uint32 microkit_x86_ioport_read_32(microkit_ioport ioport_id, seL4_Word port_addr); - seL4_Word microkit_vcpu_x86_read_vmcs(microkit_child vcpu, seL4_Word field); - void microkit_vcpu_x86_write_vmcs(microkit_child vcpu, seL4_Word field, seL4_Word value); - seL4_Word microkit_vcpu_x86_read_msr(microkit_child vcpu, seL4_Word field); - void microkit_vcpu_x86_write_msr(microkit_child vcpu, seL4_Word field, seL4_Word value); - void microkit_vcpu_x86_enable_ioport(microkit_child vcpu, microkit_ioport ioport_id, - seL4_Word port_addr, seL4_Word length); - void microkit_vcpu_x86_disable_ioport(microkit_child vcpu, seL4_Word port_addr, seL4_Word length); - void microkit_vcpu_x86_write_regs(microkit_child vcpu, seL4_VCPUContext *regs); - - -### `void init(void)` - -Every PD must expose an `init` entry point. -This is called by the system at boot time. - -### `void notified(microkit_channel ch)` - -The `notified` entry point is called by the system when a PD has received a notification on a channel. - -`ch` identifies the channel which has been notified (and indirectly the PD that performed the notification). - -**Note:** `ch` could identify an interrupt. - -Channel identifiers are specified in the system configuration. - -### `microkit_msginfo protected(microkit_channel ch, microkit_msginfo msginfo)` - -The `protected` entry point is optional. -This is invoked when another PD calls `microkit_ppcall` on a channel shared with the PD. - -The `ch` argument identifies the channel on which the PP was invoked. -Indirectly this identifies the PD performing the call. -Channel identifiers are specified in the system configuration. -**Note:** The channel argument is passed by the system and is unforgeable. - -The `msginfo` argument is the argument passed to the PP and is provided by the calling PD. -The contents of the message is up to a pre-arranged protocol between the PDs. -The message contents are opaque to the system. -Note: The message is *copied* from the caller. - -The returned `microkit_msginfo` is the return value of the protected procedure. -As with arguments, this is *copied* to the caller. - -### `seL4_Bool fault(microkit_child child, microkit_msginfo msginfo, microkit_msginfo *reply_msginfo)` - -The `fault` entry point being invoked depends on whether the given PD has children. -It is invoked when a child PD or VM causes a fault. - -The `child` argument identifies the child that caused the fault. - -The `msginfo` argument is given by the seL4 kernel when a fault occurs and contains information -as to what fault occurred. - -The `reply_msginfo` argument is given by libmicrokit and can be used to reply to the fault. - -The returned `seL4_Bool` is whether or not to reply to the fault with the message `reply_msginfo`. -Returning `seL4_True` will reply to the fault. Returning `seL4_False` will not reply to the fault. - -You can use `microkit_msginfo_get_label` on `msginfo` to deduce what kind of fault happened -(for example, whether it was a user exception or a virtual memory fault). - -Whether or not you reply to the fault depends on the type of fault that has occurred and how you want -to handle it. - -To find the full list of possible faults that could occur and details regarding to replying to a particular -kind of fault, please see the 'Faults' section of the -[seL4 reference manual](https://sel4.systems/Info/Docs/seL4-manual-latest.pdf). - -### `microkit_msginfo microkit_ppcall(microkit_channel ch, microkit_msginfo msginfo)` - -Performs a call to a protected procedure in a different PD. -The `ch` argument identifies the protected procedure to be called. -`msginfo` is passed as argument to the protected procedure. -Channel identifiers are specified in the system configuration. - -The protected procedure's return data is returned in the `microkit_msginfo`. - -### `void microkit_notify(microkit_channel ch)` - -Notify the channel `ch`. -Channel identifiers are specified in the system configuration. - -### `void microkit_irq_ack(microkit_channel ch)` - -Acknowledge the interrupt identified by the specified channel. - -### `void microkit_deferred_notify(microkit_channel ch)` - -The same as `microkit_notify` but will instead not actually perform the notify until -the entry point where `microkit_deferred_notify` was called returns. - -It is important to note that only a single 'deferred' API call can be made within the -same entry point. - -The purpose of this API is for performance critical code as this API saves -a kernel system call. - -### `void microkit_deferred_irq_ack(microkit_channel ch)` - -The same as `microkit_irq_ack` but will instead not actually perform the IRQ acknowledge -until the entry point where `microkit_deferred_irq_ack` was called returns. - -It is important to note that only a single 'deferred' API call can be made within the -same entry point. - -The purpose of this API is for performance critical code as this API saves -a kernel system call. - -### `void microkit_pd_restart(microkit_child pd, uintptr_t entry_point)` - -Restart the execution of a child protection domain with ID `pd` at the given `entry_point`. -This will set the program counter of the child protection domain to `entry_point`. - -### `void microkit_pd_stop(microkit_child pd)` - -Stop the execution of the child protection domain with ID `pd`. - -### `microkit_msginfo microkit_msginfo_new(uint64_t label, uint16_t count)` - -Creates a new message structure. - -The message can be passed to `microkit_ppcall` or returned from `protected`. - -### `uint64_t microkit_msginfo_get_label(microkit_msginfo msginfo)` - -Returns the label from a message. - -### `uint64_t microkit_msginfo_get_count(microkit_msginfo msginfo)` - -Returns the count of message registers in the message. - -### `uint64_t microkit_mr_get(uint8_t mr)` - -Get a message register. - -### `void microkit_mr_set(uint8_t mr, uint64_t value)` - -Set a message register. - -### `void microkit_vcpu_restart(microkit_child vcpu, seL4_Word entry_point)` - -Restart the execution of a VM's virtual CPU with ID `vcpu` at the given `entry point`. -This will set the program counter of the vCPU to `entry_point`. - -### `void microkit_vcpu_stop(microkit_child vcpu)` - -Stop the execution of the VM's virtual CPU with ID `vcpu`. - -### `void microkit_vcpu_arm_inject_irq(microkit_child vcpu, seL4_Uint16 irq, -seL4_Uint8 priority, seL4_Uint8 group, -seL4_Uint8 index)` - -Inject a virtual ARM interrupt for a virtual CPU `vcpu` with IRQ number `irq`. -The `priority` (0-31) determines what ARM GIC (generic interrupt controller) -priority level the virtual IRQ will be injected as. The `group` determines whether -the virtual IRQ will be injected into secure world (1) or non-secure world (0). -The `index` is the index of the virtual GIC list register. - -### `void microkit_vcpu_arm_ack_vppi(microkit_child vcpu, seL4_Word irq)` - -Acknowledge a ARM virtual Private Peripheral Interrupt (PPI) with IRQ number `irq` -for a VM's vCPU with ID `vcpu`. - -### `seL4_Word microkit_vcpu_arm_read_reg(microkit_child vcpu, seL4_Word reg)` - -Read a register for a given virtual CPU with ID `vcpu`. The `reg` argument is the index of the -register that is read. The list of registers is defined by the enum `seL4_VCPUReg` -in the seL4 source code. - -### `void microkit_vcpu_arm_write_reg(microkit_child vcpu, seL4_Word reg, seL4_Word value)` - -Write to a register for a given virtual CPU with ID `vcpu`. The `reg` argument is the index of the -register that is written to. The `value` argument is what the register will be set to. -The list of registers is defined by the enum `seL4_VCPUReg` in the seL4 source code. - -### `void microkit_arm_smc_call(seL4_ARM_SMCContext *args, seL4_ARM_SMCContext *response)` - -The API takes in arguments for a Secure Monitor Call which will be performed by seL4. Any -response values will be placed into the `response` structure. - -The `seL4_ARM_SMCContext` structure contains fields for registers x0 to x7. - -Note that this API is only available when the PD making the call has been configured to -have SMC enabled in the SDF. Note that when the kernel makes the actual SMC, it cannot -pre-empt the Secure Monitor and therefore any kernel WCET properties are no longer guaranteed. - -### `void microkit_x86_ioport_write_(8|16|32)(microkit_ioport ioport_id, seL4_Word port_addr, seL4_Word data)` - -Write an 8, 16, or 32 bits value at port address `port_addr` to I/O Port with ID `ioport_id`. - -### `seL4_Uint(8|16|32) microkit_x86_ioport_read_(8|16|32)(microkit_ioport ioport_id, seL4_Word port_addr)` - -Read an 8, 16, or 32 bits value at port address `port_addr` from I/O Port with ID `ioport_id`. - -### `seL4_Word microkit_vcpu_x86_read_vmcs(microkit_child vcpu, seL4_Word field)` - -Read a Virtual Machine Control Structure field specified by `field` for a given virtual CPU -with ID `vcpu` using the `vmread` instruction. - -All the VMCS fields are listed in the seL4 source at `include/arch/x86/arch/object/vcpu.h`. - -The following fields can be read from: - -* `VMX_GUEST_RIP` -* `VMX_GUEST_RSP` -* `VMX_GUEST_ES_SELECTOR` -* `VMX_GUEST_CS_SELECTOR` -* `VMX_GUEST_SS_SELECTOR` -* `VMX_GUEST_DS_SELECTOR` -* `VMX_GUEST_FS_SELECTOR` -* `VMX_GUEST_GS_SELECTOR` -* `VMX_GUEST_LDTR_SELECTOR` -* `VMX_GUEST_TR_SELECTOR` -* `VMX_GUEST_DEBUGCTRL` -* `VMX_GUEST_PAT` -* `VMX_GUEST_EFER` -* `VMX_GUEST_PERF_GLOBAL_CTRL` -* `VMX_GUEST_PDPTE0` -* `VMX_GUEST_PDPTE1` -* `VMX_GUEST_PDPTE2` -* `VMX_GUEST_PDPTE3` -* `VMX_GUEST_ES_LIMIT` -* `VMX_GUEST_CS_LIMIT` -* `VMX_GUEST_SS_LIMIT` -* `VMX_GUEST_DS_LIMIT` -* `VMX_GUEST_FS_LIMIT` -* `VMX_GUEST_GS_LIMIT` -* `VMX_GUEST_LDTR_LIMIT` -* `VMX_GUEST_TR_LIMIT` -* `VMX_GUEST_GDTR_LIMIT` -* `VMX_GUEST_IDTR_LIMIT` -* `VMX_GUEST_ES_ACCESS_RIGHTS` -* `VMX_GUEST_CS_ACCESS_RIGHTS` -* `VMX_GUEST_SS_ACCESS_RIGHTS` -* `VMX_GUEST_DS_ACCESS_RIGHTS` -* `VMX_GUEST_FS_ACCESS_RIGHTS` -* `VMX_GUEST_GS_ACCESS_RIGHTS` -* `VMX_GUEST_LDTR_ACCESS_RIGHTS` -* `VMX_GUEST_TR_ACCESS_RIGHTS` -* `VMX_GUEST_INTERRUPTABILITY` -* `VMX_GUEST_ACTIVITY` -* `VMX_GUEST_SMBASE` -* `VMX_GUEST_SYSENTER_CS` -* `VMX_GUEST_PREEMPTION_TIMER_VALUE` -* `VMX_GUEST_ES_BASE` -* `VMX_GUEST_CS_BASE` -* `VMX_GUEST_SS_BASE` -* `VMX_GUEST_DS_BASE` -* `VMX_GUEST_FS_BASE` -* `VMX_GUEST_GS_BASE` -* `VMX_GUEST_LDTR_BASE` -* `VMX_GUEST_TR_BASE` -* `VMX_GUEST_GDTR_BASE` -* `VMX_GUEST_IDTR_BASE` -* `VMX_GUEST_DR7` -* `VMX_GUEST_RFLAGS` -* `VMX_GUEST_PENDING_DEBUG_EXCEPTIONS` -* `VMX_GUEST_SYSENTER_ESP` -* `VMX_GUEST_SYSENTER_EIP` -* `VMX_CONTROL_CR0_MASK` -* `VMX_CONTROL_CR4_MASK` -* `VMX_CONTROL_CR0_READ_SHADOW` -* `VMX_CONTROL_CR4_READ_SHADOW` -* `VMX_DATA_INSTRUCTION_ERROR` -* `VMX_DATA_EXIT_INTERRUPT_INFO` -* `VMX_DATA_EXIT_INTERRUPT_ERROR` -* `VMX_DATA_IDT_VECTOR_INFO` -* `VMX_DATA_IDT_VECTOR_ERROR` -* `VMX_DATA_EXIT_INSTRUCTION_LENGTH` -* `VMX_DATA_EXIT_INSTRUCTION_INFO` -* `VMX_DATA_GUEST_PHYSICAL` -* `VMX_DATA_IO_RCX` -* `VMX_DATA_IO_RSI` -* `VMX_DATA_IO_RDI` -* `VMX_DATA_IO_RIP` -* `VMX_DATA_GUEST_LINEAR_ADDRESS` -* `VMX_CONTROL_ENTRY_INTERRUPTION_INFO` -* `VMX_CONTROL_PIN_EXECUTION_CONTROLS` -* `VMX_CONTROL_PRIMARY_PROCESSOR_CONTROLS` -* `VMX_CONTROL_EXCEPTION_BITMAP` -* `VMX_CONTROL_EXIT_CONTROLS` -* `VMX_GUEST_CR0` -* `VMX_GUEST_CR3` -* `VMX_GUEST_CR4` - -### `void microkit_vcpu_x86_write_vmcs(microkit_child vcpu, seL4_Word field, seL4_Word value)` - -Write a Virtual Machine Control Structure field specified by `field` for a given virtual CPU -with ID `vcpu` using the `vmwrite` instruction. The value may be modified to ensure any bits -that are fixed in the hardware are correct, and that any features required for kernel correctness -are not disabled. - -All the VMCS fields are listed in the seL4 source at `include/arch/x86/arch/object/vcpu.h`. - -The following fields can be written to: - -* `VMX_GUEST_RIP` -* `VMX_GUEST_RSP` -* `VMX_GUEST_ES_SELECTOR` -* `VMX_GUEST_CS_SELECTOR` -* `VMX_GUEST_SS_SELECTOR` -* `VMX_GUEST_DS_SELECTOR` -* `VMX_GUEST_FS_SELECTOR` -* `VMX_GUEST_GS_SELECTOR` -* `VMX_GUEST_LDTR_SELECTOR` -* `VMX_GUEST_TR_SELECTOR` -* `VMX_GUEST_DEBUGCTRL` -* `VMX_GUEST_PAT` -* `VMX_GUEST_EFER` -* `VMX_GUEST_PERF_GLOBAL_CTRL` -* `VMX_GUEST_PDPTE0` -* `VMX_GUEST_PDPTE1` -* `VMX_GUEST_PDPTE2` -* `VMX_GUEST_PDPTE3` -* `VMX_GUEST_ES_LIMIT` -* `VMX_GUEST_CS_LIMIT` -* `VMX_GUEST_SS_LIMIT` -* `VMX_GUEST_DS_LIMIT` -* `VMX_GUEST_FS_LIMIT` -* `VMX_GUEST_GS_LIMIT` -* `VMX_GUEST_LDTR_LIMIT` -* `VMX_GUEST_TR_LIMIT` -* `VMX_GUEST_GDTR_LIMIT` -* `VMX_GUEST_IDTR_LIMIT` -* `VMX_GUEST_ES_ACCESS_RIGHTS` -* `VMX_GUEST_CS_ACCESS_RIGHTS` -* `VMX_GUEST_SS_ACCESS_RIGHTS` -* `VMX_GUEST_DS_ACCESS_RIGHTS` -* `VMX_GUEST_FS_ACCESS_RIGHTS` -* `VMX_GUEST_GS_ACCESS_RIGHTS` -* `VMX_GUEST_LDTR_ACCESS_RIGHTS` -* `VMX_GUEST_TR_ACCESS_RIGHTS` -* `VMX_GUEST_INTERRUPTABILITY` -* `VMX_GUEST_ACTIVITY` -* `VMX_GUEST_SMBASE` -* `VMX_GUEST_SYSENTER_CS` -* `VMX_GUEST_PREEMPTION_TIMER_VALUE` -* `VMX_GUEST_ES_BASE` -* `VMX_GUEST_CS_BASE` -* `VMX_GUEST_SS_BASE` -* `VMX_GUEST_DS_BASE` -* `VMX_GUEST_FS_BASE` -* `VMX_GUEST_GS_BASE` -* `VMX_GUEST_LDTR_BASE` -* `VMX_GUEST_TR_BASE` -* `VMX_GUEST_GDTR_BASE` -* `VMX_GUEST_IDTR_BASE` -* `VMX_GUEST_DR7` -* `VMX_GUEST_RFLAGS` -* `VMX_GUEST_PENDING_DEBUG_EXCEPTIONS` -* `VMX_GUEST_SYSENTER_ESP` -* `VMX_GUEST_SYSENTER_EIP` -* `VMX_CONTROL_CR0_MASK` -* `VMX_CONTROL_CR4_MASK` -* `VMX_CONTROL_CR0_READ_SHADOW` -* `VMX_CONTROL_CR4_READ_SHADOW` -* `VMX_CONTROL_EXCEPTION_BITMAP` -* `VMX_CONTROL_ENTRY_INTERRUPTION_INFO` -* `VMX_CONTROL_ENTRY_EXCEPTION_ERROR_CODE` -* `VMX_CONTROL_PIN_EXECUTION_CONTROLS` -* `VMX_CONTROL_PRIMARY_PROCESSOR_CONTROLS` -* `VMX_CONTROL_SECONDARY_PROCESSOR_CONTROLS` -* `VMX_CONTROL_EXIT_CONTROLS` -* `VMX_GUEST_CR3` -* `VMX_GUEST_CR0` -* `VMX_GUEST_CR4` - -### `seL4_Word microkit_vcpu_x86_read_msr(microkit_child vcpu, seL4_Word field)` - -Read a 64-bit Model Specific Register of a given virtual CPU with ID `vcpu` specified by -`field` from hardware using the `rdmsr` instruction. The following registers can be written to: - -* `IA32_LSTAR_MSR` -* `IA32_STAR_MSR` -* `IA32_CSTAR_MSR` -* `IA32_FMASK_MSR` - -### `void microkit_vcpu_x86_write_msr(microkit_child vcpu, seL4_Word field, seL4_Word value)` - -Write a 64-bit Model Specific Register of a given virtual CPU with ID `vcpu` specified by -`field` to hardware using the `wrmsr` instruction. The following registers can be read from: - -* `IA32_LSTAR_MSR` -* `IA32_STAR_MSR` -* `IA32_CSTAR_MSR` -* `IA32_FMASK_MSR` - -### `void microkit_vcpu_x86_enable_ioport(microkit_child vcpu, microkit_ioport ioport_id, seL4_Word port_addr, seL4_Word length)` - -Enable I/O port range `[port_addr..port_addr + length)` of I/O Port with ID `ioport_id` -in the execution environment of a given virtual CPU with ID `vcpu`. - -### `void microkit_vcpu_x86_disable_ioport(microkit_child vcpu, seL4_Word port_addr, seL4_Word length)` - -Disable I/O port range `[port_addr..port_addr + length)` in the execution environment of a given -virtual CPU with ID `vcpu`. - -### `void microkit_vcpu_x86_write_regs(microkit_child vcpu, seL4_VCPUContext *regs)` - -Write the registers of a given virtual CPU with ID `vcpu`. The `regs` argument is the pointer to -the struct of registers `seL4_VCPUContext` that are written from. - -## System Description File {#sysdesc} - -This section describes the format of the System Description File (SDF). - -The system description file is an XML file that is provided as input to the -`microkit` tool. - -The root element of the XML file is `system`. - -Within the `system` root element the following child elements are supported: - -* `protection_domain` -* `memory_region` -* `channel` - -### `protection_domain` - -The `protection_domain` element describes a protection domain. - -It supports the following attributes: - -* `name`: A unique name for the protection domain -* `priority`: The priority of the protection domain (integer 0 to 254). -* `budget`: (optional) The PD's budget in microseconds; defaults to 1,000. -* `period`: (optional) The PD's period in microseconds; must not be smaller than the budget; defaults to the budget. -* `passive`: (optional) Indicates that the protection domain will be passive and thus have its scheduling context removed after initialisation; defaults to false. -* `stack_size`: (optional) Number of bytes that will be used for the PD's stack. - Must be be between 4KiB and 16MiB and be 4K page-aligned. Defaults to 8KiB. -* `cpu`: (optional) set the physical CPU core this PD will run on. Defaults to zero. -* `smc`: (optional, only on ARM) Allow the PD to give an SMC call for the kernel to perform.. Defaults to false. - -Additionally, it supports the following child elements: - -* `program_image`: (exactly one) Describes the program image for the protection domain. -* `map`: (zero or more) Describes mapping of memory regions into the protection domain. -* `irq`: (zero or more) Describes hardware interrupt associations. -* `setvar`: (zero or more) Describes variable rewriting. -* `protection_domain`: (zero or more) Describes a child protection domain. -* `virtual_machine`: (zero or one) Describes a child virtual machine. - -The `program_image` element has a single `path` attribute describing the path to an ELF file. - -The `map` element has the following attributes: - -* `mr`: Identifies the memory region to map. -* `vaddr`: Identifies the virtual address at which to map the memory region. -* `perms`: Identifies the permissions with which to map the memory region. Can be a combination of `r` (read), `w` (write), and `x` (eXecute), with the exception of a write-only mapping (just `w`). -* `cached`: (optional) Determines if mapped with caching enabled or disabled. Defaults to `true`. -* `setvar_vaddr`: (optional) Specifies a symbol in the program image. This symbol will be rewritten with the virtual address of the memory region. -* `setvar_size`: (optional) Specifies a symbol in the program image. This symbol will be rewritten with the size of the memory region. - -The `irq` element has the following attributes on ARM and RISC-V: - -* `irq`: The hardware interrupt number. -* `id`: The channel identifier. Must be at least 0 and less than 63. -* `trigger`: (optional) Whether the IRQ is edge triggered ("edge") or level triggered ("level"). Defaults to "level". -* `setvar_id`: (optional) Specifies a symbol in the program image. This symbol will be rewritten with the channel identifier of the IRQ. - -The `irq` element has the following attributes when registering X86_64 IOAPIC interrupts: - -* `id`: The channel identifier. Must be at least 0 and less than 63. -* `pin`: IOAPIC pin that generates the interrupt. -* `vector`: CPU vector to deliver the interrupt to. -* `ioapic`: (optional) Zero based index of the IOAPIC to get the interrupt from. Defaults to 0. -* `level`: (optional) Whether the IRQ is level triggered (1) or edge triggered (0). Defaults to level (1). -* `polarity`: (optional) Whether the line polarity is high (1) or low (0). Defaults to high (1). -* `setvar_id`: (optional) Specifies a symbol in the program image. This symbol will be rewritten with the channel identifier of the IRQ. - -The `irq` element has the following attributes when registering X86_64 MSI interrupts: - -* `id`: The channel identifier. Must be at least 0 and less than 63. -* `pcidev`: The PCI device address of the device that will generate the interrupt, in BUS:DEV:FUNC notation (e.g. 01:1f:2). -* `handle`: Value of the handle programmed into the data portion of the MSI. -* `vector`: CPU vector to deliver the interrupt to. -* `setvar_id`: (optional) Specifies a symbol in the program image. This symbol will be rewritten with the channel identifier of the IRQ. - -The `ioport` element has the following attributes: - -* `id`: The I/O port identifier. Must be at least 0 and less than 63. -* `addr`: The base address of the I/O port. -* `size`: The size in bytes of the I/O port region. -* `setvar_id`: (optional) Specifies a symbol in the program image. This symbol will be rewritten with the I/O port identifier. -* `setvar_addr`: (optional) Specifies a symbol in the program image. This symbol will be rewritten with the base address of the I/O port. - -The `setvar` element has the following attributes: - -* `symbol`: Name of a symbol in the ELF file. -* `region_paddr`: Name of an MR. The symbol's value shall be updated to this MR's physical address. - Note that on x86-64 platforms this MR must have a specified physical address. - This restriction is due to x86-64 physical memory layout not being known at build-time. - -The `protection_domain` element has the same attributes as any other protection domain as well as: - -* `id`: The ID of the child for the parent to refer to. -* `setvar_id`: (optional) Specifies a symbol in the parent program image. This symbol will be rewritten with the ID of the child. - -The `virtual_machine` element has the following attributes: - -* `name`: A unique name for the virtual machine -* `priority`: The priority of the virtual machine (integer 0 to 254). -* `budget`: (optional) The VM's budget in microseconds; defaults to 1,000. -* `period`: (optional) The VM's period in microseconds; must not be smaller than the budget; defaults to the budget. - -Additionally, it supports the following child elements: - -* `vcpu`: (one or more) Describes the virtual CPU that will be tied to the virtual machine. -* `map`: (zero or more) Describes mapping of memory regions into the virtual machine. - -The `vcpu` element has the following attributes: - -* `id`: The vCPU identifier. Must be at least 0 and less than 62. -* `setvar_id`: (optional) Specifies a symbol in the program image. This symbol will be rewritten with the vCPU identifier. - -The `map` element has the same attributes as the protection domain with the exception of `setvar_vaddr`. - -### `memory_region` - -The `memory_region` element describes a memory region. - -It supports the following attributes: - -* `name`: A unique name for the memory region -* `size`: Size of the memory region in bytes (must be a multiple of the page size) -* `page_size`: (optional) Size of the pages used in the memory region; must be a supported page size if provided. Defaults to the largest page size for the target architecture that the memory region is aligned to. -* `phys_addr`: (optional) The physical address for the start of the memory region (must be a multiple of the page size). - -The `memory_region` element does not support any child elements. - -#### Page sizes by architecture - -Below are the available page sizes for each architecture that Microkit supports. - -##### AArch64 - -* 0x1000 (4KiB) -* 0x200000 (2MiB) - -##### RISC-V 64-bit - -* 0x1000 (4KiB) -* 0x200000 (2MiB) - -##### x86-64 - -* 0x1000 (4KiB) -* 0x200000 (2MiB) - -### `channel` - -The `channel` element has exactly two `end` children elements for specifying the two PDs associated with the channel. - -The `end` element has the following attributes: - -* `pd`: Name of the protection domain for this end. -* `id`: Channel identifier in the context of the named protection domain. Must be at least 0 and less than 63. -* `pp`: (optional) Indicates that the protection domain for this end can perform a protected procedure call to the other end; defaults to false. - Protected procedure calls can only be to PDs of strictly higher priority. -* `notify`: (optional) Indicates that the protection domain for this end can send a notification to the other end; defaults to true. -* `setvar_id`: (optional) Specifies a symbol in the program image. This symbol will be rewritten with the channel identifier. - -The `id` is passed to the PD in the `notified` and `protected` entry points. -The `id` should be passed to the `microkit_notify` and `microkit_ppcall` functions. - -## Board Support Packages {#bsps} - -This chapter describes the board support packages that are available in the SDK. - -The currently supported platforms are: -* ariane -* cheshire -* hifive_p550 -* imx8mm_evk -* imx8mp_evk -* imx8mp_iotgate -* imx8mq_evk -* maaxboard -* odroidc2 -* odroidc4 -* qemu_virt_aarch64 -* qemu_virt_riscv64 -* rockpro64 -* rpi4b_1gb -* rpi4b_2gb -* rpi4b_4gb -* rpi4b_8gb -* serengeti -* star64 -* tqma8xqp1gb -* ultra96v2 -* x86_64_generic -* x86_64_generic_vtx -* zcu102 - -### Ariane (CVA6) {#ariane} - -Initial support is available for the CVA6 (formerly Ariane) core design -on the Digilent Genesys2 board. CVA6 is an open-source RISC-V (rv64i) processor. - -Microkit support expects that a compatible RISC-V SBI (e.g OpenSBI) has executed before -jumping to the beginning of the loader image. - -Microkit outputs an ELF for this platform. - -You may compile OpenSBI with the Microkit image as a payload, or alternately install -OpenSBI (with U-Boot optionally) to the SD card. - -If you are booting from U-Boot, use the following command to start the system image: - - => bootelf ${image_addr} - -Where `image_addr` is the load address of the ELF image. - -Note that the OpenSBI version from the CVA6 SDK at the time of writing has issues when -booting. It is recommended to use the mainline OpenSBI. - -### Compulab IOT-GATE-IMX8MPLUS {#imx8mp_iotgate} - -The IOT-GATE-IMX8PLUS is based on the NXP i.MX8MP SoC. - -Microkit will produce a raw binary file by default, so when using U-Boot run the following command: - - => go 0x50000000 - -### Cheshire {#cheshire} - -Support is available for [Cheshire](https://github.com/pulp-platform/cheshire). -It is an SoC design based on the CVA6 core, implementing a 64-bit RISC-V CPU. - -Microkit outputs an ELF for this platform. Several steps are required in order to boot. - -A custom version of OpenSBI is required. It can be found -[here](https://github.com/pulp-platform/opensbi/tree/cheshire). -Build the firmware payload using platform `fpga/cheshire`. - -To boot a Microkit image, use a GDB prompt via openOCD per [seL4 Docs](https://docs.sel4.systems/Hardware/cheshire.html): - -1. Reset board - - (gdb) monitor reset halt - -2. Set the `a0` and `a1` registers for OpenSBI - - # tell OpenSBI where DTB is (there is none) - (gdb) set $a0=0 - # tell OpenSBI that the default hart is #0 - (gdb) set $a1=0 - -3. Load OpenSBI's FW_JUMP payload targeted at `0x90000000`, implicitly setting the program counter. - - (gdb) load /path/to/opensbi/fw_jump.elf - -4. Load the Microkit image: - - (gdb) restore /path/to/loader.img - -4. Allow OpenSBI and Microkit to boot: - - (gdb) continue - - -### i.MX8MM-EVK {#imx8mm_evk} - -Microkit will produce a raw binary file by default, so when using U-Boot run the following command: - - => go 0x41000000 - -### i.MX8MP-EVK {#imx8mp_evk} - -Microkit will produce a raw binary file by default, so when using U-Boot run the following command: - - => go 0x41000000 - -### i.MX8MQ-EVK {#imx8mq_evk} - -Microkit will produce a raw binary file by default, so when using U-Boot run the following command: - - => go 0x41000000 - -### MaaXBoard {#maaxboard} - -The MaaXBoard is a low-cost ARM SBC based on the NXP i.MX8MQ system-on-chip. - -Microkit will produce a raw binary file by default, so when using U-Boot run the following command: - - => go 0x50000000 - -### Odroid-C2 {#odroidc2} - -The HardKernel Odroid-C2 is an ARM SBC based on the Amlogic Meson S905 system-on-chip. It -should be noted that the Odroid-C2 is no longer available for purchase but its successor, -the Odroid-C4, is readily available at the time of writing. - -Microkit will produce a raw binary file by default, so when using U-Boot run the following command: - - => go 0x20000000 - -### Odroid-C4 {#odroidc4} - -The HardKernel Odroid-C4 is an ARM SBC based on the Amlogic Meson S905X3 system-on-chip. - -Microkit will produce a raw binary file by default, so when using U-Boot run the following command: - - => go 0x20000000 - -### Serengeti {#serengeti} - -Serengeti is a fork of the [Cheshire](#cheshire) platform by Trustworthy Systems. More -information on the hardware platform can be found [here](https://github.com/au-ts/serengeti). - -Right now Serengeti is a superset of Cheshire by offering more peripherals than Cheshire -has. - -For running on Serengeti, please see [Cheshire](#cheshire) for instructions. - -### SiFive Premier P550 {#hifive_p550} - -The SiFive Premier P550 is a development board based on the ESWIN EIC7700X system-on-chip. - -Microkit will produce a uImage. To load the image you will need to use -the `bootm` command. `bootm` expects an address of where -the Device Tree Blob (DTB) will be as well as the image. - -If you do not have a DTB for this platform you can obtain it from the seL4 source code with: -```sh -dtc -I dts -O dtb seL4/tools/dts/hifive-p550.dts > hifive-p550.dtb -``` - -Now you can load the images into U-Boot at the appropriate addresses, for example via TFTP: - - => setenv imgaddr "0xB0000000" - => setenv dtbaddr "0xA0000000" - => tftpboot ${imgaddr} /path/to/loader.img - => tftpboot ${dtbaddr} /path/to/hifive-p550.dtb - => bootm ${imgaddr} - ${dtbaddr} - -`imgaddr` and `dtbaddr` are arbitrarily chosen addresses in main memory for this platform, -you can load the image and DTB at another address. - -### QEMU virt (AArch64) {#qemu_virt_aarch64} - -Support is available for the virtual AArch64 QEMU platform. This is a platform that is not based -on any specific SoC or hardware platform and is intended for simulating systems for -development or testing. - -It should be noted that the platform support is configured with 2GB of main memory and the -Cortex-A53 CPU. seL4 needs to know the memory layout and CPU at build-time so if -you want to change these parameters (e.g to allow more memory), you will have to change the kernel -options for `qemu_virt_aarch64` in `build_sdk.py`. - -You can use the following command to simulate a Microkit system: - - $ qemu-system-aarch64 \ - -machine virt,virtualization=on \ - -cpu cortex-a53 \ - -nographic \ - -serial mon:stdio \ - -device loader,file=[SYSTEM IMAGE],addr=0x70000000,cpu-num=0 \ - -m size=2G - -When using the [SMP configurations](#multicore_config) add the `-smp 4` argument to the QEMU command. - -You can find more about the QEMU virt platform in the -[QEMU documentation](https://www.qemu.org/docs/master/system/target-arm.html). - -### QEMU virt (RISC-V 64-bit) {#qemu_virt_riscv64} - -Support is available for the virtual RISC-V (64-bit) QEMU platform. -This is a platform that is not based on any specific SoC or hardware platform -and is intended for simulating systems for development or testing. - -It should be noted that the platform support is configured with 2GB of main memory. -seL4 has a static amount of memory at build-time, if you want allow for more memory, -you will have to change the kernel options for `qemu_virt_riscv64` in `build_sdk.py`. - -You can use the following command to simulate a Microkit system: - - $ qemu-system-riscv64 \ - -machine virt \ - -nographic \ - -serial mon:stdio \ - -kernel [SYSTEM IMAGE] \ - -m size=2G - -When using the [SMP configurations](#multicore_config) add the `-smp 4` argument to the QEMU command. - -QEMU will start the system image using its packaged version of OpenSBI. - -You can find more about the QEMU virt platform in the -[QEMU documentation](https://www.qemu.org/docs/master/system/target-riscv.html). - -### Raspberry Pi 4B {#rpi4b_1gb} - -Support is available for the Raspberry Pi 4 Model B. There are multiple models of the -Raspberry Pi 4B that have different amounts of RAM, we have support for the 1GB, -2GB, 4GB and 8GB models. Because the amount of RAM must be known statically by -seL4, the Microkit board names differ for each model: - -* `rpi4b_1gb` for 1GB of RAM. -* `rpi4b_2gb` for 2GB of RAM. -* `rpi4b_4gb` for 4GB of RAM. -* `rpi4b_8gb` for 8GB of RAM. - -For initial board setup, please see the instructions on the -[seL4 website](https://docs.sel4.systems/Hardware/Rpi4.html). - -When getting into the U-Boot console you want to load the Microkit binary image to -address 0x10000000 and then run `go 0x10000000`. - -For example, if you were to load the image via the MMC you would run the following -U-Boot commands: - - => fatload mmc 0 0x10000000 - => go 0x10000000 - -### Pine64 ROCKPro64 {#rockpro64} - -Microkit will produce a raw binary file by default, so when using U-Boot run the following command: - - => go 0x30000000 - -### Pine64 Star64 {#star64} - -Support is available for the Pine64 Star64 platform which is based on the -StarFive JH7110 SoC. - -The platform has a 4GB and 8GB model, we assume the 4GB model. - -The default boot flow of the Star64 is: -1. OpenSBI -2. U-Boot -3. Operating System - -This means that the system image that Microkit produces does not need to be explicitly -packaged with an SBI implementation such as OpenSBI. - -Microkit will produce a uImage. To load the image you will need to use -the `bootm` command. `bootm` expects an address of where -the Device Tree Blob (DTB) will be as well as the image. - -If you do not have a DTB for this platform you can obtain it from the seL4 source code with: -```sh -dtc -I dts -O dtb seL4/tools/dts/star64.dts > star64.dtb -``` - -Now you can load the images into U-Boot at the appropriate addresses, for example via TFTP: - - => setenv imgaddr "0xE0000000" - => setenv dtbaddr "0xD0000000" - => tftpboot ${imgaddr} /path/to/loader.img - => tftpboot ${dtbaddr} /path/to/star64.dtb - => bootm ${imgaddr} - ${dtbaddr} - -`imgaddr` and `dtbaddr` are arbitrarily chosen addresses in main memory for this platform, -you can load the image and DTB at another address. - -### TQMa8XQP 1GB {#tqma8xqp1gb} - -The TQMa8XQP is a system-on-module designed by TQ-Systems GmbH. -The modules incorporates an NXP i.MX8X Quad Plus system-on-chip and 1GiB ECC memory. - -TQ-Systems provide the MBa8Xx carrier board for development purposes. -The instructions provided assume the use of the MBa8Xx carrier board. -If you are using a different carrier board please refer to the appropriate documentation. - -Note: There are different configured of the TQMa8Xx board which include different NXP SoCs -and different memory configurations. Such modules are not supported. - -The MBa8Xx provides access to the TQMa8XQP UART via UART-USB bridge. -To access the UART connect a USB micro cable to port **X13**. -The UART-USB bridge supports 4 individual UARTs; the UART is connected to the 2nd port. - -By default the SoM will autoboot using U-Boot. -Hit any key during the boot process to stop the autoboot. - -A new board will autoboot to Linux. -You will likely want to disable autoboot: - - => env set bootdelay -1 - => env save - -The board can be reset by pressing switch **S4** (located next to the Ethernet port). -Alternatively, you can use the `reset` command from the U-Boot prompt. - -During development the most convenient way to boot a Microkit image is via network booting. -U-Boot support booting via the *tftp* protocol. -To support this you'll want to configure the network. -U-Boot supports DHCP, however it is often more reliable to explicitly set an IP address. -For example: - - => env set ipaddr 10.1.1.2 - => env set netmask 255.255.255.0 - => env set serverip 10.1.1.1 - => env save - -To use tftp you also need to set the file to load and the memory address to load it to: - - => env set bootfile loader.img - => env set loadaddr 0x80280000 - => env save - -The system image generated by the Microkit tool by default is a raw binary file. - -An example sequence of commands for booting is: - - => tftpboot - => dcache flush - => icache flush - => go ${loadaddr} - -Rather than typing these each time you can create a U-Boot script: - - => env set microkit 'tftpboot; dcache flush; icache flush; go ${loadaddr}' - => env save - => run microkit - -When debugging is enabled the kernel will use the same UART as U-Boot. - -### Ultra96V2 {#ultra96v2} - -To run the built image on the board, you have to use properly patched U-Boot - please see the section for ZCU102, for the details. - -You have to load the binary file into memory and run it: -``` -ZynqMP> tftpboot 0x40000000 loader.img -... -ZynqMP> go 0x40000000 -``` - -### x86-64 generic {#x86_64_generic} - -This board supports x86-64 platforms with generic microarchitecture and no virtualisation. - -Up to 16 CPU cores are supported. If your platform's CPU count exceeds the maximum, the excess CPUs -are ignored by seL4. This limitation is due to a build-time config option of seL4, to increase the -limit, see the board configuration in `build_sdk.py`. - -On x86-64, Microkit produces 3 ELF images in the output directory: - -- `sel4.elf`, seL4 kernel (64-bit ELF) -- `sel4_32.elf`, seL4 kernel (32-bit ELF) -- Initial Task image (Multiboot Boot Module ELF) - -The filename of the initial task image is specified with the `-o` option, and defaults to loader.img. -Both kernel ELF files are written to the same directory as the initial task image. - -Although this target is for x86-64, your bootloader may require a 32-bit kernel ELF. - -When using QEMU, you must use the 32-bit kernel ELF, for example: - - $ qemu-system-x86_64 \ - -cpu qemu64,+fsgsbase,+pdpe1gb,+xsaveopt,+xsave \ - -m "1G" \ - -display none \ - -serial mon:stdio \ - -kernel sel4_32.elf \ - -initrd loader.img - -Unlike Microkit’s `qemu_virt_aarch64` and `qemu_virt_riscv64`, the amount of memory provided to QEMU -is configurable at run time with the `-m` option, rather than at build time. - -QEMU currently does not support 64-bit kernel ELFs and gives the following error: -``` -qemu-system-x86_64: Cannot load x86-64 image, give a 32bit one. -``` - -To obtain a bootable ISO image, a Multiboot 2-compliant bootloader must be used. Please refer to your -bootloader's documentations. - -### x86_64 generic {#x86_64_generic_vtx} - -This board supports x86-64 platforms with generic microarchitecture and virtualisation. - -This configuration assumes Intel VT-x support. Currently, only 1 vCPU is supported per virtual machine -on x86-64. - -The boot process is identical to [x86-64 generic](#x86_64_generic). - -This configuration exists because some x86 emulators (for example, QEMU on macOS on Apple Silicon) do -not emulate Intel VT-x. - -If you see the following message at boot: -``` -vt-x: not supported -``` -Consider using the non VT-x configuration: [x86-64 generic](#x86_64_generic), or switch to a x86 emulator that -emulates Intel VT-x, such as [Bochs](https://bochs.sourceforge.io/). - -### ZCU102 {#zcu102} - -The ZCU102 can run on a physical board or on an appropriate QEMU based emulator. - -Microkit will produce a raw binary file by default, so when using U-Boot run the following command: - - => go 0x40000000 - -For simulating the ZCU102 using QEMU, use the following command: - - $ qemu-system-aarch64 \ - -m size=4G \ - -machine xlnx-zcu102,virtualization=on \ - -nographic \ - -device loader,file=[SYSTEM IMAGE],addr=0x40000000,cpu-num=0 \ - -serial mon:stdio - -When using the [SMP configurations](#multicore_config) add the `-smp 4` argument to the QEMU command. - -It should be noted that when using U-Boot to load and run a Microkit system image, -that there may be additional setup needed. - -For the ZynqMP class of platforms, which the ZCU102 is apart of, U-Boot does not start -the Microkit system Exception Level 2 (EL2) which is necessary for Microkit to start -(this is because seL4 is configured as a hypervisor). - -You can see that when using the `go` command, U-Boot is -[unconditionally always dropping down to EL1](https://github.com/u-boot/u-boot/blob/8937bb265a7f2251c1bd999784a4ef10e9c6080d/board/xilinx/zynqmp/zynqmp.c#L234). - -To avoid this behaviour, the call to `armv8_switch_to_el1` should be replaced with -`armv8_switch_to_el2` in this `do_go_exec` function. - -### Adding Platform Support - -The following section is a guide for adding support for a new ARM or RISC-V platform to Microkit. - -#### Prerequisites - -Before you can start with adding platform support to Microkit, the platform must be supported by the seL4 kernel. -You can find information on how to do so [here](https://docs.sel4.systems/projects/sel4/porting.html). - -#### Getting Microkit Components Working - -##### build_sdk.py - -The first step to adding Microkit support is to modify the `build_sdk.py` script in order to build the required -artefacts for the new platform. This involves adding to the `SUPPORTED_BOARDS` list with the `BoardInfo` options -containing the platform specific attributes. This should be fairly self-explanatory by looking at the existing -entries with the exception of the `loader_link_address`. - -The `loader_link_address` parameter specifies the physical address of where the bootloader for Microkit (which -is responsible for setting up the system before seL4 starts) is going to be loaded. This address needs to -match where in main memory the final system image is actually loaded (e.g where a previous bootloader such as U-Boot -loads the image to). This means that the address is restricted to the platform's main memory region. - -##### Loader - -###### UART - -The other component of Microkit that is platform dependent is the loader itself. The loader will attempt to access -the UART for debug output which requires a basic `putc` implementation. The UART device used in the loader should be -the same as what is used for the seL4 kernel debug output. - -It should be noted that on RISC-V platforms, the SBI will be used for `putc` so no porting is necessary. - -###### CPU configuration - -For supporting multi-core systems on Microkit, the loader needs to know the platform-specific CPU identifiers -that we want to make use of. - -For ARM platforms, a `psci_target_cpus` array needs to be defined which contains the PSCI `target_cpu` value for -each CPU. This value can be found by looking at the `reg` field for each CPU in the Device Tree. - -For RISC-V platforms, a `hart_ids` array needs to be defined which contains the Hart ID for -each CPU. This value can be found by looking at the `reg` field for each CPU in the Device Tree. The first value -must be the same as `FIRST_HART_ID` defined in seL4. - -##### Next steps - -Once you have patched the loader and the SDK build script, there should be no other changes required to have a working -platform port. It is a good idea at this point to boot a hello world system to confirm the port is working. - -If there are issues with porting the platform, please [open an issue on GitHub](https://github.com/sel4/microkit). - -#### Contributing Platform Support - -Once you believe that the port works, you can [open a pull request](https://github.com/seL4/microkit/pulls) with required -changes as well as documentation in the manual about the platform and how to run Microkit images on it. - -Please also update the `platforms.yml` file, you can find more information at the top of the file. - -## Rationale - -This section describes the rationales driving the Microkit design choices. - -### Overview - -The seL4 microkernel provides a set of powerful and flexible mechanisms that can be used for building almost arbitrary systems. -While minimising constraints on the nature of system designs and scope of deployments, this flexibility makes it challenging to design the best system for a particular use case, requiring extensive seL4 experience from developers. - -The Microkit addresses this challenge by constraining the -system architecture to one that provides enough features and power for -its target usage class (IoT, cyberphysical and other embedded systems -with a static architecture), enabling a much simpler set of developer-visible abstractions. - -### Protection Domains - -PDs are single-threaded to keep the programming model and implementations simple, and because this serves the needs of most present use cases in the target domains. -Extending the model to multithreaded applications (clients) is straightforward and can be done if needed. -Extending to multithreaded services is possible but requires additional infrastructure for which we see no need in the near future. - -### Protected Procedure Priorities - -The restriction of only calling to higher priority prevents deadlocks and reflects the notion that the callee operates on behalf of the caller, and it should not be possible to preempt execution of the callee unless the caller could be preempted as well. - -This greatly simplifies reasoning about real-time properties in the system; in particular, it means that PPs can be used to implement *resource servers*, where shared resources are encapsulated in a component that ensures mutual exclusion, while avoiding unbounded priority inversions through the *immediate priority ceiling protocol*. - -While it would be possible to achieve the same by allowing PPs between PDs of the same priority, this would be much harder to statically analyse for loop-freedom (and thus deadlock-freedom). -The drawback is that we waste a part of the priority space where a logical entity is split into multiple PDs, eg to separate out a particularly critical component to formally verify it, when the complete entity would be too complex for formal verification. -For the kinds of systems targeted by the Microkit, this reduction of the usable priority space is unlikely to cause problems. - -### Protected Procedure Argument Size - -The limitation on the size of by-value arguments is forced by the (architecture-dependent) limits on the payload size of the underlying seL4 operations, as well as by efficiency considerations. -The protected procedure payload should be considered as analogous to function arguments in the C language; similar limitations exist in the C ABIs (Application Binary Interfaces) of various platforms. - -### Limits - -The limitation on the number of protection domains in the system is relatively arbitrary. -Based on experience with the system and the types of systems being built it is possible for this to be increased in the future. - -The limitation on the number of channels for a protection domain is based on the size of the notification word in seL4. -Changing this to be larger than 64 would most likely require changes to seL4. The reason for why the limit is not a -power of two is due to part of the notification word being for internal libmicrokit use. - -## Internals - -The following section describes internal details for how the Microkit works -and all the components of Microkit. As a user of Microkit, it is not necessary -know this information, however, there is no harm in having a greater -understanding of the tools that you are using. - -![Microkit flow](assets/microkit_flow.svg) - -The diagram above aims to show the general flow of a Microkit system from -build-time to run-time. - -The user provides the SDF (System Description File) and the ELFs that -correspond to PD program images to the Microkit tool which is responsible -for packaging everything together into a single image for the target -platform. - -#### ARM and RISC-V - -The final image is a bootable image which contains a couple different things: - -* the Microkit loader -* seL4 -* the capDL initialiser (and associated capDL specification) - -When booting the image, the Microkit loader starts, jumps to the kernel, which -starts the capDL initialiser, which then sets up the entire system and starts -all the PDs, including the Monitor. - -#### x86 - -The tool produces the kernel image and boot module image that contains the capDL initialiser. -You must bring your own Multiboot 2 compliant bootloader which then loads the kernel and boot module. - -Now, we will go into a bit more detail about each of these stages of the -booting process as well as what exactly the Microkit tool is doing. - -### Loader (ARM and RISC-V) - -The loader starts first, it has two main jobs: - -1. Unpack all the parts of the system (kernel and initialiser) into - their expected locations within main memory. -2. Finish initialising the hardware such that the rest of the system can start. - -Before the Microkit loader starts, there would most likely have been some other -bootloader such as U-Boot or firmware on the target that did its own hardware -initialisation before starting Microkit. - -However, there are certain things that seL4 expects to be initialised -that will not be done by a previous booting stage, such as: - -* changing to the right exception level -* enabling the MMU (seL4 expects the MMU to be on when it starts) -* interrupt controller setup - -Once this is all completed, the loader jumps to seL4 which starts executing. -The loader will never be executed again. - -### capDL Initialiser - -Once the kernel has done its own initialisation, it will begin the -'initial task'. On seL4, this is a thread that contains all the initial -capabilities to resources and free memory that are used to setup the rest of the system. - -Within a Microkit environment, the 'initial task' is the capDL initialiser. Its main -job is to initialises and starts the system in conformance with the capDL specification. - -At build-time, the Microkit tool embeds the capDL specification that describe -all kernel objects that needs to be created. Then for each kernel object, the spec -describe what state they need to be in and what capabilities exist to that object -(i.e. who has access to this kernel object). For example, the spec would specify the: -- starting Instruction Pointer (IP), Stack Pointer (SP) and IPC buffer pointer of a Thread Control Block (TCB), -- page table structure and mapping attributes of an address space (VSpace), -- interrupts (IRQ), -- scheduling parameters (Scheduling Context), -- and so on... - -### Monitor - -The Monitor is a special PD that executes at the highest priority. It's job -is to receive any faults caused by protection domains crashing or causing exceptions. - -After the monitor initialises itself, goes to sleep and waits for any -faults from protection domains. On debug mode, this results in a message about -which PD caused an exception and details on the PD's state at the time of the fault. - -Other than printing fault details, the monitor does not do anything to handle -the fault, it will simply go back to sleep waiting for any other faults. - -### libmicrokit {#libmicrokit_internals} - -Unlike the previous sections, libmicrokit is not its own program but it is worth -a mention since it makes up the core of each protection domain in a system. - -When each PD starts, we enter libmicrokit's starting point which does some initial -setup and calls the `init` entry point specified by the user. Once that completes, -the PD will enter libmicrokit's event handler which sleeps until it receives events. - -These events could be notifies (from other PDs or from an interrupt), PPCs, and faults. -For each event, the appropriate user-specified entry point is called and then when it -returns the PD goes back to sleep, waiting on any more events. - -### Microkit tool - -The Microkit tool's ultimate job is to take in the description of the user's system, -the SDF, and convert into an seL4 system that boots and executes. - -There are obvious steps such as parsing the SDF and PD ELFs. But the majority of -the work done by the tool is converting the system description into the capDL specification -then embedding it into the capDL initialiser image. - -#### ARM & RISC-V specific -Since the physical memory layout of ARM and RISC-V platforms can be determined at boot -time by reading the device tree. The Microkit tool goes one step further and statically -check that the produced capDL specification is bootable on the target board. For example, -we check that there are no frames outside of device or normal memory, and that there are -enough memory to create all required kernel objects. - -In order to do this however, the Microkit tool needs to emulate how the seL4 kernel boot -to obtain the list of free untyped objects that the kernel would give to the initial task. - -While this is non-trivial to do, it comes with the useful property that if the tool -produces a valid image, there should be no errors upon initialising the system -If there are any errors with configuring the system (e.g running out of memory), -they will be caught at build-time. This can only reasonably be done due to the -static-architecture of Microkit systems. diff --git a/projects/microkit/manual/latest b/projects/microkit/manual/latest deleted file mode 120000 index 50aea0e7aba..00000000000 --- a/projects/microkit/manual/latest +++ /dev/null @@ -1 +0,0 @@ -2.1.0 \ No newline at end of file diff --git a/projects/microkit/manual/latest/assets/microkit_flow.pdf b/projects/microkit/manual/latest/assets/microkit_flow.pdf new file mode 100644 index 00000000000..3e81338977d Binary files /dev/null and b/projects/microkit/manual/latest/assets/microkit_flow.pdf differ diff --git a/projects/microkit/manual/latest/assets/microkit_flow.svg b/projects/microkit/manual/latest/assets/microkit_flow.svg new file mode 100644 index 00000000000..38182873b6c --- /dev/null +++ b/projects/microkit/manual/latest/assets/microkit_flow.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/microkit/manual/latest/index.html b/projects/microkit/manual/latest/index.html new file mode 100644 index 00000000000..0d52e84cb58 --- /dev/null +++ b/projects/microkit/manual/latest/index.html @@ -0,0 +1,2641 @@ + + + + + + + Microkit User Manual (v2.1.0) | seL4 docs + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/microkit/manual/latest/microkit_user_manual.pdf b/projects/microkit/manual/latest/microkit_user_manual.pdf new file mode 100644 index 00000000000..27c33193214 Binary files /dev/null and b/projects/microkit/manual/latest/microkit_user_manual.pdf differ diff --git a/projects/microkit/platforms.html b/projects/microkit/platforms.html new file mode 100644 index 00000000000..33e114a8e5e --- /dev/null +++ b/projects/microkit/platforms.html @@ -0,0 +1,750 @@ + + + + + + + Microkit Supported Platforms | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/microkit/platforms.md b/projects/microkit/platforms.md deleted file mode 100644 index a9e2e5dd299..00000000000 --- a/projects/microkit/platforms.md +++ /dev/null @@ -1,105 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 Proofcraft Pty Ltd ---- - -# Microkit Supported Platforms - -The following platforms are supported by the seL4 Microkit. See also the section -on [Board Support Packages](manual/latest/#bsps) in the Microkit manual. - -Microkit currently supports [Arm](#arm) AArch64 and [RISC-V](#risc-v) boards. x64 -support is on the [roadmap](roadmap.html). - -{%- assign platforms = site.data.microkit_platforms.platforms %} - -## Arm - -| Platform | System-on-chip | Core | Microkit platform | -| - | - | - | - | - -{%- assign has_upcoming = false %} -{%- for p in platforms %} -{%- if p.since == 'dev' %} -{%- assign has_upcoming = true %} -{%- continue %} -{%- endif %} -{%- assign pages = site.pages | where: "cmake_plat", p.cmake_plat %} -{%- if pages.size == 1 %} -{%- assign pg = pages[0] %} -{%- if pg.arm_hardware != true %} -{%- continue %} -{%- endif %} -{%- assign display_name = pg.platform %} -{%- assign soc = pg.soc %} -{%- assign cpu = p.cpu | default: pg.cpu %} -{%- else %} -{%- assign display_name = p.name %} -{%- assign soc = "" %} -{%- assign cpu = p.cpu | default: "" %} -{%- endif %} -| [{{ display_name }}](manual/latest/#{{p.name}}) | {{ soc }} | {{ cpu }} | `{{ p.name }}` | -{%- endfor %} - -## RISC-V - -| Platform | System-on-chip | Core | Microkit platform | -| - | - | - | - | - -{%- for p in platforms %} -{%- if p.since == 'dev' %} -{%- assign has_upcoming = true %} -{%- continue %} -{%- endif %} -{%- assign pages = site.pages | where: "cmake_plat", p.cmake_plat %} -{%- if pages.size == 1 %} -{%- assign pg = pages[0] %} -{%- if pg.riscv_hardware != true %} -{%- continue %} -{%- endif %} -{%- assign display_name = pg.platform %} -{%- assign soc = pg.soc %} -{%- assign cpu = p.cpu | default: pg.cpu %} -{%- assign arch = pg.arch %} -{%- else %} -{%- assign display_name = p.name %} -{%- assign soc = "" %} -{%- assign cpu = p.cpu | default: "" %} -{%- endif %} -| [{{ display_name }}](manual/latest/#{{p.name}}) | {{ soc }} | {{ cpu }} | `{{ p.name }}` | -{%- endfor %} - -{%- if has_upcoming %} - -## Upcoming in the next release - -| Platform | System-on-chip | Core | Microkit platform | -| - | - | - | - | - -{%- for p in platforms %} -{%- if p.since != 'dev' %} -{%- continue %} -{%- endif %} -{%- assign pages = site.pages | where: "cmake_plat", p.cmake_plat %} -{%- if pages.size == 1 %} -{%- assign pg = pages[0] %} -{%- assign url = pg.url | relative_url %} -{%- assign display_name = '[' | append: pg.platform | append: '](' | append: url | append: ')' %} -{%- assign soc = pg.soc %} -{%- assign cpu = p.cpu | default: pg.cpu %} -{%- else %} -{%- assign display_name = p.name %} -{%- assign soc = "" %} -{%- assign cpu = p.cpu | default: "" %} -{%- endif %} -| {{ display_name }} | {{ soc }} | {{ cpu }} | `{{ p.name }}` | -{%- endfor %} - -{%- endif %} - -## Not in the list above? - -See the section on [adding platform -support](manual/latest/#adding-platform-support) for how to add a new platform to -Microkit. To add a platform to Microkit it must be supported by seL4 first. See -the seL4 page on [supported platforms](../../Hardware/#not-in-the-lists-above) for options on that. diff --git a/projects/microkit/releases.md b/projects/microkit/releases.md deleted file mode 100644 index e4c4cc6fcac..00000000000 --- a/projects/microkit/releases.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -permalink: /releases/microkit.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 Proofcraft Pty Ltd ---- - -# Microkit releases - -This page documents tagged releases of the seL4 [Microkit](../projects/microkit/) and their -corresponding SDK downloads and GPG signatures. - -The downloads are signed by Ivan Velickovic with the -key fingerprint `EFC6 142C FE61 C255 B4CD E959 6FBD 87E8 4FA8 89BB`. The key -is available from . - -{% assign coll = site['releases'] | where: "project", "microkit" %} -{% comment %} -Sort sorts by string sorting so a version of 2.3.0 is higher than 10.0.0. -Because of this we need to split the list into two before sorting. -{% endcomment %} -{% assign releases_1 = coll | where_exp:"item", "item.version_digits != 2" | sort: "version" %} -{% assign releases_2 = coll | where_exp:"item", "item.version_digits == 2" | sort: "version" %} -{% assign releases = releases_1 | concat: releases_2 %} - -{% assign sdk_downloads = site.data.projects.microkit.sdk_downloads %} - -{% for release in releases reversed -%} - -## {{ release.title }} {% if forloop.first %}(latest){% endif %} - -[Release notes]({{ release.url | relative_url }}) - - - - - - - - - - - -{%- assign sdks = sdk_downloads | where: "version", release.title %} -{%- assign sdks = sdks[0] %} -{%- for sdk in sdks.sdks %} - - - - - - -{%- endfor %} - -
OSArchDownloadSignature
{{ sdk.os }}{{ sdk.arch }}{{ sdk.label }}sig
- -{% endfor %} diff --git a/projects/microkit/roadmap.html b/projects/microkit/roadmap.html new file mode 100644 index 00000000000..478d2f0d401 --- /dev/null +++ b/projects/microkit/roadmap.html @@ -0,0 +1,624 @@ + + + + + + + Microkit roadmap | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/microkit/roadmap.md b/projects/microkit/roadmap.md deleted file mode 100644 index 57d19a43821..00000000000 --- a/projects/microkit/roadmap.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 UNSW ---- - -# Microkit roadmap - -Microkit is actively developed and so there are various features that -intend to be added to support the community's needs. - -This page talks about major features, for smaller improvements or -bugs see [GitHub issues](https://github.com/seL4/microkit/issues). - -If you have a particular feature that is not listed here or need clarity -on its status, please [open an issue on GitHub](https://github.com/seL4/microkit/issues) -or [contact the developers](https://sel4.systems/support.html). - -| Feature | Current status | Timeline | Availability | -|-----------------------------------------------------------| -| Multi-core support | Merged, available in 2.1.0 | Q4'25 | [PR #353](https://github.com/seL4/microkit/pull/353) | -| [x86 support](#x86) | Merged, available in 2.1.0 | Q4'25 | [PR #337](https://github.com/seL4/microkit/pull/337) | -| [Multi-kernel support](#multikernel) | Actively worked on. | Q4'25 | [Branch](https://github.com/au-ts/multikernel-manifest/) | -| [PD templates](#templates) | Initial work explored, requires more experimentation and development. | Q1'26 | N/A | - -## Feature details - -### x86 support {#x86} - -x86-64 support is available in the latest Microkit (since [PR #337](https://github.com/seL4/microkit/pull/337)), -but not in an available release. The next release will contain x86-64 support. - -### Multi-kernel support {#multikernel} - -seL4 supports running on multiple cores, however there are no verified multi-core configurations. -As verified multi-core is a while away, one strategy to get a multi-core system working with -single-core seL4 is to run an instance of seL4 on each core. This feature requires a number of internal -changes but should be mostly transparent to the user. - -This is being actively worked on, more details can be found [here](https://github.com/au-ts/multikernel-manifest/). - -### PD templates {#templates} - -Microkit systems have a 'static architecture', each PD declares what resources it needs at -build-time. This restriction provides useful properties but can be too limiting for certain -systems. - -PD templates aim to allow PDs to be loaded at run-time and claim different resources. The -total potential resources any PD might have at a given time is still known at build-time, -but this allows some flexibilty particularly when doing something like live-upgrading a -system. - -This feature is still in the somewhat early stages so is unlikely to be available soon. diff --git a/projects/microkit/setting-up.html b/projects/microkit/setting-up.html new file mode 100644 index 00000000000..6f9ae11502d --- /dev/null +++ b/projects/microkit/setting-up.html @@ -0,0 +1,568 @@ + + + + + + + Setting up your machine to use Microkit | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/microkit/setting-up.md b/projects/microkit/setting-up.md deleted file mode 100644 index 42d2940fdad..00000000000 --- a/projects/microkit/setting-up.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 Proofcraft Pty Ltd ---- - -# Setting up your machine to use Microkit - -The seL4 Microkit is distributed as a software development kit (SDK) for Linux -and Mac on Intel and Arm architectures and needs no further setup. - -You are free to choose your own development environment and build system. For an -example, see the [Microkit tutorial](tutorial/welcome.html), or the `example` -folder in the SDK together with the [Microkit manual](manual/latest/). - -The SDK for the latest release can be downloaded below: - -{% assign coll = site['releases'] | where: "project", "microkit" %} -{% comment %} -Sort sorts by string sorting so a version of 2.3.0 is higher than 10.0.0. -Because of this we need to split the list into two before sorting. -{% endcomment %} -{% assign releases_1 = coll | where_exp:"item", "item.version_digits != 2" | sort: "version" %} -{% assign releases_2 = coll | where_exp:"item", "item.version_digits == 2" | sort: "version" %} -{% assign releases = releases_1 | concat: releases_2 | reverse %} -{% assign sdk_downloads = site.data.projects.microkit.sdk_downloads %} -{% assign release = releases[0] -%} - -- Release [{{ release.title }}]({{ release.url | relative_url }}) -{%- assign sdks = sdk_downloads | where: "version", release.title %} -{%- assign sdks = sdks[0] %} -{%- for sdk in sdks.sdks %} - - [{{ sdk.label }}]({{sdk.url}}) [[sig]({{sdk.url}}.asc)] -{%- endfor %} diff --git a/projects/microkit/tutorial/assets b/projects/microkit/tutorial/assets deleted file mode 120000 index de6efb55a38..00000000000 --- a/projects/microkit/tutorial/assets +++ /dev/null @@ -1 +0,0 @@ -../../../_repos/au-ts/microkit_tutorial/website/src/assets \ No newline at end of file diff --git a/projects/microkit/tutorial/assets/PD starting.svg b/projects/microkit/tutorial/assets/PD starting.svg new file mode 100644 index 00000000000..d4d38c8dcf1 --- /dev/null +++ b/projects/microkit/tutorial/assets/PD starting.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/projects/microkit/tutorial/assets/overview.svg b/projects/microkit/tutorial/assets/overview.svg new file mode 100644 index 00000000000..ba7f7bbc54e --- /dev/null +++ b/projects/microkit/tutorial/assets/overview.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/microkit/tutorial/assets/part1/event_loop.svg b/projects/microkit/tutorial/assets/part1/event_loop.svg new file mode 100644 index 00000000000..39e1675a94c --- /dev/null +++ b/projects/microkit/tutorial/assets/part1/event_loop.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/projects/microkit/tutorial/assets/part1/overview.svg b/projects/microkit/tutorial/assets/part1/overview.svg new file mode 100644 index 00000000000..200e04d1a0f --- /dev/null +++ b/projects/microkit/tutorial/assets/part1/overview.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/projects/microkit/tutorial/assets/part2/overview.svg b/projects/microkit/tutorial/assets/part2/overview.svg new file mode 100644 index 00000000000..34ab1b5a95d --- /dev/null +++ b/projects/microkit/tutorial/assets/part2/overview.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/microkit/tutorial/assets/part3/overview.svg b/projects/microkit/tutorial/assets/part3/overview.svg new file mode 100644 index 00000000000..e199286a159 --- /dev/null +++ b/projects/microkit/tutorial/assets/part3/overview.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/projects/microkit/tutorial/assets/part4/passthrough.svg b/projects/microkit/tutorial/assets/part4/passthrough.svg new file mode 100644 index 00000000000..946d7ec10a9 --- /dev/null +++ b/projects/microkit/tutorial/assets/part4/passthrough.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/microkit/tutorial/assets/pd_starting.svg b/projects/microkit/tutorial/assets/pd_starting.svg new file mode 100644 index 00000000000..23f1e10180b --- /dev/null +++ b/projects/microkit/tutorial/assets/pd_starting.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/projects/microkit/tutorial/assets/rpi3_gpio.png b/projects/microkit/tutorial/assets/rpi3_gpio.png new file mode 100644 index 00000000000..24238cc23d8 Binary files /dev/null and b/projects/microkit/tutorial/assets/rpi3_gpio.png differ diff --git a/projects/microkit/tutorial/assets/serial_server.svg b/projects/microkit/tutorial/assets/serial_server.svg new file mode 100644 index 00000000000..54ff80211a6 --- /dev/null +++ b/projects/microkit/tutorial/assets/serial_server.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/projects/microkit/tutorial/end.html b/projects/microkit/tutorial/end.html new file mode 100644 index 00000000000..9d9858ffd58 --- /dev/null +++ b/projects/microkit/tutorial/end.html @@ -0,0 +1,600 @@ + + + + + + + Microkit Tutorial - End | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + +
+
+ + + +
+ +
+
+ + diff --git a/projects/microkit/tutorial/end.md b/projects/microkit/tutorial/end.md deleted file mode 100644 index 5ecd0d323e7..00000000000 --- a/projects/microkit/tutorial/end.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Microkit Tutorial - End -nav_prev: part4.html -SPDX-License-Identifier: CC-BY-NC-SA-4.0 -SPDX-FileCopyrightText: 2025 Ivan Velickovic ---- - -{% include include_external_markdown.md - file="_processed/microkit-tutorial/end.md" %} diff --git a/projects/microkit/tutorial/part0.html b/projects/microkit/tutorial/part0.html new file mode 100644 index 00000000000..f8101d8dca8 --- /dev/null +++ b/projects/microkit/tutorial/part0.html @@ -0,0 +1,823 @@ + + + + + + + Microkit Tutorial - Setting Up | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + +
+
+ + + +
+ +
+
+ + diff --git a/projects/microkit/tutorial/part0.md b/projects/microkit/tutorial/part0.md deleted file mode 100644 index 8aca5aac3df..00000000000 --- a/projects/microkit/tutorial/part0.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Microkit Tutorial - Setting Up -nav_prev: welcome.html -nav_next: part1.html -SPDX-License-Identifier: CC-BY-NC-SA-4.0 -SPDX-FileCopyrightText: 2025 Ivan Velickovic ---- - -{% include include_external_markdown.md - file="_processed/microkit-tutorial/part0.md" %} diff --git a/projects/microkit/tutorial/part1.html b/projects/microkit/tutorial/part1.html new file mode 100644 index 00000000000..872e1115326 --- /dev/null +++ b/projects/microkit/tutorial/part1.html @@ -0,0 +1,939 @@ + + + + + + + Microkit Tutorial - Serial server | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + +
+
+ + + +
+ +
+
+ + diff --git a/projects/microkit/tutorial/part1.md b/projects/microkit/tutorial/part1.md deleted file mode 100644 index 410bbbb2b6a..00000000000 --- a/projects/microkit/tutorial/part1.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Microkit Tutorial - Serial server -nav_prev: part0.html -nav_next: part2.html -SPDX-License-Identifier: CC-BY-NC-SA-4.0 -SPDX-FileCopyrightText: 2025 Ivan Velickovic ---- - -{% include include_external_markdown.md - file="_processed/microkit-tutorial/part1.md" %} diff --git a/projects/microkit/tutorial/part2.html b/projects/microkit/tutorial/part2.html new file mode 100644 index 00000000000..8aa00340680 --- /dev/null +++ b/projects/microkit/tutorial/part2.html @@ -0,0 +1,776 @@ + + + + + + + Microkit Tutorial - Client | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + +
+
+ + + +
+ +
+
+ + diff --git a/projects/microkit/tutorial/part2.md b/projects/microkit/tutorial/part2.md deleted file mode 100644 index 1ec10a2b93b..00000000000 --- a/projects/microkit/tutorial/part2.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Microkit Tutorial - Client -nav_prev: part1.html -nav_next: part3.html -SPDX-License-Identifier: CC-BY-NC-SA-4.0 -SPDX-FileCopyrightText: 2025 Ivan Velickovic ---- - -{% include include_external_markdown.md - file="_processed/microkit-tutorial/part2.md" %} diff --git a/projects/microkit/tutorial/part3.html b/projects/microkit/tutorial/part3.html new file mode 100644 index 00000000000..67791441d35 --- /dev/null +++ b/projects/microkit/tutorial/part3.html @@ -0,0 +1,641 @@ + + + + + + + Microkit Tutorial - Wordle server | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + +
+
+ + + +
+ +
+
+ + diff --git a/projects/microkit/tutorial/part3.md b/projects/microkit/tutorial/part3.md deleted file mode 100644 index 2d396a4188e..00000000000 --- a/projects/microkit/tutorial/part3.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Microkit Tutorial - Wordle server -nav_prev: part2.html -nav_next: part4.html -SPDX-License-Identifier: CC-BY-NC-SA-4.0 -SPDX-FileCopyrightText: 2025 Ivan Velickovic ---- - -{% include include_external_markdown.md - file="_processed/microkit-tutorial/part3.md" %} diff --git a/projects/microkit/tutorial/part4.html b/projects/microkit/tutorial/part4.html new file mode 100644 index 00000000000..cb0bf3ad562 --- /dev/null +++ b/projects/microkit/tutorial/part4.html @@ -0,0 +1,784 @@ + + + + + + + Microkit Tutorial - Virtual machines | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + +
+
+ + + +
+ +
+
+ + diff --git a/projects/microkit/tutorial/part4.md b/projects/microkit/tutorial/part4.md deleted file mode 100644 index 57b842c33c6..00000000000 --- a/projects/microkit/tutorial/part4.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Microkit Tutorial - Virtual machines -nav_prev: part3.html -nav_next: end.html -SPDX-License-Identifier: CC-BY-NC-SA-4.0 -SPDX-FileCopyrightText: 2025 Ivan Velickovic ---- - -{% include include_external_markdown.md - file="_processed/microkit-tutorial/part4.md" %} diff --git a/projects/microkit/tutorial/welcome.html b/projects/microkit/tutorial/welcome.html new file mode 100644 index 00000000000..6ed94c6576a --- /dev/null +++ b/projects/microkit/tutorial/welcome.html @@ -0,0 +1,595 @@ + + + + + + + Microkit Tutorial Welcome | seL4 docs + + + + + + + + + + + + +
+ + + +
+ +
+
+
+ + + +
+
+ + + +
+ +
+
+ + diff --git a/projects/microkit/tutorial/welcome.md b/projects/microkit/tutorial/welcome.md deleted file mode 100644 index 66361302136..00000000000 --- a/projects/microkit/tutorial/welcome.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Microkit Tutorial Welcome -nav_next: part0.html -SPDX-License-Identifier: CC-BY-NC-SA-4.0 -SPDX-FileCopyrightText: 2025 Ivan Velickovic ---- - -{% include include_external_markdown.md - file="_processed/microkit-tutorial/welcome.md" %} diff --git a/projects/roadmap.html b/projects/roadmap.html new file mode 100644 index 00000000000..6ac01856fa8 --- /dev/null +++ b/projects/roadmap.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/roadmap.md b/projects/roadmap.md deleted file mode 100644 index 0a5ec2b4de0..00000000000 --- a/projects/roadmap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. -redirect_to: https://sel4.systems/roadmap.html ---- diff --git a/projects/rust/.gitignore b/projects/rust/.gitignore deleted file mode 100644 index 0c8db9fc863..00000000000 --- a/projects/rust/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright 2025 seL4 Project a Series of LF Projects, LLC. -# SPDX-License-Identifier: BSD-2-Clause - -/tutorial/ diff --git a/projects/rust/how-to-use.html b/projects/rust/how-to-use.html new file mode 100644 index 00000000000..7a8f86019dc --- /dev/null +++ b/projects/rust/how-to-use.html @@ -0,0 +1,600 @@ + + + + + + + Rust: How to Use | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/rust/how-to-use.md b/projects/rust/how-to-use.md deleted file mode 100644 index aab2e95ad53..00000000000 --- a/projects/rust/how-to-use.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -repo_link: https://github.com/seL4/rust-sel4/blob/main/ -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Rust: How to Use - -Using these crates requires a compatible Rust toolchain. See the project's [rust-toolchain.toml]({{page.repo_link}}/rust-toolchain.toml) for the particular toolchain version that is used for testing. Note that these crates use nightly-only features, so, if you are using a stable toolchain, you must set the environment variable `RUSTC_BOOTSTRAP=1`. - -These crates are not yet hosted on [crates.io](https://crates.io). Use them either as Git or path -Cargo dependencies. - -## Environment Variables - -Some of these crates depend, at build time, on external components and configuration. In all cases, -information for locating these dependencies is passed to the dependant crates via environment -variables which are interpreted by `build.rs` scripts. Here is a list of environment variables and -the crates which use them: - -- `sel4-config` and `sel4-sys`, whose dependants include `sel4`, `sel4-root-task`, `sel4-microkit`, - and many more, use `$SEL4_INCLUDE_DIRS` (defaulting to `$SEL4_PREFIX/libsel4/include` if - `$SEL4_PREFIX` is set) which must contain a colon-separated list of include paths for the libsel4 - headers. See the the `sel4` crate's rustdoc for more information. -- `sel4-platform-info`, whose dependants include `sel4-kernel-loader`, uses `$SEL4_PLATFORM_INFO` - (defaulting to `$SEL4_PREFIX/support/platform_gen.yaml` if `$SEL4_PREFIX` is set) which must - contain the path of the `platform_gen.yaml` file from the seL4 kernel build system. -- `sel4-kernel-loader` uses `$SEL4_KERNEL` (defaulting to `$SEL4_PREFIX/bin/kernel.elf` if - `$SEL4_PREFIX` is set) which must contain the path of the seL4 kernel (as an ELF executable). - -## Language Runtime Crates - -Two language runtime crates, one for root tasks and another for Microkit protection domains, provide runtime elements such as an entry point, thread-local storage, panic handling, a stack, and a heap. See their API docs (linked below) for information on how to use them. - -- [`sel4-root-task`]({{page.repo_link}}/crates/sel4-root-task): A runtime for root tasks that supports thread-local -storage and unwinding, and provides a global allocator. -[rustdoc](https://sel4.github.io/rust-sel4/views/aarch64-root-task/aarch64-sel4/doc/sel4_root_task/index.html) -- [`sel4-microkit`]({{page.repo_link}}/crates/sel4-microkit): A runtime for [seL4 -Microkit](../microkit/) protection domains, including an implementation of -libmicrokit and abstractions for IPC. -[rustdoc](https://sel4.github.io/rust-sel4/views/aarch64-microkit/aarch64-sel4-microkit/doc/sel4_microkit/index.html) - -## Choosing a `--target` argument for `rustc` {#target-spec} - -`rustc`'s baremetal builtin target triples (e.g. `aarch64-unknown-none`) will suffice, but we provide a collection of [custom target specifications](https://doc.rust-lang.org/beta/rustc/targets/custom.html) that are tuned specifically for use in seL4 userspace, and that cover a range of language runtime configurations. See [the source directory that contains them]({{page.repo_link}}/support/targets#readme) for more information. - -## Demos - -These demos provide concrete examples of how to integrate these crates into a seL4-based project: - -- [Simple root task](https://github.com/seL4/rust-root-task-demo) -- [Simple system using the seL4 Microkit](https://github.com/seL4/rust-microkit-demo) -- [HTTP server using the seL4 Microkit](https://github.com/seL4/rust-microkit-http-server-demo) diff --git a/projects/rust/index.html b/projects/rust/index.html new file mode 100644 index 00000000000..36cdd2c8c12 --- /dev/null +++ b/projects/rust/index.html @@ -0,0 +1,699 @@ + + + + + + + Rust | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/rust/index.md b/projects/rust/index.md deleted file mode 100644 index 7ed2084a774..00000000000 --- a/projects/rust/index.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -project: rust - -redirect_from: - - /Rust - -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Rust - -seL4 officially supports the use of Rust in userspace. This support entails: - -- Rust bindings for the seL4 API ([source](https://github.com/seL4/rust-sel4/tree/main/crates/sel4)) -- A runtime for root tasks ([source](https://github.com/seL4/rust-sel4/tree/main/crates/sel4-root-task)) -- A runtime for [seL4 Microkit](../microkit) protection domains - ([source](https://github.com/seL4/rust-sel4/tree/main/crates/sel4-microkit)) -- Custom `rustc` target specifications for seL4 userspace ([JSON and docs](https://github.com/seL4/rust-sel4/tree/main/support/targets#readme)) -- Many more crates for use in seL4 userspace ([Sources](https://github.com/seL4/rust-sel4/tree/main/crates/)) - -
- - {% include card.html - icon="arrow-right-end-on-rectangle" - title="Tutorial" - body="Learn how to use Rust in seL4 userspace." - link="/projects/rust/tutorial/introduction.html" - %} - - {% include card.html - icon="document-magnifying-glass" - title="API" - body="Rustdoc for the crates mantained by the seL4 Foundation." - link="https://sel4.github.io/rust-sel4/" - %} - - {% include card.html - icon="document-magnifying-glass" - title="How to use" - body="How to use the seL4 rust crates." - link="/projects/rust/how-to-use.html" - %} - - {% include card.html - icon="other/github" - title="Sources" - body="Repository for development and collaboration on Rust support in seL4 userspace." - link="https://github.com/sel4/rust-sel4" - %} - -
- -The development and maintenance of Rust support for seL4 userspace is funded and -managed by the seL4 Foundation. All of this work happens in one GitHub -repository: [seL4/rust-sel4](https://github.com/sel4/rust-sel4). diff --git a/projects/rust/releases.html b/projects/rust/releases.html new file mode 100644 index 00000000000..d7630c86bb3 --- /dev/null +++ b/projects/rust/releases.html @@ -0,0 +1,567 @@ + + + + + + + Rust: Releases | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/rust/releases.md b/projects/rust/releases.md deleted file mode 100644 index c5a4d59fb42..00000000000 --- a/projects/rust/releases.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Rust: Releases - -For the latest features, along with compatibility with the latest versions of the Rust toolchain, consider using the `main` branch of the [seL4/rust-sel4](https://github.com/seL4/rust-sel4) repository. - -Releases serve as snapshots of that branch: - -{%- assign releases = site.data.projects.rust.releases %} - -{%- for release in releases reversed -%} -{%- assign kernel_url = '/releases/sel4/' | append: release.kernel_version | - append: '.html' | relative_url %} -{%- assign microkit_url = '/releases/microkit/' | append: release.microkit_version | - append: '.html' | relative_url %} -- Release [rust-sel4 {{ release.version }}]({{ release.url }}) - (compatible with seL4 version [{{ release.kernel_version }}]({{kernel_url}}) - and Microkit version [{{ release.microkit_version }})]({{microkit_url}}) - {% if forloop.first %}**(latest)**{% endif %} - -{%- endfor %} diff --git a/projects/rust/supported-configurations.html b/projects/rust/supported-configurations.html new file mode 100644 index 00000000000..c069e5d0686 --- /dev/null +++ b/projects/rust/supported-configurations.html @@ -0,0 +1,552 @@ + + + + + + + Rust: Supported Configurations | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/rust/supported-configurations.md b/projects/rust/supported-configurations.md deleted file mode 100644 index 7e668ce5e4d..00000000000 --- a/projects/rust/supported-configurations.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Rust: Supported Configurations - -The Rust crates maintained by the seL4 Foundation support all configurations (that is, all platforms and combinations of CMake options) that are supported by the kernel itself, except those based on 32-bit x86. The Microkit-related crates support all Microkit configurations. - -See the [Choosing a `--target` argument for `rustc`](./how-to-use.md#target-spec) section for information about how to target a particular configuration using `rustc`. diff --git a/projects/rust/tutorial/.nojekyll b/projects/rust/tutorial/.nojekyll new file mode 100644 index 00000000000..f17311098f5 --- /dev/null +++ b/projects/rust/tutorial/.nojekyll @@ -0,0 +1 @@ +This file makes sure that Github Pages doesn't process mdBook's output. diff --git a/projects/rust/tutorial/404.html b/projects/rust/tutorial/404.html new file mode 100644 index 00000000000..27ed2d9187e --- /dev/null +++ b/projects/rust/tutorial/404.html @@ -0,0 +1,216 @@ + + + + + + Page not found - Using Rust in seL4 Userspace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Document not found (404)

+

This URL is invalid, sorry. Please use the navigation bar or search to continue.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/projects/rust/tutorial/FontAwesome/css/font-awesome.css b/projects/rust/tutorial/FontAwesome/css/font-awesome.css new file mode 100644 index 00000000000..540440ce89f --- /dev/null +++ b/projects/rust/tutorial/FontAwesome/css/font-awesome.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/projects/rust/tutorial/FontAwesome/fonts/FontAwesome.ttf b/projects/rust/tutorial/FontAwesome/fonts/FontAwesome.ttf new file mode 100644 index 00000000000..35acda2fa11 Binary files /dev/null and b/projects/rust/tutorial/FontAwesome/fonts/FontAwesome.ttf differ diff --git a/projects/rust/tutorial/FontAwesome/fonts/fontawesome-webfont.eot b/projects/rust/tutorial/FontAwesome/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000000..e9f60ca953f Binary files /dev/null and b/projects/rust/tutorial/FontAwesome/fonts/fontawesome-webfont.eot differ diff --git a/projects/rust/tutorial/FontAwesome/fonts/fontawesome-webfont.svg b/projects/rust/tutorial/FontAwesome/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000000..855c845e538 --- /dev/null +++ b/projects/rust/tutorial/FontAwesome/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/rust/tutorial/FontAwesome/fonts/fontawesome-webfont.ttf b/projects/rust/tutorial/FontAwesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000000..35acda2fa11 Binary files /dev/null and b/projects/rust/tutorial/FontAwesome/fonts/fontawesome-webfont.ttf differ diff --git a/projects/rust/tutorial/FontAwesome/fonts/fontawesome-webfont.woff b/projects/rust/tutorial/FontAwesome/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000000..400014a4b06 Binary files /dev/null and b/projects/rust/tutorial/FontAwesome/fonts/fontawesome-webfont.woff differ diff --git a/projects/rust/tutorial/FontAwesome/fonts/fontawesome-webfont.woff2 b/projects/rust/tutorial/FontAwesome/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000000..4d13fc60404 Binary files /dev/null and b/projects/rust/tutorial/FontAwesome/fonts/fontawesome-webfont.woff2 differ diff --git a/projects/rust/tutorial/assets/sel4-rust-tutorial.css b/projects/rust/tutorial/assets/sel4-rust-tutorial.css new file mode 100644 index 00000000000..bcbbbbc97b5 --- /dev/null +++ b/projects/rust/tutorial/assets/sel4-rust-tutorial.css @@ -0,0 +1,47 @@ +/* + * Copyright 2024, Colias Group, LLC + * + * SPDX-License-Identifier: BSD-2-Clause + * + */ + +.fragment-with-gh-link > .fragment-with-gh-link-link > pre > code { + background-color: color-mix(in srgb, var(--bg), #777 20%); + padding-top: .5rem; + padding-bottom: .5rem; + /* text-align: right; */ +} + +.fragment-with-gh-link > .fragment-with-gh-link-link > pre { + margin-bottom: 0; + /* margin-top: 0; */ +} + +.fragment-with-gh-link > .fragment-with-gh-link-fragment > pre { + margin-top: 0; + /* margin-bottom: 0; */ +} + +div.step-hint { + padding: 8px; + border-width: 1px; + border-color: var(--icons); + border-style: solid; + /* border-color: rgba(0, 0, 0, 0.5);; */ + /* background-color: rgba(0, 0, 0, 0.025); */ + /* background-color: rgba(0, 0, 0, 0.08); */ + /* background-color: var(--sidebar-bg); */ +} + +div.step-hint p:last-child { + margin-bottom: 0; +} + +a.step-heading-clickable, a.step-heading-clickable:link { + text-decoration: none !important;; + color: inherit; +} + +.step-heading-clickable:hover { + background-color: var(--theme-hover); +} diff --git a/projects/rust/tutorial/assets/sel4-rust-tutorial.js b/projects/rust/tutorial/assets/sel4-rust-tutorial.js new file mode 100644 index 00000000000..0effaed55c9 --- /dev/null +++ b/projects/rust/tutorial/assets/sel4-rust-tutorial.js @@ -0,0 +1,6 @@ +/* + * Copyright 2024, Colias Group, LLC + * + * SPDX-License-Identifier: BSD-2-Clause + * + */ diff --git a/projects/rust/tutorial/ayu-highlight.css b/projects/rust/tutorial/ayu-highlight.css new file mode 100644 index 00000000000..32c9432224b --- /dev/null +++ b/projects/rust/tutorial/ayu-highlight.css @@ -0,0 +1,78 @@ +/* +Based off of the Ayu theme +Original by Dempfi (https://github.com/dempfi/ayu) +*/ + +.hljs { + display: block; + overflow-x: auto; + background: #191f26; + color: #e6e1cf; +} + +.hljs-comment, +.hljs-quote { + color: #5c6773; + font-style: italic; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-attr, +.hljs-regexp, +.hljs-link, +.hljs-selector-id, +.hljs-selector-class { + color: #ff7733; +} + +.hljs-number, +.hljs-meta, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #ffee99; +} + +.hljs-string, +.hljs-bullet { + color: #b8cc52; +} + +.hljs-title, +.hljs-built_in, +.hljs-section { + color: #ffb454; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-symbol { + color: #ff7733; +} + +.hljs-name { + color: #36a3d9; +} + +.hljs-tag { + color: #00568d; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #91b362; +} + +.hljs-deletion { + color: #d96c75; +} diff --git a/projects/rust/tutorial/book.js b/projects/rust/tutorial/book.js new file mode 100644 index 00000000000..5df2096f7ce --- /dev/null +++ b/projects/rust/tutorial/book.js @@ -0,0 +1,818 @@ +'use strict'; + +/* global default_theme, default_dark_theme, default_light_theme, hljs, ClipboardJS */ + +// Fix back button cache problem +window.onunload = function() { }; + +// Global variable, shared between modules +function playground_text(playground, hidden = true) { + const code_block = playground.querySelector('code'); + + if (window.ace && code_block.classList.contains('editable')) { + const editor = window.ace.edit(code_block); + return editor.getValue(); + } else if (hidden) { + return code_block.textContent; + } else { + return code_block.innerText; + } +} + +(function codeSnippets() { + function fetch_with_timeout(url, options, timeout = 6000) { + return Promise.race([ + fetch(url, options), + new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)), + ]); + } + + const playgrounds = Array.from(document.querySelectorAll('.playground')); + if (playgrounds.length > 0) { + fetch_with_timeout('https://play.rust-lang.org/meta/crates', { + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + mode: 'cors', + }) + .then(response => response.json()) + .then(response => { + // get list of crates available in the rust playground + const playground_crates = response.crates.map(item => item['id']); + playgrounds.forEach(block => handle_crate_list_update(block, playground_crates)); + }); + } + + function handle_crate_list_update(playground_block, playground_crates) { + // update the play buttons after receiving the response + update_play_button(playground_block, playground_crates); + + // and install on change listener to dynamically update ACE editors + if (window.ace) { + const code_block = playground_block.querySelector('code'); + if (code_block.classList.contains('editable')) { + const editor = window.ace.edit(code_block); + editor.addEventListener('change', () => { + update_play_button(playground_block, playground_crates); + }); + // add Ctrl-Enter command to execute rust code + editor.commands.addCommand({ + name: 'run', + bindKey: { + win: 'Ctrl-Enter', + mac: 'Ctrl-Enter', + }, + exec: _editor => run_rust_code(playground_block), + }); + } + } + } + + // updates the visibility of play button based on `no_run` class and + // used crates vs ones available on https://play.rust-lang.org + function update_play_button(pre_block, playground_crates) { + const play_button = pre_block.querySelector('.play-button'); + + // skip if code is `no_run` + if (pre_block.querySelector('code').classList.contains('no_run')) { + play_button.classList.add('hidden'); + return; + } + + // get list of `extern crate`'s from snippet + const txt = playground_text(pre_block); + const re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g; + const snippet_crates = []; + let item; + // eslint-disable-next-line no-cond-assign + while (item = re.exec(txt)) { + snippet_crates.push(item[1]); + } + + // check if all used crates are available on play.rust-lang.org + const all_available = snippet_crates.every(function(elem) { + return playground_crates.indexOf(elem) > -1; + }); + + if (all_available) { + play_button.classList.remove('hidden'); + } else { + play_button.classList.add('hidden'); + } + } + + function run_rust_code(code_block) { + let result_block = code_block.querySelector('.result'); + if (!result_block) { + result_block = document.createElement('code'); + result_block.className = 'result hljs language-bash'; + + code_block.append(result_block); + } + + const text = playground_text(code_block); + const classes = code_block.querySelector('code').classList; + let edition = '2015'; + classes.forEach(className => { + if (className.startsWith('edition')) { + edition = className.slice(7); + } + }); + const params = { + version: 'stable', + optimize: '0', + code: text, + edition: edition, + }; + + if (text.indexOf('#![feature') !== -1) { + params.version = 'nightly'; + } + + result_block.innerText = 'Running...'; + + fetch_with_timeout('https://play.rust-lang.org/evaluate.json', { + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + mode: 'cors', + body: JSON.stringify(params), + }) + .then(response => response.json()) + .then(response => { + if (response.result.trim() === '') { + result_block.innerText = 'No output'; + result_block.classList.add('result-no-output'); + } else { + result_block.innerText = response.result; + result_block.classList.remove('result-no-output'); + } + }) + .catch(error => result_block.innerText = 'Playground Communication: ' + error.message); + } + + // Syntax highlighting Configuration + hljs.configure({ + tabReplace: ' ', // 4 spaces + languages: [], // Languages used for auto-detection + }); + + const code_nodes = Array + .from(document.querySelectorAll('code')) + // Don't highlight `inline code` blocks in headers. + .filter(function(node) { + return !node.parentElement.classList.contains('header'); + }); + + if (window.ace) { + // language-rust class needs to be removed for editable + // blocks or highlightjs will capture events + code_nodes + .filter(function(node) { + return node.classList.contains('editable'); + }) + .forEach(function(block) { + block.classList.remove('language-rust'); + }); + + code_nodes + .filter(function(node) { + return !node.classList.contains('editable'); + }) + .forEach(function(block) { + hljs.highlightBlock(block); + }); + } else { + code_nodes.forEach(function(block) { + hljs.highlightBlock(block); + }); + } + + // Adding the hljs class gives code blocks the color css + // even if highlighting doesn't apply + code_nodes.forEach(function(block) { + block.classList.add('hljs'); + }); + + Array.from(document.querySelectorAll('code.hljs')).forEach(function(block) { + + const lines = Array.from(block.querySelectorAll('.boring')); + // If no lines were hidden, return + if (!lines.length) { + return; + } + block.classList.add('hide-boring'); + + const buttons = document.createElement('div'); + buttons.className = 'buttons'; + buttons.innerHTML = ''; + + // add expand button + const pre_block = block.parentNode; + pre_block.insertBefore(buttons, pre_block.firstChild); + + pre_block.querySelector('.buttons').addEventListener('click', function(e) { + if (e.target.classList.contains('fa-eye')) { + e.target.classList.remove('fa-eye'); + e.target.classList.add('fa-eye-slash'); + e.target.title = 'Hide lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.remove('hide-boring'); + } else if (e.target.classList.contains('fa-eye-slash')) { + e.target.classList.remove('fa-eye-slash'); + e.target.classList.add('fa-eye'); + e.target.title = 'Show hidden lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.add('hide-boring'); + } + }); + }); + + if (window.playground_copyable) { + Array.from(document.querySelectorAll('pre code')).forEach(function(block) { + const pre_block = block.parentNode; + if (!pre_block.classList.contains('playground')) { + let buttons = pre_block.querySelector('.buttons'); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + const clipButton = document.createElement('button'); + clipButton.className = 'clip-button'; + clipButton.title = 'Copy to clipboard'; + clipButton.setAttribute('aria-label', clipButton.title); + clipButton.innerHTML = ''; + + buttons.insertBefore(clipButton, buttons.firstChild); + } + }); + } + + // Process playground code blocks + Array.from(document.querySelectorAll('.playground')).forEach(function(pre_block) { + // Add play button + let buttons = pre_block.querySelector('.buttons'); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + const runCodeButton = document.createElement('button'); + runCodeButton.className = 'fa fa-play play-button'; + runCodeButton.hidden = true; + runCodeButton.title = 'Run this code'; + runCodeButton.setAttribute('aria-label', runCodeButton.title); + + buttons.insertBefore(runCodeButton, buttons.firstChild); + runCodeButton.addEventListener('click', () => { + run_rust_code(pre_block); + }); + + if (window.playground_copyable) { + const copyCodeClipboardButton = document.createElement('button'); + copyCodeClipboardButton.className = 'clip-button'; + copyCodeClipboardButton.innerHTML = ''; + copyCodeClipboardButton.title = 'Copy to clipboard'; + copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title); + + buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild); + } + + const code_block = pre_block.querySelector('code'); + if (window.ace && code_block.classList.contains('editable')) { + const undoChangesButton = document.createElement('button'); + undoChangesButton.className = 'fa fa-history reset-button'; + undoChangesButton.title = 'Undo changes'; + undoChangesButton.setAttribute('aria-label', undoChangesButton.title); + + buttons.insertBefore(undoChangesButton, buttons.firstChild); + + undoChangesButton.addEventListener('click', function() { + const editor = window.ace.edit(code_block); + editor.setValue(editor.originalCode); + editor.clearSelection(); + }); + } + }); +})(); + +(function themes() { + const html = document.querySelector('html'); + const themeToggleButton = document.getElementById('theme-toggle'); + const themePopup = document.getElementById('theme-list'); + const themeColorMetaTag = document.querySelector('meta[name="theme-color"]'); + const themeIds = []; + themePopup.querySelectorAll('button.theme').forEach(function(el) { + themeIds.push(el.id); + }); + const stylesheets = { + ayuHighlight: document.querySelector('#ayu-highlight-css'), + tomorrowNight: document.querySelector('#tomorrow-night-css'), + highlight: document.querySelector('#highlight-css'), + }; + + function showThemes() { + themePopup.style.display = 'block'; + themeToggleButton.setAttribute('aria-expanded', true); + themePopup.querySelector('button#' + get_theme()).focus(); + } + + function updateThemeSelected() { + themePopup.querySelectorAll('.theme-selected').forEach(function(el) { + el.classList.remove('theme-selected'); + }); + const selected = get_saved_theme() ?? 'default_theme'; + let element = themePopup.querySelector('button#' + selected); + if (element === null) { + // Fall back in case there is no "Default" item. + element = themePopup.querySelector('button#' + get_theme()); + } + element.classList.add('theme-selected'); + } + + function hideThemes() { + themePopup.style.display = 'none'; + themeToggleButton.setAttribute('aria-expanded', false); + themeToggleButton.focus(); + } + + function get_saved_theme() { + let theme = null; + try { + theme = localStorage.getItem('mdbook-theme'); + } catch (e) { + // ignore error. + } + return theme; + } + + function delete_saved_theme() { + localStorage.removeItem('mdbook-theme'); + } + + function get_theme() { + const theme = get_saved_theme(); + if (theme === null || theme === undefined || !themeIds.includes(theme)) { + if (typeof default_dark_theme === 'undefined') { + // A customized index.hbs might not define this, so fall back to + // old behavior of determining the default on page load. + return default_theme; + } + return window.matchMedia('(prefers-color-scheme: dark)').matches + ? default_dark_theme + : default_light_theme; + } else { + return theme; + } + } + + let previousTheme = default_theme; + function set_theme(theme, store = true) { + let ace_theme; + + if (theme === 'coal' || theme === 'navy') { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = false; + stylesheets.highlight.disabled = true; + + ace_theme = 'ace/theme/tomorrow_night'; + } else if (theme === 'ayu') { + stylesheets.ayuHighlight.disabled = false; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = true; + ace_theme = 'ace/theme/tomorrow_night'; + } else { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = false; + ace_theme = 'ace/theme/dawn'; + } + + setTimeout(function() { + themeColorMetaTag.content = getComputedStyle(document.documentElement).backgroundColor; + }, 1); + + if (window.ace && window.editors) { + window.editors.forEach(function(editor) { + editor.setTheme(ace_theme); + }); + } + + if (store) { + try { + localStorage.setItem('mdbook-theme', theme); + } catch (e) { + // ignore error. + } + } + + html.classList.remove(previousTheme); + html.classList.add(theme); + previousTheme = theme; + updateThemeSelected(); + } + + const query = window.matchMedia('(prefers-color-scheme: dark)'); + query.onchange = function() { + set_theme(get_theme(), false); + }; + + // Set theme. + set_theme(get_theme(), false); + + themeToggleButton.addEventListener('click', function() { + if (themePopup.style.display === 'block') { + hideThemes(); + } else { + showThemes(); + } + }); + + themePopup.addEventListener('click', function(e) { + let theme; + if (e.target.className === 'theme') { + theme = e.target.id; + } else if (e.target.parentElement.className === 'theme') { + theme = e.target.parentElement.id; + } else { + return; + } + if (theme === 'default_theme' || theme === null) { + delete_saved_theme(); + set_theme(get_theme(), false); + } else { + set_theme(theme); + } + }); + + themePopup.addEventListener('focusout', function(e) { + // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below) + if (!!e.relatedTarget && + !themeToggleButton.contains(e.relatedTarget) && + !themePopup.contains(e.relatedTarget) + ) { + hideThemes(); + } + }); + + // Should not be needed, but it works around an issue on macOS & iOS: + // https://github.com/rust-lang/mdBook/issues/628 + document.addEventListener('click', function(e) { + if (themePopup.style.display === 'block' && + !themeToggleButton.contains(e.target) && + !themePopup.contains(e.target) + ) { + hideThemes(); + } + }); + + document.addEventListener('keydown', function(e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { + return; + } + if (!themePopup.contains(e.target)) { + return; + } + + let li; + switch (e.key) { + case 'Escape': + e.preventDefault(); + hideThemes(); + break; + case 'ArrowUp': + e.preventDefault(); + li = document.activeElement.parentElement; + if (li && li.previousElementSibling) { + li.previousElementSibling.querySelector('button').focus(); + } + break; + case 'ArrowDown': + e.preventDefault(); + li = document.activeElement.parentElement; + if (li && li.nextElementSibling) { + li.nextElementSibling.querySelector('button').focus(); + } + break; + case 'Home': + e.preventDefault(); + themePopup.querySelector('li:first-child button').focus(); + break; + case 'End': + e.preventDefault(); + themePopup.querySelector('li:last-child button').focus(); + break; + } + }); +})(); + +(function sidebar() { + const body = document.querySelector('body'); + const sidebar = document.getElementById('sidebar'); + const sidebarLinks = document.querySelectorAll('#sidebar a'); + const sidebarToggleButton = document.getElementById('sidebar-toggle'); + const sidebarToggleAnchor = document.getElementById('sidebar-toggle-anchor'); + const sidebarResizeHandle = document.getElementById('sidebar-resize-handle'); + let firstContact = null; + + function showSidebar() { + body.classList.remove('sidebar-hidden'); + body.classList.add('sidebar-visible'); + Array.from(sidebarLinks).forEach(function(link) { + link.setAttribute('tabIndex', 0); + }); + sidebarToggleButton.setAttribute('aria-expanded', true); + sidebar.setAttribute('aria-hidden', false); + try { + localStorage.setItem('mdbook-sidebar', 'visible'); + } catch (e) { + // Ignore error. + } + } + + function hideSidebar() { + body.classList.remove('sidebar-visible'); + body.classList.add('sidebar-hidden'); + Array.from(sidebarLinks).forEach(function(link) { + link.setAttribute('tabIndex', -1); + }); + sidebarToggleButton.setAttribute('aria-expanded', false); + sidebar.setAttribute('aria-hidden', true); + try { + localStorage.setItem('mdbook-sidebar', 'hidden'); + } catch (e) { + // Ignore error. + } + } + + // Toggle sidebar + sidebarToggleAnchor.addEventListener('change', function sidebarToggle() { + if (sidebarToggleAnchor.checked) { + const current_width = parseInt( + document.documentElement.style.getPropertyValue('--sidebar-target-width'), 10); + if (current_width < 150) { + document.documentElement.style.setProperty('--sidebar-target-width', '150px'); + } + showSidebar(); + } else { + hideSidebar(); + } + }); + + sidebarResizeHandle.addEventListener('mousedown', initResize, false); + + function initResize() { + window.addEventListener('mousemove', resize, false); + window.addEventListener('mouseup', stopResize, false); + body.classList.add('sidebar-resizing'); + } + function resize(e) { + let pos = e.clientX - sidebar.offsetLeft; + if (pos < 20) { + hideSidebar(); + } else { + if (body.classList.contains('sidebar-hidden')) { + showSidebar(); + } + pos = Math.min(pos, window.innerWidth - 100); + document.documentElement.style.setProperty('--sidebar-target-width', pos + 'px'); + } + } + //on mouseup remove windows functions mousemove & mouseup + function stopResize() { + body.classList.remove('sidebar-resizing'); + window.removeEventListener('mousemove', resize, false); + window.removeEventListener('mouseup', stopResize, false); + } + + document.addEventListener('touchstart', function(e) { + firstContact = { + x: e.touches[0].clientX, + time: Date.now(), + }; + }, { passive: true }); + + document.addEventListener('touchmove', function(e) { + if (!firstContact) { + return; + } + + const curX = e.touches[0].clientX; + const xDiff = curX - firstContact.x, + tDiff = Date.now() - firstContact.time; + + if (tDiff < 250 && Math.abs(xDiff) >= 150) { + if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) { + showSidebar(); + } else if (xDiff < 0 && curX < 300) { + hideSidebar(); + } + + firstContact = null; + } + }, { passive: true }); +})(); + +(function chapterNavigation() { + document.addEventListener('keydown', function(e) { + if (e.altKey || e.ctrlKey || e.metaKey) { + return; + } + if (window.search && window.search.hasFocus()) { + return; + } + const html = document.querySelector('html'); + + function next() { + const nextButton = document.querySelector('.nav-chapters.next'); + if (nextButton) { + window.location.href = nextButton.href; + } + } + function prev() { + const previousButton = document.querySelector('.nav-chapters.previous'); + if (previousButton) { + window.location.href = previousButton.href; + } + } + function showHelp() { + const container = document.getElementById('mdbook-help-container'); + const overlay = document.getElementById('mdbook-help-popup'); + container.style.display = 'flex'; + + // Clicking outside the popup will dismiss it. + const mouseHandler = event => { + if (overlay.contains(event.target)) { + return; + } + if (event.button !== 0) { + return; + } + event.preventDefault(); + event.stopPropagation(); + document.removeEventListener('mousedown', mouseHandler); + hideHelp(); + }; + + // Pressing esc will dismiss the popup. + const escapeKeyHandler = event => { + if (event.key === 'Escape') { + event.preventDefault(); + event.stopPropagation(); + document.removeEventListener('keydown', escapeKeyHandler, true); + hideHelp(); + } + }; + document.addEventListener('keydown', escapeKeyHandler, true); + document.getElementById('mdbook-help-container') + .addEventListener('mousedown', mouseHandler); + } + function hideHelp() { + document.getElementById('mdbook-help-container').style.display = 'none'; + } + + // Usually needs the Shift key to be pressed + switch (e.key) { + case '?': + e.preventDefault(); + showHelp(); + break; + } + + // Rest of the keys are only active when the Shift key is not pressed + if (e.shiftKey) { + return; + } + + switch (e.key) { + case 'ArrowRight': + e.preventDefault(); + if (html.dir === 'rtl') { + prev(); + } else { + next(); + } + break; + case 'ArrowLeft': + e.preventDefault(); + if (html.dir === 'rtl') { + next(); + } else { + prev(); + } + break; + } + }); +})(); + +(function clipboard() { + const clipButtons = document.querySelectorAll('.clip-button'); + + function hideTooltip(elem) { + elem.firstChild.innerText = ''; + elem.className = 'clip-button'; + } + + function showTooltip(elem, msg) { + elem.firstChild.innerText = msg; + elem.className = 'clip-button tooltipped'; + } + + const clipboardSnippets = new ClipboardJS('.clip-button', { + text: function(trigger) { + hideTooltip(trigger); + const playground = trigger.closest('pre'); + return playground_text(playground, false); + }, + }); + + Array.from(clipButtons).forEach(function(clipButton) { + clipButton.addEventListener('mouseout', function(e) { + hideTooltip(e.currentTarget); + }); + }); + + clipboardSnippets.on('success', function(e) { + e.clearSelection(); + showTooltip(e.trigger, 'Copied!'); + }); + + clipboardSnippets.on('error', function(e) { + showTooltip(e.trigger, 'Clipboard error!'); + }); +})(); + +(function scrollToTop() { + const menuTitle = document.querySelector('.menu-title'); + + menuTitle.addEventListener('click', function() { + document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' }); + }); +})(); + +(function controllMenu() { + const menu = document.getElementById('menu-bar'); + + (function controllPosition() { + let scrollTop = document.scrollingElement.scrollTop; + let prevScrollTop = scrollTop; + const minMenuY = -menu.clientHeight - 50; + // When the script loads, the page can be at any scroll (e.g. if you reforesh it). + menu.style.top = scrollTop + 'px'; + // Same as parseInt(menu.style.top.slice(0, -2), but faster + let topCache = menu.style.top.slice(0, -2); + menu.classList.remove('sticky'); + let stickyCache = false; // Same as menu.classList.contains('sticky'), but faster + document.addEventListener('scroll', function() { + scrollTop = Math.max(document.scrollingElement.scrollTop, 0); + // `null` means that it doesn't need to be updated + let nextSticky = null; + let nextTop = null; + const scrollDown = scrollTop > prevScrollTop; + const menuPosAbsoluteY = topCache - scrollTop; + if (scrollDown) { + nextSticky = false; + if (menuPosAbsoluteY > 0) { + nextTop = prevScrollTop; + } + } else { + if (menuPosAbsoluteY > 0) { + nextSticky = true; + } else if (menuPosAbsoluteY < minMenuY) { + nextTop = prevScrollTop + minMenuY; + } + } + if (nextSticky === true && stickyCache === false) { + menu.classList.add('sticky'); + stickyCache = true; + } else if (nextSticky === false && stickyCache === true) { + menu.classList.remove('sticky'); + stickyCache = false; + } + if (nextTop !== null) { + menu.style.top = nextTop + 'px'; + topCache = nextTop; + } + prevScrollTop = scrollTop; + }, { passive: true }); + })(); + (function controllBorder() { + function updateBorder() { + if (menu.offsetTop === 0) { + menu.classList.remove('bordered'); + } else { + menu.classList.add('bordered'); + } + } + updateBorder(); + document.addEventListener('scroll', updateBorder, { passive: true }); + })(); +})(); diff --git a/projects/rust/tutorial/clipboard.min.js b/projects/rust/tutorial/clipboard.min.js new file mode 100644 index 00000000000..02c549e35c8 --- /dev/null +++ b/projects/rust/tutorial/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.4 + * https://zenorocha.github.io/clipboard.js + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(n){var o={};function r(t){if(o[t])return o[t].exports;var e=o[t]={i:t,l:!1,exports:{}};return n[t].call(e.exports,e,e.exports,r),e.l=!0,e.exports}return r.m=n,r.c=o,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function o(t,e){for(var n=0;n .hljs { + color: var(--links); +} + +/* + body-container is necessary because mobile browsers don't seem to like + overflow-x on the body tag when there is a tag. +*/ +#body-container { + /* + This is used when the sidebar pushes the body content off the side of + the screen on small screens. Without it, dragging on mobile Safari + will want to reposition the viewport in a weird way. + */ + overflow-x: clip; +} + +/* Menu Bar */ + +#menu-bar, +#menu-bar-hover-placeholder { + z-index: 101; + margin: auto calc(0px - var(--page-padding)); +} +#menu-bar { + position: relative; + display: flex; + flex-wrap: wrap; + background-color: var(--bg); + border-block-end-color: var(--bg); + border-block-end-width: 1px; + border-block-end-style: solid; +} +#menu-bar.sticky, +#menu-bar-hover-placeholder:hover + #menu-bar, +#menu-bar:hover, +html.sidebar-visible #menu-bar { + position: -webkit-sticky; + position: sticky; + top: 0 !important; +} +#menu-bar-hover-placeholder { + position: sticky; + position: -webkit-sticky; + top: 0; + height: var(--menu-bar-height); +} +#menu-bar.bordered { + border-block-end-color: var(--table-border-color); +} +#menu-bar i, #menu-bar .icon-button { + position: relative; + padding: 0 8px; + z-index: 10; + line-height: var(--menu-bar-height); + cursor: pointer; + transition: color 0.5s; +} +@media only screen and (max-width: 420px) { + #menu-bar i, #menu-bar .icon-button { + padding: 0 5px; + } +} + +.icon-button { + border: none; + background: none; + padding: 0; + color: inherit; +} +.icon-button i { + margin: 0; +} + +.right-buttons { + margin: 0 15px; +} +.right-buttons a { + text-decoration: none; +} + +.left-buttons { + display: flex; + margin: 0 5px; +} +html:not(.js) .left-buttons button { + display: none; +} + +.menu-title { + display: inline-block; + font-weight: 200; + font-size: 2.4rem; + line-height: var(--menu-bar-height); + text-align: center; + margin: 0; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.menu-title { + cursor: pointer; +} + +.menu-bar, +.menu-bar:visited, +.nav-chapters, +.nav-chapters:visited, +.mobile-nav-chapters, +.mobile-nav-chapters:visited, +.menu-bar .icon-button, +.menu-bar a i { + color: var(--icons); +} + +.menu-bar i:hover, +.menu-bar .icon-button:hover, +.nav-chapters:hover, +.mobile-nav-chapters i:hover { + color: var(--icons-hover); +} + +/* Nav Icons */ + +.nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + + position: fixed; + top: 0; + bottom: 0; + margin: 0; + max-width: 150px; + min-width: 90px; + + display: flex; + justify-content: center; + align-content: center; + flex-direction: column; + + transition: color 0.5s, background-color 0.5s; +} + +.nav-chapters:hover { + text-decoration: none; + background-color: var(--theme-hover); + transition: background-color 0.15s, color 0.15s; +} + +.nav-wrapper { + margin-block-start: 50px; + display: none; +} + +.mobile-nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + width: 90px; + border-radius: 5px; + background-color: var(--sidebar-bg); +} + +/* Only Firefox supports flow-relative values */ +.previous { float: left; } +[dir=rtl] .previous { float: right; } + +/* Only Firefox supports flow-relative values */ +.next { + float: right; + right: var(--page-padding); +} +[dir=rtl] .next { + float: left; + right: unset; + left: var(--page-padding); +} + +/* Use the correct buttons for RTL layouts*/ +[dir=rtl] .previous i.fa-angle-left:before {content:"\f105";} +[dir=rtl] .next i.fa-angle-right:before { content:"\f104"; } + +@media only screen and (max-width: 1080px) { + .nav-wide-wrapper { display: none; } + .nav-wrapper { display: block; } +} + +/* sidebar-visible */ +@media only screen and (max-width: 1380px) { + #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wide-wrapper { display: none; } + #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wrapper { display: block; } +} + +/* Inline code */ + +:not(pre) > .hljs { + display: inline; + padding: 0.1em 0.3em; + border-radius: 3px; +} + +:not(pre):not(a) > .hljs { + color: var(--inline-code-color); + overflow-x: initial; +} + +a:hover > .hljs { + text-decoration: underline; +} + +pre { + position: relative; +} +pre > .buttons { + position: absolute; + z-index: 100; + right: 0px; + top: 2px; + margin: 0px; + padding: 2px 0px; + + color: var(--sidebar-fg); + cursor: pointer; + visibility: hidden; + opacity: 0; + transition: visibility 0.1s linear, opacity 0.1s linear; +} +pre:hover > .buttons { + visibility: visible; + opacity: 1 +} +pre > .buttons :hover { + color: var(--sidebar-active); + border-color: var(--icons-hover); + background-color: var(--theme-hover); +} +pre > .buttons i { + margin-inline-start: 8px; +} +pre > .buttons button { + cursor: inherit; + margin: 0px 5px; + padding: 4px 4px 3px 5px; + font-size: 23px; + + border-style: solid; + border-width: 1px; + border-radius: 4px; + border-color: var(--icons); + background-color: var(--theme-popup-bg); + transition: 100ms; + transition-property: color,border-color,background-color; + color: var(--icons); +} + +pre > .buttons button.clip-button { + padding: 2px 4px 0px 6px; +} +pre > .buttons button.clip-button::before { + /* clipboard image from octicons (https://github.com/primer/octicons/tree/v2.0.0) MIT license + */ + content: url('data:image/svg+xml,\ +\ +\ +'); + filter: var(--copy-button-filter); +} +pre > .buttons button.clip-button:hover::before { + filter: var(--copy-button-filter-hover); +} + +@media (pointer: coarse) { + pre > .buttons button { + /* On mobile, make it easier to tap buttons. */ + padding: 0.3rem 1rem; + } + + .sidebar-resize-indicator { + /* Hide resize indicator on devices with limited accuracy */ + display: none; + } +} +pre > code { + display: block; + padding: 1rem; +} + +/* FIXME: ACE editors overlap their buttons because ACE does absolute + positioning within the code block which breaks padding. The only solution I + can think of is to move the padding to the outer pre tag (or insert a div + wrapper), but that would require fixing a whole bunch of CSS rules. +*/ +.hljs.ace_editor { + padding: 0rem 0rem; +} + +pre > .result { + margin-block-start: 10px; +} + +/* Search */ + +#searchresults a { + text-decoration: none; +} + +mark { + border-radius: 2px; + padding-block-start: 0; + padding-block-end: 1px; + padding-inline-start: 3px; + padding-inline-end: 3px; + margin-block-start: 0; + margin-block-end: -1px; + margin-inline-start: -3px; + margin-inline-end: -3px; + background-color: var(--search-mark-bg); + transition: background-color 300ms linear; + cursor: pointer; +} + +mark.fade-out { + background-color: rgba(0,0,0,0) !important; + cursor: auto; +} + +.searchbar-outer { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); +} + +#searchbar { + width: 100%; + margin-block-start: 5px; + margin-block-end: 0; + margin-inline-start: auto; + margin-inline-end: auto; + padding: 10px 16px; + transition: box-shadow 300ms ease-in-out; + border: 1px solid var(--searchbar-border-color); + border-radius: 3px; + background-color: var(--searchbar-bg); + color: var(--searchbar-fg); +} +#searchbar:focus, +#searchbar.active { + box-shadow: 0 0 3px var(--searchbar-shadow-color); +} + +.searchresults-header { + font-weight: bold; + font-size: 1em; + padding-block-start: 18px; + padding-block-end: 0; + padding-inline-start: 5px; + padding-inline-end: 0; + color: var(--searchresults-header-fg); +} + +.searchresults-outer { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); + border-block-end: 1px dashed var(--searchresults-border-color); +} + +ul#searchresults { + list-style: none; + padding-inline-start: 20px; +} +ul#searchresults li { + margin: 10px 0px; + padding: 2px; + border-radius: 2px; +} +ul#searchresults li.focus { + background-color: var(--searchresults-li-bg); +} +ul#searchresults span.teaser { + display: block; + clear: both; + margin-block-start: 5px; + margin-block-end: 0; + margin-inline-start: 20px; + margin-inline-end: 0; + font-size: 0.8em; +} +ul#searchresults span.teaser em { + font-weight: bold; + font-style: normal; +} + +/* Sidebar */ + +.sidebar { + position: fixed; + left: 0; + top: 0; + bottom: 0; + width: var(--sidebar-width); + font-size: 0.875em; + box-sizing: border-box; + -webkit-overflow-scrolling: touch; + overscroll-behavior-y: contain; + background-color: var(--sidebar-bg); + color: var(--sidebar-fg); +} +.sidebar-iframe-inner { + --padding: 10px; + + background-color: var(--sidebar-bg); + padding: var(--padding); + margin: 0; + font-size: 1.4rem; + color: var(--sidebar-fg); + min-height: calc(100vh - var(--padding) * 2); +} +.sidebar-iframe-outer { + border: none; + height: 100%; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} +[dir=rtl] .sidebar { left: unset; right: 0; } +.sidebar-resizing { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +html:not(.sidebar-resizing) .sidebar { + transition: transform 0.3s; /* Animation: slide away */ +} +.sidebar code { + line-height: 2em; +} +.sidebar .sidebar-scrollbox { + overflow-y: auto; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + padding: 10px 10px; +} +.sidebar .sidebar-resize-handle { + position: absolute; + cursor: col-resize; + width: 0; + right: calc(var(--sidebar-resize-indicator-width) * -1); + top: 0; + bottom: 0; + display: flex; + align-items: center; +} + +.sidebar-resize-handle .sidebar-resize-indicator { + width: 100%; + height: 16px; + color: var(--icons); + margin-inline-start: var(--sidebar-resize-indicator-space); + display: flex; + align-items: center; + justify-content: flex-start; +} +.sidebar-resize-handle .sidebar-resize-indicator::before { + content: ""; + width: 2px; + height: 12px; + border-left: dotted 2px currentColor; +} +.sidebar-resize-handle .sidebar-resize-indicator::after { + content: ""; + width: 2px; + height: 16px; + border-left: dotted 2px currentColor; +} + +[dir=rtl] .sidebar .sidebar-resize-handle { + left: calc(var(--sidebar-resize-indicator-width) * -1); + right: unset; +} +.js .sidebar .sidebar-resize-handle { + cursor: col-resize; + width: calc(var(--sidebar-resize-indicator-width) - var(--sidebar-resize-indicator-space)); +} +/* sidebar-hidden */ +#sidebar-toggle-anchor:not(:checked) ~ .sidebar { + transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width))); + z-index: -1; +} +[dir=rtl] #sidebar-toggle-anchor:not(:checked) ~ .sidebar { + transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width))); +} +.sidebar::-webkit-scrollbar { + background: var(--sidebar-bg); +} +.sidebar::-webkit-scrollbar-thumb { + background: var(--scrollbar); +} + +/* sidebar-visible */ +#sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width))); +} +[dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width))); +} +@media only screen and (min-width: 620px) { + #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: none; + margin-inline-start: calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width)); + } + [dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: none; + } +} + +.chapter { + list-style: none outside none; + padding-inline-start: 0; + line-height: 2.2em; +} + +.chapter ol { + width: 100%; +} + +.chapter li { + display: flex; + color: var(--sidebar-non-existant); +} +.chapter li a { + display: block; + padding: 0; + text-decoration: none; + color: var(--sidebar-fg); +} + +.chapter li a:hover { + color: var(--sidebar-active); +} + +.chapter li a.active { + color: var(--sidebar-active); +} + +.chapter li > a.toggle { + cursor: pointer; + display: block; + margin-inline-start: auto; + padding: 0 10px; + user-select: none; + opacity: 0.68; +} + +.chapter li > a.toggle div { + transition: transform 0.5s; +} + +/* collapse the section */ +.chapter li:not(.expanded) + li > ol { + display: none; +} + +.chapter li.chapter-item { + line-height: 1.5em; + margin-block-start: 0.6em; +} + +.chapter li.expanded > a.toggle div { + transform: rotate(90deg); +} + +.spacer { + width: 100%; + height: 3px; + margin: 5px 0px; +} +.chapter .spacer { + background-color: var(--sidebar-spacer); +} + +@media (-moz-touch-enabled: 1), (pointer: coarse) { + .chapter li a { padding: 5px 0; } + .spacer { margin: 10px 0; } +} + +.section { + list-style: none outside none; + padding-inline-start: 20px; + line-height: 1.9em; +} + +/* Theme Menu Popup */ + +.theme-popup { + position: absolute; + left: 10px; + top: var(--menu-bar-height); + z-index: 1000; + border-radius: 4px; + font-size: 0.7em; + color: var(--fg); + background: var(--theme-popup-bg); + border: 1px solid var(--theme-popup-border); + margin: 0; + padding: 0; + list-style: none; + display: none; + /* Don't let the children's background extend past the rounded corners. */ + overflow: hidden; +} +[dir=rtl] .theme-popup { left: unset; right: 10px; } +.theme-popup .default { + color: var(--icons); +} +.theme-popup .theme { + width: 100%; + border: 0; + margin: 0; + padding: 2px 20px; + line-height: 25px; + white-space: nowrap; + text-align: start; + cursor: pointer; + color: inherit; + background: inherit; + font-size: inherit; +} +.theme-popup .theme:hover { + background-color: var(--theme-hover); +} + +.theme-selected::before { + display: inline-block; + content: "✓"; + margin-inline-start: -14px; + width: 14px; +} + +/* The container for the help popup that covers the whole window. */ +#mdbook-help-container { + /* Position and size for the whole window. */ + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + /* This uses flex layout (which is set in book.js), and centers the popup + in the window.*/ + display: none; + align-items: center; + justify-content: center; + z-index: 1000; + /* Dim out the book while the popup is visible. */ + background: var(--overlay-bg); +} + +/* The popup help box. */ +#mdbook-help-popup { + box-shadow: 0 4px 24px rgba(0,0,0,0.15); + min-width: 300px; + max-width: 500px; + width: 100%; + box-sizing: border-box; + display: flex; + flex-direction: column; + align-items: center; + background-color: var(--bg); + color: var(--fg); + border-width: 1px; + border-color: var(--theme-popup-border); + border-style: solid; + border-radius: 8px; + padding: 10px; +} + +.mdbook-help-title { + text-align: center; + /* mdbook's margin for h2 is way too large. */ + margin: 10px; +} diff --git a/projects/rust/tutorial/css/general.css b/projects/rust/tutorial/css/general.css new file mode 100644 index 00000000000..9946cfc01a9 --- /dev/null +++ b/projects/rust/tutorial/css/general.css @@ -0,0 +1,279 @@ +/* Base styles and content styles */ + +:root { + /* Browser default font-size is 16px, this way 1 rem = 10px */ + font-size: 62.5%; + color-scheme: var(--color-scheme); +} + +html { + font-family: "Open Sans", sans-serif; + color: var(--fg); + background-color: var(--bg); + text-size-adjust: none; + -webkit-text-size-adjust: none; +} + +body { + margin: 0; + font-size: 1.6rem; + overflow-x: hidden; +} + +code { + font-family: var(--mono-font) !important; + font-size: var(--code-font-size); + direction: ltr !important; +} + +/* make long words/inline code not x overflow */ +main { + overflow-wrap: break-word; +} + +/* make wide tables scroll if they overflow */ +.table-wrapper { + overflow-x: auto; +} + +/* Don't change font size in headers. */ +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + font-size: unset; +} + +.left { float: left; } +.right { float: right; } +.boring { opacity: 0.6; } +.hide-boring .boring { display: none; } +.hidden { display: none !important; } + +h2, h3 { margin-block-start: 2.5em; } +h4, h5 { margin-block-start: 2em; } + +.header + .header h3, +.header + .header h4, +.header + .header h5 { + margin-block-start: 1em; +} + +h1:target::before, +h2:target::before, +h3:target::before, +h4:target::before, +h5:target::before, +h6:target::before { + display: inline-block; + content: "»"; + margin-inline-start: -30px; + width: 30px; +} + +/* This is broken on Safari as of version 14, but is fixed + in Safari Technology Preview 117 which I think will be Safari 14.2. + https://bugs.webkit.org/show_bug.cgi?id=218076 +*/ +:target { + /* Safari does not support logical properties */ + scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); +} + +.page { + outline: 0; + padding: 0 var(--page-padding); + margin-block-start: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ +} +.page-wrapper { + box-sizing: border-box; + background-color: var(--bg); +} +.no-js .page-wrapper, +.js:not(.sidebar-resizing) .page-wrapper { + transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} +[dir=rtl] .js:not(.sidebar-resizing) .page-wrapper { + transition: margin-right 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} + +.content { + overflow-y: auto; + padding: 0 5px 50px 5px; +} +.content main { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); +} +.content p { line-height: 1.45em; } +.content ol { line-height: 1.45em; } +.content ul { line-height: 1.45em; } +.content a { text-decoration: none; } +.content a:hover { text-decoration: underline; } +.content img, .content video { max-width: 100%; } +.content .header:link, +.content .header:visited { + color: var(--fg); +} +.content .header:link, +.content .header:visited:hover { + text-decoration: none; +} + +table { + margin: 0 auto; + border-collapse: collapse; +} +table td { + padding: 3px 20px; + border: 1px var(--table-border-color) solid; +} +table thead { + background: var(--table-header-bg); +} +table thead td { + font-weight: 700; + border: none; +} +table thead th { + padding: 3px 20px; +} +table thead tr { + border: 1px var(--table-header-bg) solid; +} +/* Alternate background colors for rows */ +table tbody tr:nth-child(2n) { + background: var(--table-alternate-bg); +} + + +blockquote { + margin: 20px 0; + padding: 0 20px; + color: var(--fg); + background-color: var(--quote-bg); + border-block-start: .1em solid var(--quote-border); + border-block-end: .1em solid var(--quote-border); +} + +.warning { + margin: 20px; + padding: 0 20px; + border-inline-start: 2px solid var(--warning-border); +} + +.warning:before { + position: absolute; + width: 3rem; + height: 3rem; + margin-inline-start: calc(-1.5rem - 21px); + content: "ⓘ"; + text-align: center; + background-color: var(--bg); + color: var(--warning-border); + font-weight: bold; + font-size: 2rem; +} + +blockquote .warning:before { + background-color: var(--quote-bg); +} + +kbd { + background-color: var(--table-border-color); + border-radius: 4px; + border: solid 1px var(--theme-popup-border); + box-shadow: inset 0 -1px 0 var(--theme-hover); + display: inline-block; + font-size: var(--code-font-size); + font-family: var(--mono-font); + line-height: 10px; + padding: 4px 5px; + vertical-align: middle; +} + +sup { + /* Set the line-height for superscript and footnote references so that there + isn't an awkward space appearing above lines that contain the footnote. + + See https://github.com/rust-lang/mdBook/pull/2443#discussion_r1813773583 + for an explanation. + */ + line-height: 0; +} + +.footnote-definition { + font-size: 0.9em; +} +/* The default spacing for a list is a little too large. */ +.footnote-definition ul, +.footnote-definition ol { + padding-left: 20px; +} +.footnote-definition > li { + /* Required to position the ::before target */ + position: relative; +} +.footnote-definition > li:target { + scroll-margin-top: 50vh; +} +.footnote-reference:target { + scroll-margin-top: 50vh; +} +/* Draws a border around the footnote (including the marker) when it is selected. + TODO: If there are multiple linkbacks, highlight which one you just came + from so you know which one to click. +*/ +.footnote-definition > li:target::before { + border: 2px solid var(--footnote-highlight); + border-radius: 6px; + position: absolute; + top: -8px; + right: -8px; + bottom: -8px; + left: -32px; + pointer-events: none; + content: ""; +} +/* Pulses the footnote reference so you can quickly see where you left off reading. + This could use some improvement. +*/ +@media not (prefers-reduced-motion) { + .footnote-reference:target { + animation: fn-highlight 0.8s; + border-radius: 2px; + } + + @keyframes fn-highlight { + from { + background-color: var(--footnote-highlight); + } + } +} + +.tooltiptext { + position: absolute; + visibility: hidden; + color: #fff; + background-color: #333; + transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ + left: -8px; /* Half of the width of the icon */ + top: -35px; + font-size: 0.8em; + text-align: center; + border-radius: 6px; + padding: 5px 8px; + margin: 5px; + z-index: 1000; +} +.tooltipped .tooltiptext { + visibility: visible; +} + +.chapter li.part-title { + color: var(--sidebar-fg); + margin: 5px 0px; + font-weight: bold; +} + +.result-no-output { + font-style: italic; +} diff --git a/projects/rust/tutorial/css/print.css b/projects/rust/tutorial/css/print.css new file mode 100644 index 00000000000..80ec3a54419 --- /dev/null +++ b/projects/rust/tutorial/css/print.css @@ -0,0 +1,50 @@ + +#sidebar, +#menu-bar, +.nav-chapters, +.mobile-nav-chapters { + display: none; +} + +#page-wrapper.page-wrapper { + transform: none !important; + margin-inline-start: 0px; + overflow-y: initial; +} + +#content { + max-width: none; + margin: 0; + padding: 0; +} + +.page { + overflow-y: initial; +} + +code { + direction: ltr !important; +} + +pre > .buttons { + z-index: 2; +} + +a, a:visited, a:active, a:hover { + color: #4183c4; + text-decoration: none; +} + +h1, h2, h3, h4, h5, h6 { + page-break-inside: avoid; + page-break-after: avoid; +} + +pre, code { + page-break-inside: avoid; + white-space: pre-wrap; +} + +.fa { + display: none !important; +} diff --git a/projects/rust/tutorial/css/variables.css b/projects/rust/tutorial/css/variables.css new file mode 100644 index 00000000000..5742d24142b --- /dev/null +++ b/projects/rust/tutorial/css/variables.css @@ -0,0 +1,330 @@ + +/* Globals */ + +:root { + --sidebar-target-width: 300px; + --sidebar-width: min(var(--sidebar-target-width), 80vw); + --sidebar-resize-indicator-width: 8px; + --sidebar-resize-indicator-space: 2px; + --page-padding: 15px; + --content-max-width: 750px; + --menu-bar-height: 50px; + --mono-font: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace; + --code-font-size: 0.875em; /* please adjust the ace font size accordingly in editor.js */ +} + +/* Themes */ + +.ayu { + --bg: hsl(210, 25%, 8%); + --fg: #c5c5c5; + + --sidebar-bg: #14191f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #5c6773; + --sidebar-active: #ffb454; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #0096cf; + + --inline-code-color: #ffb454; + + --theme-popup-bg: #14191f; + --theme-popup-border: #5c6773; + --theme-hover: #191f26; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(210, 25%, 13%); + --table-header-bg: hsl(210, 25%, 28%); + --table-alternate-bg: hsl(210, 25%, 11%); + + --searchbar-border-color: #848484; + --searchbar-bg: #424242; + --searchbar-fg: #fff; + --searchbar-shadow-color: #d4c89f; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #252932; + --search-mark-bg: #e3b171; + + --color-scheme: dark; + + /* Same as `--icons` */ + --copy-button-filter: invert(45%) sepia(6%) saturate(621%) hue-rotate(198deg) brightness(99%) contrast(85%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(68%) sepia(55%) saturate(531%) hue-rotate(341deg) brightness(104%) contrast(101%); + + --footnote-highlight: #2668a6; + + --overlay-bg: rgba(33, 40, 48, 0.4); +} + +.coal { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + + --color-scheme: dark; + + /* Same as `--icons` */ + --copy-button-filter: invert(26%) sepia(8%) saturate(575%) hue-rotate(169deg) brightness(87%) contrast(82%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(36%) sepia(70%) saturate(503%) hue-rotate(167deg) brightness(98%) contrast(89%); + + --footnote-highlight: #4079ae; + + --overlay-bg: rgba(33, 40, 48, 0.4); +} + +.light, html:not(.js) { + --bg: hsl(0, 0%, 100%); + --fg: hsl(0, 0%, 0%); + + --sidebar-bg: #fafafa; + --sidebar-fg: hsl(0, 0%, 0%); + --sidebar-non-existant: #aaaaaa; + --sidebar-active: #1f1fff; + --sidebar-spacer: #f4f4f4; + + --scrollbar: #8F8F8F; + + --icons: #747474; + --icons-hover: #000000; + + --links: #20609f; + + --inline-code-color: #301900; + + --theme-popup-bg: #fafafa; + --theme-popup-border: #cccccc; + --theme-hover: #e6e6e6; + + --quote-bg: hsl(197, 37%, 96%); + --quote-border: hsl(197, 37%, 91%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(0, 0%, 95%); + --table-header-bg: hsl(0, 0%, 80%); + --table-alternate-bg: hsl(0, 0%, 97%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #e4f2fe; + --search-mark-bg: #a2cff5; + + --color-scheme: light; + + /* Same as `--icons` */ + --copy-button-filter: invert(45.49%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(14%) sepia(93%) saturate(4250%) hue-rotate(243deg) brightness(99%) contrast(130%); + + --footnote-highlight: #7e7eff; + + --overlay-bg: rgba(200, 200, 205, 0.4); +} + +.navy { + --bg: hsl(226, 23%, 11%); + --fg: #bcbdd0; + + --sidebar-bg: #282d3f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505274; + --sidebar-active: #2b79a2; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #161923; + --theme-popup-border: #737480; + --theme-hover: #282e40; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(226, 23%, 16%); + --table-header-bg: hsl(226, 23%, 31%); + --table-alternate-bg: hsl(226, 23%, 14%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #aeaec6; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #5f5f71; + --searchresults-border-color: #5c5c68; + --searchresults-li-bg: #242430; + --search-mark-bg: #a2cff5; + + --color-scheme: dark; + + /* Same as `--icons` */ + --copy-button-filter: invert(51%) sepia(10%) saturate(393%) hue-rotate(198deg) brightness(86%) contrast(87%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(46%) sepia(20%) saturate(1537%) hue-rotate(156deg) brightness(85%) contrast(90%); + + --footnote-highlight: #4079ae; + + --overlay-bg: rgba(33, 40, 48, 0.4); +} + +.rust { + --bg: hsl(60, 9%, 87%); + --fg: #262625; + + --sidebar-bg: #3b2e2a; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505254; + --sidebar-active: #e69f67; + --sidebar-spacer: #45373a; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #262625; + + --links: #2b79a2; + + --inline-code-color: #6e6b5e; + + --theme-popup-bg: #e1e1db; + --theme-popup-border: #b38f6b; + --theme-hover: #99908a; + + --quote-bg: hsl(60, 5%, 75%); + --quote-border: hsl(60, 5%, 70%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(60, 9%, 82%); + --table-header-bg: #b3a497; + --table-alternate-bg: hsl(60, 9%, 84%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #dec2a2; + --search-mark-bg: #e69f67; + + /* Same as `--icons` */ + --copy-button-filter: invert(51%) sepia(10%) saturate(393%) hue-rotate(198deg) brightness(86%) contrast(87%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(77%) sepia(16%) saturate(1798%) hue-rotate(328deg) brightness(98%) contrast(83%); + + --footnote-highlight: #d3a17a; + + --overlay-bg: rgba(150, 150, 150, 0.25); +} + +@media (prefers-color-scheme: dark) { + html:not(.js) { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + + --color-scheme: dark; + + /* Same as `--icons` */ + --copy-button-filter: invert(26%) sepia(8%) saturate(575%) hue-rotate(169deg) brightness(87%) contrast(82%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(36%) sepia(70%) saturate(503%) hue-rotate(167deg) brightness(98%) contrast(89%); + } +} diff --git a/projects/rust/tutorial/elasticlunr.min.js b/projects/rust/tutorial/elasticlunr.min.js new file mode 100644 index 00000000000..94b20dd2ef4 --- /dev/null +++ b/projects/rust/tutorial/elasticlunr.min.js @@ -0,0 +1,10 @@ +/** + * elasticlunr - http://weixsong.github.io + * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.5 + * + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + * MIT Licensed + * @license + */ +!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o + + + + diff --git a/projects/rust/tutorial/fonts/OPEN-SANS-LICENSE.txt b/projects/rust/tutorial/fonts/OPEN-SANS-LICENSE.txt new file mode 100644 index 00000000000..d6456956733 --- /dev/null +++ b/projects/rust/tutorial/fonts/OPEN-SANS-LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/projects/rust/tutorial/fonts/SOURCE-CODE-PRO-LICENSE.txt b/projects/rust/tutorial/fonts/SOURCE-CODE-PRO-LICENSE.txt new file mode 100644 index 00000000000..366206f5495 --- /dev/null +++ b/projects/rust/tutorial/fonts/SOURCE-CODE-PRO-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/projects/rust/tutorial/fonts/fonts.css b/projects/rust/tutorial/fonts/fonts.css new file mode 100644 index 00000000000..698e1e19e65 --- /dev/null +++ b/projects/rust/tutorial/fonts/fonts.css @@ -0,0 +1,100 @@ +/* Open Sans is licensed under the Apache License, Version 2.0. See http://www.apache.org/licenses/LICENSE-2.0 */ +/* Source Code Pro is under the Open Font License. See https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL */ + +/* open-sans-300 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300; + src: local('Open Sans Light'), local('OpenSans-Light'), + url('../fonts/open-sans-v17-all-charsets-300.woff2') format('woff2'); +} + +/* open-sans-300italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300; + src: local('Open Sans Light Italic'), local('OpenSans-LightItalic'), + url('../fonts/open-sans-v17-all-charsets-300italic.woff2') format('woff2'); +} + +/* open-sans-regular - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans Regular'), local('OpenSans-Regular'), + url('../fonts/open-sans-v17-all-charsets-regular.woff2') format('woff2'); +} + +/* open-sans-italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 400; + src: local('Open Sans Italic'), local('OpenSans-Italic'), + url('../fonts/open-sans-v17-all-charsets-italic.woff2') format('woff2'); +} + +/* open-sans-600 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 600; + src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'), + url('../fonts/open-sans-v17-all-charsets-600.woff2') format('woff2'); +} + +/* open-sans-600italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 600; + src: local('Open Sans SemiBold Italic'), local('OpenSans-SemiBoldItalic'), + url('../fonts/open-sans-v17-all-charsets-600italic.woff2') format('woff2'); +} + +/* open-sans-700 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 700; + src: local('Open Sans Bold'), local('OpenSans-Bold'), + url('../fonts/open-sans-v17-all-charsets-700.woff2') format('woff2'); +} + +/* open-sans-700italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 700; + src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'), + url('../fonts/open-sans-v17-all-charsets-700italic.woff2') format('woff2'); +} + +/* open-sans-800 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 800; + src: local('Open Sans ExtraBold'), local('OpenSans-ExtraBold'), + url('../fonts/open-sans-v17-all-charsets-800.woff2') format('woff2'); +} + +/* open-sans-800italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 800; + src: local('Open Sans ExtraBold Italic'), local('OpenSans-ExtraBoldItalic'), + url('../fonts/open-sans-v17-all-charsets-800italic.woff2') format('woff2'); +} + +/* source-code-pro-500 - latin_vietnamese_latin-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: url('../fonts/source-code-pro-v11-all-charsets-500.woff2') format('woff2'); +} diff --git a/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-300.woff2 b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-300.woff2 new file mode 100644 index 00000000000..9f51be370fa Binary files /dev/null and b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-300.woff2 differ diff --git a/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-300italic.woff2 b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-300italic.woff2 new file mode 100644 index 00000000000..2f545448418 Binary files /dev/null and b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-300italic.woff2 differ diff --git a/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-600.woff2 b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-600.woff2 new file mode 100644 index 00000000000..f503d558d58 Binary files /dev/null and b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-600.woff2 differ diff --git a/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-600italic.woff2 b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-600italic.woff2 new file mode 100644 index 00000000000..c99aabe8034 Binary files /dev/null and b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-600italic.woff2 differ diff --git a/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-700.woff2 b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-700.woff2 new file mode 100644 index 00000000000..421a1ab25fa Binary files /dev/null and b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-700.woff2 differ diff --git a/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-700italic.woff2 b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-700italic.woff2 new file mode 100644 index 00000000000..12ce3d20d1c Binary files /dev/null and b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-700italic.woff2 differ diff --git a/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-800.woff2 b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-800.woff2 new file mode 100644 index 00000000000..c94a223b033 Binary files /dev/null and b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-800.woff2 differ diff --git a/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-800italic.woff2 b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-800italic.woff2 new file mode 100644 index 00000000000..eed7d3c63d1 Binary files /dev/null and b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-800italic.woff2 differ diff --git a/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-italic.woff2 b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-italic.woff2 new file mode 100644 index 00000000000..398b68a0853 Binary files /dev/null and b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-italic.woff2 differ diff --git a/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-regular.woff2 b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-regular.woff2 new file mode 100644 index 00000000000..8383e94c654 Binary files /dev/null and b/projects/rust/tutorial/fonts/open-sans-v17-all-charsets-regular.woff2 differ diff --git a/projects/rust/tutorial/fonts/source-code-pro-v11-all-charsets-500.woff2 b/projects/rust/tutorial/fonts/source-code-pro-v11-all-charsets-500.woff2 new file mode 100644 index 00000000000..722245682f5 Binary files /dev/null and b/projects/rust/tutorial/fonts/source-code-pro-v11-all-charsets-500.woff2 differ diff --git a/projects/rust/tutorial/highlight.css b/projects/rust/tutorial/highlight.css new file mode 100644 index 00000000000..352c79b9617 --- /dev/null +++ b/projects/rust/tutorial/highlight.css @@ -0,0 +1,83 @@ +/* + * An increased contrast highlighting scheme loosely based on the + * "Base16 Atelier Dune Light" theme by Bram de Haan + * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) + * Original Base16 color scheme by Chris Kempson + * (https://github.com/chriskempson/base16) + */ + +/* Comment */ +.hljs-comment, +.hljs-quote { + color: #575757; +} + +/* Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-attr, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d70025; +} + +/* Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b21e00; +} + +/* Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #008200; +} + +/* Blue */ +.hljs-title, +.hljs-section { + color: #0030f2; +} + +/* Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #9d00ec; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f6f7f6; + color: #000; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #22863a; + background-color: #f0fff4; +} + +.hljs-deletion { + color: #b31d28; + background-color: #ffeef0; +} diff --git a/projects/rust/tutorial/highlight.js b/projects/rust/tutorial/highlight.js new file mode 100644 index 00000000000..18d24345bdd --- /dev/null +++ b/projects/rust/tutorial/highlight.js @@ -0,0 +1,54 @@ +/* + Highlight.js 10.1.1 (93fd0d73) + License: BSD-3-Clause + Copyright (c) 2006-2020, Ivan Sagalaev +*/ +var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function u(e){s+=""}function d(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=l();if(s+=t(r.substring(i,g[0].offset)),i=g[0].offset,g===e){o.reverse().forEach(u);do{d(g.splice(0,1)[0]),g=l()}while(g===e&&g.length&&g[0].offset===i);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),d(g.splice(0,1)[0])}return s+t(r.substr(i))}});const s="",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=``}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"
":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); +hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}()); +hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}()); +hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin://,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}()); +hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.getLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}()); +hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}()); +hljs.registerLanguage("cpp",function(){"use strict";return function(e){var t=e.getLanguage("c-like").rawDefinition();return t.disableAutodetect=!1,t.name="C++",t.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],t}}()); +hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:""}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}()); +hljs.registerLanguage("css",function(){"use strict";return function(e){var n={begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,n]}]}}}()); +hljs.registerLanguage("diff",function(){"use strict";return function(e){return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}}()); +hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:"e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}()); +hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}()); +hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:""},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}()); +hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}()); +hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}()); +hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}()); +hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}()); +hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:")",end:">",keywords:{name:"style"},contains:[c],starts:{end:"",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:")",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}()); +hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}()); +hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}()); +hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}()); +hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}()); +hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}()); +hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}()); +hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}()); +hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}()); +hljs.registerLanguage("python",function(){"use strict";return function(e){var n={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}()); +hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}()); +hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}()); +hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:""}]}}}()); +hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}()); +hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}()); +hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}()); +hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin://},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}()); +hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}()); +hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}()); +hljs.registerLanguage("armasm",function(){"use strict";return function(s){const e={variants:[s.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),s.COMMENT("[;@]","$",{relevance:0}),s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+s.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},e,s.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}}()); +hljs.registerLanguage("d",function(){"use strict";return function(e){var a={$pattern:e.UNDERSCORE_IDENT_RE,keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},d="((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))",n="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",t={className:"number",begin:"\\b"+d+"(L|u|U|Lu|LU|uL|UL)?",relevance:0},_={className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|"+d+"(i|[fF]i|Li))",relevance:0},r={className:"string",begin:"'("+n+"|.)",end:"'",illegal:"."},i={className:"string",begin:'"',contains:[{begin:n,relevance:0}],end:'"[cwd]?'},s=e.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{name:"D",keywords:a,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},i,{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},_,t,r,{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}}}()); +hljs.registerLanguage("handlebars",function(){"use strict";function e(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(n){const a={"builtin-name":"action bindattr collection component concat debugger each each-in get hash if in input link-to loc log lookup mut outlet partial query-params render template textarea unbound unless view with yield"},t=/\[.*?\]/,s=/[^\s!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]+/,i=e("(",/'.*?'/,"|",/".*?"/,"|",t,"|",s,"|",/\.|\//,")+"),r=e("(",t,"|",s,")(?==)"),l={begin:i,lexemes:/[\w.\/]+/},c=n.inherit(l,{keywords:{literal:"true false undefined null"}}),o={begin:/\(/,end:/\)/},m={className:"attr",begin:r,relevance:0,starts:{begin:/=/,end:/=/,starts:{contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,c,o]}}},d={contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:/as\s+\|/,keywords:{keyword:"as"},end:/\|/,contains:[{begin:/\w+/}]},m,c,o],returnEnd:!0},g=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/\)/})});o.contains=[g];const u=n.inherit(l,{keywords:a,className:"name",starts:n.inherit(d,{end:/}}/})}),b=n.inherit(l,{keywords:a,className:"name"}),h=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/}}/})});return{name:"Handlebars",aliases:["hbs","html.hbs","html.handlebars","htmlbars"],case_insensitive:!0,subLanguage:"xml",contains:[{begin:/\\\{\{/,skip:!0},{begin:/\\\\(?=\{\{)/,skip:!0},n.COMMENT(/\{\{!--/,/--\}\}/),n.COMMENT(/\{\{!/,/\}\}/),{className:"template-tag",begin:/\{\{\{\{(?!\/)/,end:/\}\}\}\}/,contains:[u],starts:{end:/\{\{\{\{\//,returnEnd:!0,subLanguage:"xml"}},{className:"template-tag",begin:/\{\{\{\{\//,end:/\}\}\}\}/,contains:[b]},{className:"template-tag",begin:/\{\{#/,end:/\}\}/,contains:[u]},{className:"template-tag",begin:/\{\{(?=else\}\})/,end:/\}\}/,keywords:"else"},{className:"template-tag",begin:/\{\{\//,end:/\}\}/,contains:[b]},{className:"template-variable",begin:/\{\{\{/,end:/\}\}\}/,contains:[h]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,contains:[h]}]}}}()); +hljs.registerLanguage("haskell",function(){"use strict";return function(e){var n={variants:[e.COMMENT("--","$"),e.COMMENT("{-","-}",{contains:["self"]})]},i={className:"meta",begin:"{-#",end:"#-}"},a={className:"meta",begin:"^#",end:"$"},s={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},l={begin:"\\(",end:"\\)",illegal:'"',contains:[i,a,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TITLE_MODE,{begin:"[_a-z][\\w']*"}),n]};return{name:"Haskell",aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[l,n],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[l,n],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[s,l,n]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[i,s,l,{begin:"{",end:"}",contains:l.contains},n]},{beginKeywords:"default",end:"$",contains:[s,l,n]},{beginKeywords:"infix infixl infixr",end:"$",contains:[e.C_NUMBER_MODE,n]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[s,e.QUOTE_STRING_MODE,n]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},i,a,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,s,e.inherit(e.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),n,{begin:"->|<-"}]}}}()); +hljs.registerLanguage("julia",function(){"use strict";return function(e){var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r,keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi γ π φ ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},a={keywords:t,illegal:/<\//},n={className:"subst",begin:/\$\(/,end:/\)/,keywords:t},o={className:"variable",begin:"\\$"+r},i={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},l={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],begin:"`",end:"`"},s={className:"meta",begin:"@"+r};return a.name="Julia",a.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i,l,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],n.contains=a.contains,a}}()); +hljs.registerLanguage("nim",function(){"use strict";return function(e){return{name:"Nim",aliases:["nim"],keywords:{keyword:"addr and as asm bind block break case cast const continue converter discard distinct div do elif else end enum except export finally for from func generic if import in include interface is isnot iterator let macro method mixin mod nil not notin object of or out proc ptr raise ref return shl shr static template try tuple type using var when while with without xor yield",literal:"shared guarded stdin stdout stderr result true false",built_in:"int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 float float32 float64 bool char string cstring pointer expr stmt void auto any range array openarray varargs seq set clong culong cchar cschar cshort cint csize clonglong cfloat cdouble clongdouble cuchar cushort cuint culonglong cstringarray semistatic"},contains:[{className:"meta",begin:/{\./,end:/\.}/,relevance:10},{className:"string",begin:/[a-zA-Z]\w*"/,end:/"/,contains:[{begin:/""/}]},{className:"string",begin:/([a-zA-Z]\w*)?"""/,end:/"""/},e.QUOTE_STRING_MODE,{className:"type",begin:/\b[A-Z]\w+\b/,relevance:0},{className:"number",relevance:0,variants:[{begin:/\b(0[xX][0-9a-fA-F][_0-9a-fA-F]*)('?[iIuU](8|16|32|64))?/},{begin:/\b(0o[0-7][_0-7]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(0(b|B)[01][_01]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(\d[_\d]*)('?[iIuUfF](8|16|32|64))?/}]},e.HASH_COMMENT_MODE]}}}()); +hljs.registerLanguage("nix",function(){"use strict";return function(e){var n={keyword:"rec with let in inherit assert if else then",literal:"true false or and null",built_in:"import abort baseNameOf dirOf isNull builtins map removeAttrs throw toString derivation"},i={className:"subst",begin:/\$\{/,end:/}/,keywords:n},t={className:"string",contains:[i],variants:[{begin:"''",end:"''"},{begin:'"',end:'"'}]},s=[e.NUMBER_MODE,e.HASH_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t,{begin:/[a-zA-Z0-9-_]+(\s*=)/,returnBegin:!0,relevance:0,contains:[{className:"attr",begin:/\S+/}]}];return i.contains=s,{name:"Nix",aliases:["nixos"],keywords:n,contains:s}}}()); +hljs.registerLanguage("r",function(){"use strict";return function(e){var n="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{name:"R",contains:[e.HASH_COMMENT_MODE,{begin:n,keywords:{$pattern:n,keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}}}()); +hljs.registerLanguage("scala",function(){"use strict";return function(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},a={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},s={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0},i={className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},t]},l={className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]};return{name:"Scala",keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},s,l,i,e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}}()); +hljs.registerLanguage("x86asm",function(){"use strict";return function(s){return{name:"Intel x86 Assembly",case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE,keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}}}()); \ No newline at end of file diff --git a/projects/rust/tutorial/index.html b/projects/rust/tutorial/index.html new file mode 100644 index 00000000000..8fb0a290fc0 --- /dev/null +++ b/projects/rust/tutorial/index.html @@ -0,0 +1,239 @@ + + + + + + Introduction - Using Rust in seL4 Userspace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +

Tutorial: Using Rust in seL4 Userspace

+

seL4 has official support for Rust in userspace, funded by the seL4 Foundation:

+

https://github.com/seL4/rust-sel4

+

The exports of this project covered in this tutorial are:

+
    +
  • Rust bindings for the seL4 API
  • +
  • A runtime for root tasks
  • +
  • Rust bindings for the seL4 Microkit API
  • +
  • A runtime for seL4 Microkit protection domains
  • +
  • Custom rustc target specifications for seL4 userspace
  • +
+

Part I covers the Rust bindings for the seL4 API and the runtime for root tasks. +Familiarity with the seL4 API isn't necessarily assumed or required, but this text doesn't introduce its elements in as much detail as the seL4 Manual.

+

Part II is much shorter, and covers the Rust language runtime for seL4 Microkit protection domains and implementation of the Microkit API. +This part does assume that the reader is familiar with the basics of the Microkit framework and API, or is using a companion resource to learn about the Microkit in parallel.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/projects/rust/tutorial/introduction.html b/projects/rust/tutorial/introduction.html new file mode 100644 index 00000000000..8fb0a290fc0 --- /dev/null +++ b/projects/rust/tutorial/introduction.html @@ -0,0 +1,239 @@ + + + + + + Introduction - Using Rust in seL4 Userspace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +

Tutorial: Using Rust in seL4 Userspace

+

seL4 has official support for Rust in userspace, funded by the seL4 Foundation:

+

https://github.com/seL4/rust-sel4

+

The exports of this project covered in this tutorial are:

+
    +
  • Rust bindings for the seL4 API
  • +
  • A runtime for root tasks
  • +
  • Rust bindings for the seL4 Microkit API
  • +
  • A runtime for seL4 Microkit protection domains
  • +
  • Custom rustc target specifications for seL4 userspace
  • +
+

Part I covers the Rust bindings for the seL4 API and the runtime for root tasks. +Familiarity with the seL4 API isn't necessarily assumed or required, but this text doesn't introduce its elements in as much detail as the seL4 Manual.

+

Part II is much shorter, and covers the Rust language runtime for seL4 Microkit protection domains and implementation of the Microkit API. +This part does assume that the reader is familiar with the basics of the Microkit framework and API, or is using a companion resource to learn about the Microkit in parallel.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/projects/rust/tutorial/mark.min.js b/projects/rust/tutorial/mark.min.js new file mode 100644 index 00000000000..16362318834 --- /dev/null +++ b/projects/rust/tutorial/mark.min.js @@ -0,0 +1,7 @@ +/*!*************************************************** +* mark.js v8.11.1 +* https://markjs.io/ +* Copyright (c) 2014–2018, Julian Kühnel +* Released under the MIT license https://git.io/vwTVl +*****************************************************/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Mark=t()}(this,function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=i,this.iframesTimeout=o}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach(function(t){var n=e.filter(function(e){return e.contains(t)}).length>0;-1!==e.indexOf(t)||n||e.push(t)}),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var i=e.contentWindow;if(r=i.document,!i||!r)throw new Error("iframe inaccessible")}catch(e){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,i=!1,o=null,a=function a(){if(!i){i=!0,clearTimeout(o);try{r.isIframeBlank(e)||(e.removeEventListener("load",a),r.getIframeContents(e,t,n))}catch(e){n()}}};e.addEventListener("load",a),o=setTimeout(a,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(e){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,function(){return!0},function(e){r++,n.waitForIframes(e.querySelector("html"),function(){--r||t()})},function(e){e||t()})}},{key:"forEachIframe",value:function(t,n,r){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=t.querySelectorAll("iframe"),s=a.length,c=0;a=Array.prototype.slice.call(a);var u=function(){--s<=0&&o(c)};s||u(),a.forEach(function(t){e.matches(t,i.exclude)?u():i.onIframeReady(t,function(e){n(t)&&(c++,r(e)),u()},u)})}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:null===t?e.nextNode():e.nextNode()&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var i=!1,o=!1;return r.forEach(function(e,t){e.val===n&&(i=t,o=e.handled)}),this.compareNodeIframe(e,t,n)?(!1!==i||o?!1===i||o||(r[i].handled=!0):r.push({val:n,handled:!0}),!0):(!1===i&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var i=this;e.forEach(function(e){e.handled||i.getIframeContents(e.val,function(e){i.createInstanceOnIframe(e).forEachNode(t,n,r)})})}},{key:"iterateThroughNodes",value:function(e,t,n,r,i){for(var o,a=this,s=this.createIterator(t,e,r),c=[],u=[],l=void 0,h=void 0;void 0,o=a.getIteratorNode(s),h=o.prevNode,l=o.node;)this.iframes&&this.forEachIframe(t,function(e){return a.checkIframeFilter(l,h,e,c)},function(t){a.createInstanceOnIframe(t).forEachNode(e,function(e){return u.push(e)},r)}),u.push(l);u.forEach(function(e){n(e)}),this.iframes&&this.handleOpenIframes(c,e,n,r),i()}},{key:"forEachNode",value:function(e,t,n){var r=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=this.getContexts(),a=o.length;a||i(),o.forEach(function(o){var s=function(){r.iterateThroughNodes(e,o,t,n,function(){--a<=0&&i()})};r.iframes?r.waitForIframes(o,s):s()})}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var i=!1;return n.every(function(t){return!r.call(e,t)||(i=!0,!1)}),i}return!1}}]),e}(),o=function(){function e(n){t(this,e),this.opt=r({},{diacritics:!0,synonyms:{},accuracy:"partially",caseSensitive:!1,ignoreJoiners:!1,ignorePunctuation:[],wildcards:"disabled"},n)}return n(e,[{key:"create",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),new RegExp(e,"gm"+(this.opt.caseSensitive?"":"i"))}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var i in t)if(t.hasOwnProperty(i)){var o=t[i],a="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(i):this.escapeStr(i),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o);""!==a&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(a)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynonyms(a)+"|"+this.processSynonyms(s)+")"+r))}return e}},{key:"processSynonyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,function(e){return"\\"===e.charAt(0)?"?":""})).replace(/(?:\\)*\*/g,function(e){return"\\"===e.charAt(0)?"*":""})}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"})}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"],r=[];return e.split("").forEach(function(i){n.every(function(n){if(-1!==n.indexOf(i)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0})}),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n=this.opt.accuracy,r="string"==typeof n?n:n.value,i="";switch(("string"==typeof n?[]:n.limiters).forEach(function(e){i+="|"+t.escapeStr(e)}),r){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿")))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach(function(e){t.opt.separateWordSearch?e.split(" ").forEach(function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)}):e.trim()&&-1===n.indexOf(e)&&n.push(e)}),{keywords:n.sort(function(e,t){return t.length-e.length}),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort(function(e,t){return e.start-t.start}).forEach(function(e){var i=t.callNoMatchOnInvalidRanges(e,r),o=i.start,a=i.end;i.valid&&(e.start=o,e.length=a-o,n.push(e),r=a)}),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,i=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?i=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:i}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,i=!0,o=n.length,a=t-o,s=parseInt(e.start,10)-a;return(r=(s=s>o?o:s)+parseInt(e.length,10))>o&&(r=o,this.log("End range automatically set to the max value of "+o)),s<0||r-s<0||s>o||r>o?(i=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(i=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:i}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})},function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){e({value:n,nodes:r})})}},{key:"matchesExclude",value:function(e){return i.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",i=e.splitText(t),o=i.splitText(n-t),a=document.createElement(r);return a.setAttribute("data-markjs","true"),this.opt.className&&a.setAttribute("class",this.opt.className),a.textContent=i.textContent,i.parentNode.replaceChild(a,i),o}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,i){var o=this;e.nodes.every(function(a,s){var c=e.nodes[s+1];if(void 0===c||c.start>t){if(!r(a.node))return!1;var u=t-a.start,l=(n>a.end?a.end:n)-a.start,h=e.value.substr(0,a.start),f=e.value.substr(l+a.start);if(a.node=o.wrapRangeInTextNode(a.node,u,l),e.value=h+f,e.nodes.forEach(function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=l),e.nodes[n].end-=l)}),n-=l,i(a.node.previousSibling,a.start),!(n>a.end))return!1;t=a.end}return!0})}},{key:"wrapGroups",value:function(e,t,n,r){return r((e=this.wrapRangeInTextNode(e,t,t+n)).previousSibling),e}},{key:"separateGroups",value:function(e,t,n,r,i){for(var o=t.length,a=1;a-1&&r(t[a],e)&&(e=this.wrapGroups(e,s,t[a].length,i))}return e}},{key:"wrapMatches",value:function(e,t,n,r,i){var o=this,a=0===t?0:t+1;this.getTextNodes(function(t){t.nodes.forEach(function(t){t=t.node;for(var i=void 0;null!==(i=e.exec(t.textContent))&&""!==i[a];){if(o.opt.separateGroups)t=o.separateGroups(t,i,a,n,r);else{if(!n(i[a],t))continue;var s=i.index;if(0!==a)for(var c=1;c + + + + + Hello, World! - Using Rust in seL4 Userspace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +

Hello, World!

+

Navigate to and run the hello world Microkit example:

+
cd workspaces/microkit/hello-world
+make simulate
+
+

Here is its source:

+ +

The sel4_microkit crate implements a Rust language runtime for Microkit protection domains, and implements the Microkit API. +It is written in pure Rust, and does not link against libmicrokit.

+

The Event Handler

+

The #[protection_domain] attribute macro declares a function to be the protection domain's initialization function. +The entrypoint function must have a signature of the form:

+
fn() -> T
+where
+    T: sel4_microkit::Handler
+

An implementation of the Handler trait is used by the runtime as the event handler for the protection domain's main loop. +The +notified, +protected, +and +fault +methods correspond to their equivalents in <microkit.h>.

+

The default implementations of these methods just panic. +Our event handler, which we've called HandlerImpl, is the simplest possible Handler implementation.

+

Language Runtime

+

As detailed in its rustdoc, the #[protection_domain] attribute macro takes the same parameters as #[root_task]. +Furthermore, the sel4_microkit crate supports all of the same Rust language runtime elements that we explored in Chapter 2, including +sel4_microkit::panicking::catch_unwind() +and +sel4_microkit::panicking::set_hook() +.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/projects/rust/tutorial/microkit/index.html b/projects/rust/tutorial/microkit/index.html new file mode 100644 index 00000000000..0126c476232 --- /dev/null +++ b/projects/rust/tutorial/microkit/index.html @@ -0,0 +1,239 @@ + + + + + + Overview - Using Rust in seL4 Userspace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +

seL4 Microkit

+

The seL4 Microkit is a framework for creating static systems based on seL4. +This part of the text assumes that the reader is familiar with the basics of the Microkit framework and API, or is using a companion resource to learn about the Microkit in parallel. +Here are three such resources:

+ +

This part also assumes that the reader has worked through chapters 2 and 6 of Part I.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/projects/rust/tutorial/microkit/ipc.html b/projects/rust/tutorial/microkit/ipc.html new file mode 100644 index 00000000000..7980a9d7f77 --- /dev/null +++ b/projects/rust/tutorial/microkit/ipc.html @@ -0,0 +1,363 @@ + + + + + + IPC - Using Rust in seL4 Userspace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +

IPC

+

This chapter covers making and handling protected procedure calls in protection domains written in Rust. +Navigate to and run the example:

+
cd workspaces/microkit/ipc
+make simulate
+
+

The example system description specifies two protection domains, with a channel between them:

+ + + +

The +Channel type is the Rust equivalent of the +microkit_channel +type alias in libmicrokit. +Note how the functionality corresponding to libmicrokit's microkit_notify, microkit_irq_ack, and microkit_ppcall is implemented in methods for Channel.

+

The +MessageInfo type is the Rust equivalent of the +microkit_msginfo +type alias in libmicrokit. +Just as microkit_msginfo is an alias for seL4_MessageInfo_t, sel4_microkit::MessageInfo is just a thin wrapper around MessageInfo.

+

libmicrokit has microkit_mr_set() and microkit_mr_get() for interacting with the IPC buffer. +In the sel4_microkit crate, we have +get_mr() +and +set_mr() +, +but we also have +with_msg_regs(), +with_msg_regs_mut(), +with_msg_bytes(), and +with_msg_bytes_mut(), +which use +sel4::with_ipc_buffer() and +sel4::with_ipc_buffer_mut() under the hood.

+

Step 10.A (exercise)       

+

Exercise: +In the client's notified() handler, make a protected procedure call to the server using SERVER.pp_call(). +Handle the call in the server's protected() handler. +Include data in the message using sel4_microkit::with_msg_regs{,_mut}.

+

Exercise (optional): +Send something more interesting over IPC using +msg_bytes +and +msg_bytes_mut +. +For example, the zerocopy crate can be used to view certain types as bytes and vice versa, and the lightweight postcard crate can be used to serialize and deserialize a wider range of types using serde.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/projects/rust/tutorial/microkit/shared-memory.html b/projects/rust/tutorial/microkit/shared-memory.html new file mode 100644 index 00000000000..7977e0aa0c9 --- /dev/null +++ b/projects/rust/tutorial/microkit/shared-memory.html @@ -0,0 +1,375 @@ + + + + + + Shared Memory - Using Rust in seL4 Userspace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +

Shared Memory

+

This chapter covers interacting with shared memory from protection domains written in Rust. +Navigate to and run the example:

+
cd workspaces/microkit/shared-memory
+make simulate
+
+

The example system description specifies two protection domains which share two memory regions:

+ +

The Microkit tool will inject memory region virtual addresses into protection domain images according to the setvar_vaddr attribute values. +For example, the virtual address of the mapping of region_a into the client protection domain will be injected into the microkit-shared-memory-client.elf image at the location specified by then region_a_vaddr symbol.

+

In the case of Rust, declaring a symbol that the Microkit tool can patch requires a bit more intentionality than in the C case. +The sel4_microkit::var! macro is provided to declare such symbols.

+

The var! macro's implementation is just a few lines of code. +We want to express this symbol as a global variable that does not change at runtime, but which cannot be assumed to have the value we assign it at compile time, and which must not be optimized away. +The near-trivial +sel4_immutable_cell::ImmutableCell type encapsulates this pattern. +The #[no_mangle] attribute instructs the compiler to use the name of the variable as the name of the symbol. +This is the default in C, but not Rust. +We direct the compiler to put this symbol in the .data section with #[link_section = ".data"] to ensure that space is allocated for it in the ELF file itself, not just the program image it describes.

+

So far, the example protection domains just store pointers to the shared memory regions in their handler state:

+ + +

Step 11.A       

+

Let's assign types to these shared memory regions. +We can define our types in a crate that both the client and server can use:

+ +

Suppose region_a: [u8; REGION_A_SIZE] and region_b: RegionB. +You could just turn the virtual addresses we get in our var! symbols into pointers and start interacting with the shared memory regions with unsafe ptr::* operations, but we can leverage the Rust type system to come up with a solution that only requires unsafe at initialization time.

+

Step 11.B       

+

The +sel4-shared-memory +crate provides a way for you to declare a memory region's type and bounds, along with the memory access operations that can safely be used on it, so that you can access it without unsafe code. +That initial declaration is, however, unsafe.

+

The +sel4-shared-memory +is a thin wrapper around the +sel4_abstract_ptr +crate, instantiating its abstract pointer types with memory access operations suitable for memory that is shared with another protection domain.

+

The +sel4_microkit::memory_region_symbol! +macro is like the sel4_microkit::var! macro, except specialized for shared memory region virtual address symbols. +For one, the underlying symbol is always of type usize and the macro returns a value of type NonNull<_>. +memory_region_symbol! has a few additional features. +For example, memory_region_symbol!(foo: *mut [u8] n = BAR) returns a NonNull<[u8]> with a runtime slice length of BAR.

+

See this step's diff for how to put this all together.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/projects/rust/tutorial/print.html b/projects/rust/tutorial/print.html new file mode 100644 index 00000000000..6bd031d4499 --- /dev/null +++ b/projects/rust/tutorial/print.html @@ -0,0 +1,1514 @@ + + + + + + Using Rust in seL4 Userspace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +

Tutorial: Using Rust in seL4 Userspace

+

seL4 has official support for Rust in userspace, funded by the seL4 Foundation:

+

https://github.com/seL4/rust-sel4

+

The exports of this project covered in this tutorial are:

+
    +
  • Rust bindings for the seL4 API
  • +
  • A runtime for root tasks
  • +
  • Rust bindings for the seL4 Microkit API
  • +
  • A runtime for seL4 Microkit protection domains
  • +
  • Custom rustc target specifications for seL4 userspace
  • +
+

Part I covers the Rust bindings for the seL4 API and the runtime for root tasks. +Familiarity with the seL4 API isn't necessarily assumed or required, but this text doesn't introduce its elements in as much detail as the seL4 Manual.

+

Part II is much shorter, and covers the Rust language runtime for seL4 Microkit protection domains and implementation of the Microkit API. +This part does assume that the reader is familiar with the basics of the Microkit framework and API, or is using a companion resource to learn about the Microkit in parallel.

+
+

Setup

+

This tutorial is presented as a linear series of patches to https://github.com/seL4/seL4-rust-tutorial-code, starting at commit 8ca0e1939dc1, and ending with commit 5253edc1ed12. +Each patch, or step, as we shall call them, is an instructive modification to a code example. +You are encouraged (but by no means required) to attempt those marked as exercises in this text on your own. +Note that while most step patches include tests, the reader is not expected to write tests for exercises themselves.

+

Clone the repository and checkout the starting commit:

+
git clone https://github.com/seL4/seL4-rust-tutorial-code
+cd seL4-rust-tutorial-code
+git checkout 8ca0e1939dc1
+
+

Observe the steps ahead:

+
git log 8ca0e1939dc1..5253edc1ed12
+
+

Each step header contains two icons. +Clicking the clipboard copies the commit hash corresponding to the step to the clipboard. +The GitHub icon is a link to the commit on GitHub.

+

Use any Git workflow that works for you. +For example, you could cherry-pick the steps that are not marked as exercises after examining and understanding them, and then attempt the exercises on your own, using those step commits as hints when necessary.

+

Docker

+

We will work inside of a Docker container built with docker/Dockerfile. +This Dockerfile installs some build-time dependencies, and then builds seL4, seL4 Microkit, and some additional programs and tools.

+

Build the image:

+
make -C docker build
+
+

Run a container in the background:

+
make -C docker run
+
+

Start a shell inside the container:

+
make -C docker exec
+
+

The rest of this text assumes that you are in a shell inside the container.

+

Two Workspaces

+

To simplify our Cargo invocations, this repository's Rust code has been divided between two distinct workspaces: workspaces/root-task and workspaces/microkit. +Both are subject to the top-level .cargo/config.toml, whereas workspaces/root-task/.cargo/config.toml and workspaces/microkit/.cargo/config.toml each apply to only one. +These workspace-specific config.toml files demonstrate all that is required to configure the crates in the rust-sel4 project:

+ +

VSCode + Dev Containers

+

If you want help from rust-analyzer, the Rust Language Server, you can use VSCode with the Dev Containers extension. +This will enable you to run VSCode inside of the container you just built, which contains the seL4 build artifacts that rust-analyzer will require to analyzer your code.

+

This repository provides a separate Dev Container configuration for each workspace:

+ +

To work in a particular workspace, open this repository in VSCode, run > Dev Containers: Reopen in Container, and select the corresponding configuration. +You should now be able to use the rust-analyzer VSCode extension normally for the code in the selected workspace.

+

Rustdoc

+

Rustdoc for the rust-sel4 project is hosted here:

+

https://sel4.github.io/rust-sel4/

+

However, for the sake of consistency, rustdoc for the particular configurations studied in this text are hosted here too. +There is one set of rustdoc for each of the two workspace configurations mentioned in Two Workspaces. +Rustdoc does not generate an index page, but you can navigate across crates within a workspace configuration using the sidebar present on top-level rustdoc page for any module.

+ +
+

The Root Task

+

After initializing itself, the seL4 kernel passes control to a userspace program called the root task, whose image is provided to the kernel at boot-time. +The root task's capability space contains capabilities for all memory and boot-time objects. +That is to say, the root task spawns with the maximum privilege that a userspace program can have. +The kernel provides the root task with a map of its initial capability space in the form of the BootInfo frame. +You can read more about the root task's environment in seL4 Reference Manual § 9.1.

+

Part I of this tutorial will focus on writing from-scratch root tasks in Rust. +Some of the code in Part I will be quite low-level, interacting with the language runtime, the linker, and some of the finer details related to bootstrapping an seL4-based system. +The only seL4-related crates we will be using are the language runtime and bindings for the seL4 API. +Unlike situations where higher-level seL4-related libraries (such as seL4_libs) are used, we will be allocating objects and manage virtual address spaces from scratch.

+

At boot time, the seL4 kernel and root task are loaded into memory by a kind of bootloader stub referred to as a seL4 kernel loader. +For Part I, we will use the kernel loader from the rust-sel4 project. +We won't cover how it works or how to use it explicitly in this text. +It is built at docker/Dockerfile:94:108, and used at mk/root-task.mk:31:36.

+
+

Hello, World!

+

Run the hello world example:

+
cd workspaces/root-task/hello-world
+make simulate
+
+

Press ctrl-a x to exit QEMU.

+

Here is its source:

+ +

The Rust standard library is divided into three layers:

+
    +
  • core: dependency-free foundation
  • +
  • alloc: implements heap-backed data structures, but requires a runtime that provides a heap allocator
  • +
  • std includes core and alloc, and adds APIs that depend on OS services such as networking and filesystems
  • +
+

The high-level std doesn't support the low-level seL4 root task target. +#![no_std] declares that this crate does not depend on std, and prevents rustc from automatically importing it.

+

Our language runtime will handle the program's entrypoint differently than a typical Rust program. +#![no_main] informs rustc of this fact.

+

The sel4 crate binds the seL4 API. +It is generated from source (.xml, .bf, and .h) in libsel4. +We will cover the contents of this crate in future chapters.

+

The sel4_root_task crate implements a Rust language runtime for the root task environment.

+

The #[root_task] attribute macro declares a function to be the root task's entrypoint. +The entrypoint function must have a signature of the form:

+
fn(&sel4::BootInfoPtr) -> T
+where
+    T: sel4_root_task::Termination
+

(Rustdoc for BootInfoPtr and Termination)

+

The root task has no way to exit, so, to terminate cleanly, it must suspend its own thread. +sel4::init_thread::suspend_self() does exactly this.

+

Step 2.A (exercise)       

+

Exercise: Cause a panic.

+

Step 2.B (exercise)       

+

Exercise: Catch the panic using sel4_root_task::panicking::catch_unwind().

+

Step 2.C (exercise)       

+

You can set a custom panic hook with sel4_root_task::panicking::PanicHook. +The default hook just prints the panic's ExternalPanicInfo.

+

Exercise: Set a custom panic hook.

+

Step 2.D (exercise)       

+

Exercise: Cause a stack overflow.

+

Step 2.E (exercise)       

+

The #[root_task] attribute macro accepts a named stack_size parameter, which can be any expression of type usize and whose value is interpreted as the root task's initial thread's stack size, in bytes. +For example:

+
#[root_task(stack_size = 13 * 37)]
+

The default stack size is sel4_root_task::DEFAULT_STACK_SIZE.

+

Exercise: Adjust the root task's initial thread's stack size to prevent the stack overflow you just caused.

+

Step 2.F (exercise)       

+

By default, the sel4_root_task runtime does not include a heap. +Any attempt to use the alloc crate will result in a link-time failure.

+

The #[root_task] attribute macro accepts a heap_size parameter, which can be any expression of type usize and whose value is interpreted as the root task's heap size, in bytes. +Note that heap_size must come after stack_size in the case where both are present. +For example:

+
#[root_task(heap_size = 0xf00d)]
+

or

+
#[root_task(stack_size = 13 * 37, heap_size = 0xf00d)]
+

Exercise: Add a heap and use it.

+

Step 2.G       

+

The sel4_logging crate builds on top of the log crate to add utilities for initializing simple loggers in minimal environments, such as a seL4 root task. +This step demonstrates one way to initialize a logger using this crate:

+ + +
+

Allocating Kernel Objects

+

Start by navigating to and running this chapter's example, which, so far, is empty.

+
cd workspaces/root-task/kernel-objects
+make simulate
+
+

Userspace operates the seL4 kernel by creating, managing, and accessing kernel objects via references called capabilites. +See seL4 Reference Manual § 2.3 (Kernel Objects) for an outline of the core types of kernel objects.

+

In the context of seL4, a capability is a granular, unforgeable token of authority that references a kernel object and carries access rights that limit what the user of a cabability can do with the referenced kernel object. +In general, a system call in seL4 amounts to refering to a cabability and an action on the kernel object the cabability points to. +This is called invoking a capability.

+ +

Just as each thread is associated with a virtual address space which the hardware uses to translate virtual memory addresses into locations in physical memory, each seL4 thread is also assocated with a capability space (CSpace) which the kernel uses to translate so-called capability pointers (CPointers or CPtrs) into locations (slots) in the kernel's capability tables called CNodes.

+

The sel4::CPtr type is a wrapper around a machine word. +The sel4::Cap<T> type wraps a CPtr associated with the current thread's CSpace, and thus points to a particular capability slot within the kernel. +It is paramterized by a capability type T: sel4::CapType, representing the type of capability in that slot. +It is up to the crate user to ensure that Cap's are valid and well-typed in the current thread.

+

The sel4::cap module contains aliases of the form sel4::Cap<sel4::cap_type::*>.

+

Depending on the Cap's type T, a Cap has a number of methods available, which correspond to invocations for that capability type. +For example, sel4::Cap::tcb_resume() is available when T is sel4::cap_type::Tcb.

+

Step 3.A       

+

As elaborated in seL4 Reference Manual § 2.4 (Kernel Memory Allocation), userspace is responsible for managing the memory associated with kernel objects. +Untyped memory is the name of the object type for free memory. +At boot time, the root task is granted untyped memory capabilities for all of the system's memory, except for the memory used for the kernel and the root task's own resources.

+

Print the untyped memory described by the BootInfo frame:

+ +

Sample output:

+
untyped:
+    paddr: 0x00000000000000, size bits: 27, is device: true
+    paddr: 0x00000008001000, size bits: 12, is device: true
+    paddr: 0x00000008002000, size bits: 13, is device: true
+    paddr: 0x00000008004000, size bits: 14, is device: true
+    paddr: 0x00000008008000, size bits: 15, is device: true
+    paddr: 0x00000008011000, size bits: 12, is device: true
+    paddr: 0x00000008012000, size bits: 13, is device: true
+    ...
+
+

sel4::UntypedDesc::size_bits() returns the log base 2 of the size of the region of memory described by the descriptor.

+

sel4::UntypedDesc::is_device() returns whether the region is device memory or kernel memory. +Device memory can only be used for creating frames, whereas kernel memory has no such restrictions.

+

Step 3.B       

+

Add a function that finds the largest untyped region passed to the root task:

+ +

The expression bootinfo.untyped().index(ut_ix).cap() indexes into bootinfo.untyped(): SlotRegion<Untyped> to retrieve a Slot<Untyped>, which can be turned into a Cap<Untyped> (= cap::Untyped).

+

Step 3.C       

+

In this step, we will allocate a Notification object.

+

We already know how to refer to a capability in the current thread's CSpace: a CPtr. +However, some capability invocations allow us to refer to a capability slot in any CSpace whose root CNode is present in the current thread's CSpace. +In these cases, we must provide:

+
    +
  • A CPtr, interpreted in the context of the current thread's CSpace, which points to the target CSpace's root CNode
  • +
  • A CPtr, interpreted in the context of the target CSpace, which points to the target capability slot
  • +
  • A depth, which is the number of bits of the second CPtr to interpret. This allows for the second CPtr to point to a CNode. Why this is necessary is outside the scope of this tutorial, but you can read about it in seL4 Reference Manual § 2.4 (CSpace Addressing).
  • +
+

Consider, for example, the seL4_CNode_Mint capability invocation. +dest_* and src_* are both capability slots addressed in this way.

+

This more flexible method of capability slot addressing is encapsulated in the sel4::AbsoluteCPtr type.

+

The seL4_Untyped_Retype method is used for allocating new objects from an untyped object. +The _service parameter is the address of the untyped object as a normal CPtr. +root, node_index, and node_depth address, in the more flexible way outlined above, the destination CNode into which capabilities for the new objects will be inserted. +node_offset and num_objects specify a range of slots within the selected CNode for the new capabilites (and, simultaneously, the number of new objects that will be created).

+

type and size_bits specify the shape of the new object(s) +Note that size_bits is relevant for only certain object types (see seL4 Reference Manual § 2.4.2 (Summary of Object Sizes) for more information). +This shape information is encapsulated in the sel4::ObjectBlueprint type.

+

Multiple kernel objects can be allocated from a single unytped object. +For each untyped object, the kernel maintains a watermark which tracks how much of the untyped object has been used up for object allocation. +seL4_Untyped_Retype aligns the watermark to the desired object type's size, and then advances it according to the object type size and number of objects. +This process is detailed in the fourth paragraph of seL4 Reference Manual § 2.4.1 (Reusing Memory).

+

Let us now work towards calling sel4::cap::Untyped::untyped_retype() on our previously acquired largest_kernel_ut. +We wish to allocate one notification object and insert a capability for it into a free slot in the current thread's own CSpace. +More precisely, we need a sel4::AbsoluteCPtr for the current thread's own CSpace's root CNode, and an index into that CNode for a free slot.

+

The CPtr for the initial thread's own CSpace root is a constant:

+ +

bootinfo can tell us about a range of empty slots in this CSpace. +We can leverage the fact that Rust's Range<T> type is an iterator for certain T to allocate slots in an ergonomic way:

+ +

The {{#rustdoc_link root-task sel4/cap/type.CNode.html#method.absolute_cptr_for_selfsel4::cap::CNode::absolute_cptr_for_self()}} method elaborates a sel4::cap::Cnode into a sel4::AbsoluteCPtr. +Interestingly, there are two ways to do this, but the current implementation is just to use a depth of zero.

+

Now we can invoke our untyped capability to allocate a notification object:

+ +

Now that we know that notification_slot contains a notification capability, we can cast it and get a sel4::cap::Notification:

+ +

Step 3.D (exercise)       

+

Exercise:: Use sel4::cap::Notification::signal() and sel4::cap::Notification::wait() to signal and then wait on the notification.

+

Step 3.E (exercise)       

+

As described in seL4 Reference Manual § 5 (Notifications), a notification capability can contain a word-sized mask called a badge. +When that capability is used to signal the notification, the notification's word-sized state is bit-wise ored with the capability's badge. +A wait call on the notification returns and clears the notification's state, provided that a signal call has occurred since the last wait call.

+

sel4::AbsoluteCPtr::mint() mints a new capability from an existing capability, updatings its access rights and badge.

+

Exercise:: Allocate a new empty slot in the current CNode.

+

A slot in the root task's CSpace (i.e. a value of type sel4::init_thread::Slot) can be turned into an sel4::AbsoluteCPtr using {{#rustdoc_link root-task sel4/cap/type.CNode.html#method.absolute_cptrsel4::CNode::absolute_cptr()}}:

+ +

Exercise:: Mint a capability based on the capability in notification_slot into your newly allocated slot. Use sel4::CapRights::all() for the rights parameter, and specify a non-zero badge value.

+

Exercise:: Signal the notification using your newly minted badged capability. Using the return value of sel4::Notification::wait(), compare the badge value it returns with the badge you used to mint the capability.

+

Step 3.F (exercise)       

+

Exercise:: sel4::CapRights::all() is overly-permissive. Use the overly-restrictive sel4::CapRights::none() instead and watch the program fail.

+

Step 3.G (exercise)       

+

Exercise:: Now use the minimum rights necessary for the program to run.

+
+

Modifying the Address Space

+

This chapter will focus on using the seL4 virtual address space (VSpace) APIs to manipulate the root task's own address space. +Start by navigating to and running this chapter's example, which, so far, is empty.

+
cd workspaces/root-task/address-space
+make simulate
+
+

In seL4, each thread is associated with a virtual address space (VSpace). +A VSpace is comprised of a tree of translation tables mapping virtual addresses into physical frames of memory. +VSpaces are represented by their root translation structures. +While the high-level virtual address space API concepts are architecture-independent, the specific kernel object types for a given architecture mirror that architecture's paging structures. +That said, all architectures share two object types:

+ +

The root task is provided with capabilites for the objects comprising its own virtual address space. +The locations of these capabilities in the root task's CSpace is provided in the BootInfo struct. +Our goal for this chapter will be to create a frame object and experiment with mapping it into the root task's own address space.

+

Step 4.A (exercise)       

+

Exercise: Using code snippets from Chapter 3 (Allocating Kernel Objects), create a frame object. We seek a value frame: sel4::cap::Granule (which can also be written as frame: sel4::Cap<sel4::cap_type::Granule>).

+

Note that, after importing the sel4::CapTypeForObjectOfFixedSize trait, you can express the appropriate sel4::ObjectBlueprint as sel4::cap_type::Granule::object_blueprint().

+

Step 4.B       

+

In order to avoid interacting with intermediate translation structures, let's reserve an aligned granule-sized region in the root task's program image that we can use for our experiment:

+ + +

This reservation covers exactly one page in the root task's virtual address space.

+

Step 4.C       

+

Let's unmap the page in the root task image that initially backs our reserved region. This will give us a hole in the root task VSpace, which we can use for our experiment.

+

This function determines the slot in the root task's CSpace of the page capability corresponding to the page in the root task's VSpace which contains the given address:

+ +

__executable_start is defined by the linker. +We can use it, along with addr, to identify the offset into bootinfo.user_image_frames() of the capability we are after.

+

Use the get_user_image_frame_slot() function to find the capability corresponding to the frame backing our reserved region, and unmap that frame, leaving a hole in the root task's virtual address space. +Try to access that region, and observe a page fault:

+ +

Step 4.D (exercise)       

+

Exercise: Map new_frame at page_a_addr using new_frame.frame_map(), which corresponds to seL4_ARM_Page_Map.

+

Here are some hints for the parameters of .frame_map():

+
    +
  • vspace: A capability for the root task's VSpace can be expressed using sel4::init_thread::slot::VSPACE.cap().
  • +
  • rights: sel4::CapRights::read_write() are the most permissive rights, and will work for our purposes.
  • +
  • attrs: sel4::VmAttributes::default() will work here.
  • +
+
+

Using a Serial Device

+

In this chapter, we will build a root task that interacts with a serial device. +Start by navigating to and running this chapter's example, which, so far, doesn't do anything interesting.

+
cd workspaces/root-task/serial-device
+make simulate
+
+

The module at device.rs implements a higher-level interface over the serial device's MMIO registers, whose physical base address is:

+ +

Our first goal will be to map the serial device's MMIO registers into the root task's address space.

+

After that, we will set up the root task's access to the serial device's interrupt, whose value is:

+ +

Finally, we will implement a simple loop that echoes serial input to serial output.

+

Step 5.A       

+

First, add some familiar snippets that we will use for allocating CSlots and kernel objects:

+ + +

Step 5.B (exercise)       

+

largest_kernel_ut will be useful for allocating kernel objects whose backing physical addresses don't matter to us, but we must allocate the frame which contains the serial device's MMIO registers at a particular physicall address (SERIAL_DEVICE_MMIO_PADDR). +Furthermore, the seL4 API distinguishes between general purpose untyped and device untyped. General purpose untyped is backed by normal memory, and can be used to create any type of object. Device untyped is not backed by normal memory, and can only be used to create frames. +See the last two paragraphs of seL4 Reference Manual § 2.4 (Kernel Memory Allocation) for more information. +So, we must allocate the serial device MMIO frame from the particular initial device untyped that contains SERIAL_DEVICE_MMIO_PADDR.

+

Exercice: Identify this initial untyped in the bootinfo. We will need a corresponding sel4::cap::Untyped along with the untyped's physical address (or sel4::UntypedDesc, which contains the physical address) for the next step.

+

Step 5.C       

+

The untyped we've identified contains the frame we are targeting, but that frame may be somewhere in the middle of the region of device memory the untyped covers. +To allocate the frame at SERIAL_DEVICE_MMIO_PADDR, we must allocate dummy objects from this untyped until its watermark is at SERIAL_DEVICE_MMIO_PADDR.

+

This trim_untyped function takes the untyped capability, its physical address, the desired physical address, and two empty slots for temporarily holding dummy objects. +We need two slots because the kernel resets an untyped's watermark if it has no live children. +So, we must always keep one child around so that our progress on advancing the watermark is never lost.

+ + +

Step 5.D       

+

device_ut_cap is now primed; the physical address of the next allocation will be SERIAL_DEVICE_MMIO_PADDR.

+

Exercise: Allocate a small frame object (sel4::cap_type::Granule) from device_ut_cap.

+

If your sel4::cap::Granule is called serial_device_frame_cap, then the following assertion should succeed:

+ +

Step 5.E (exercise)       

+

Exercise: Using code from Step 4.B, Step 4.C, and Step 4.D, map serial_device_frame_cap into the root task's virtual address space.

+

You should now be able interact with the serial device's MMIO registers. +Try printing "Hello, World!" to the serial console with something like:

+ +

where serial_device_mmio_page_addr: *mut _ is a pointer to where the MMIO registers are mapped in the root task's virtual address space.

+

Step 5.F (exercise)       

+

Interrupts are delivered to userspace via notifications. +A IRQHandler capability represents the authority to manage a particular interrupt. +Specifically, an IRQHandler capability (sel4::cap::IrqHandler) has the following methods:

+
    +
  • seL4_IRQHandler_SetNotification(): +Associate the interrupt with the given notification. Userspace can call seL4_Wait() or seL4_Poll() on this notification to receive the interrupt.
  • +
  • seL4_IRQHandler_Clear(): +Disassociate the notification associated with this interrupts.
  • +
  • seL4_IRQHandler_Ack(): +Tell the kernel to pass on acknowledgement of this interrupt to the interrupt controller.
  • +
+

The Rust bindings for these methods are:

+ +

The root task spawns with a special IRQControl capability (sel4::cap::IrqControl) which can be used to create IRQHandler capabilities with seL4_IRQControl_Get() (sel4::cap::IrqControl::irq_control_get()).

+

The intent behind this API is that a highly-privileged component will hold an IRQControl capability, which it will use to distribute more finely-grained IRQHandler capabilities to less privileged components for the interrupts they will manage.

+

The root task can access its IRQControl capability with sel4::init_thread::slot::IRQ_CONTROL.cap()

+

Exercise: Use sel4::init_thread::slot::IRQ_CONTROL.cap() to create a sel4::cap::IrqHandler for SERIAL_DEVICE_IRQ.

+

Step 5.G (exercise)       

+

Exercise: Create a notification object from largest_kernel_ut and associate it with the IRQHandler you just created using sel4::cap::IrqHandler::irq_handler_set_notification().

+

Step 5.H (exercise)       

+

Exercise: Use serial_device: Device, your IRQHandler, and the notification you associated with the interrupt to write a loop that echoes serial input to serial output.

+

Use serial_device.clear_all_interrupts() and irq_handler_cap.irq_handler_ack() in sequence to clear the interrupt at the device and interrupt controller levels respectively. +Note that you should do this at the beginning of the loop in case your loop enters with an interrupt already pending.

+

Use irq_notification_cap.wait() to wait for hte interrupt.

+

Use serial_device.get_char() and serial_device.put_char() to read and write data.

+
+

Spawning a Thread

+

In this chapter, we will explore IPC through an example that spawns a secondary thread. +This example starts with a more interesting program than the other examples we've worked with so far. +It spawns a secondary thread, and then interacts with it using a notification.

+

Navigate to and run the example:

+
cd workspaces/root-task/spawn-thread
+make simulate
+
+

Explore main.rs at will. +If you're used to using seL4_libs, you may notice that our Rust code here is much more low-level and verbose. +That is because we aren't using any higher-level seL4-related libraries such as +<sel4utils/thread.h>. +Our code is more like spawning a thread using <sel4/sel4.h> alone. +Note, though, that our code does depend on a few Rust language runtime building block crates such as +sel4-initialize-tls +and +sel4-stack +.

+

The exercises in this chapter are only concerned with the following two functions, which run concurrently:

+ + +

secondary_thread_main() runs in the secondary thread, and interact_with_secondary_thread() runs in the secondary thread.

+

Step 6.A       

+

In this step, we introduce IPC between secondary_thread_main() and interact_with_secondary_thread by changing

+
inter_thread_nfn: sel4::cap::Notification
+
+

to

+
inter_thread_ep: sel4::cap::Endpoint
+
+

Before, the two sides of the notification communicated via +inter_thread_nfn.signal() +and +inter_thread_nfn.wait().

+

Now, communication over this IPC endpoint will happen by +inter_thread_ep.send() and +inter_thread_ep.recv() +.

+ +

As described in seL4 Reference Manual § 4 (Message Passing (IPC)) and seL4 Reference Manual § 4.2 (Endpoints), a capability for an Endpoint object can be invoked with send() and recv(). +send() and recv() block until the two sides of the object rendezvous, at which point a message is passed from the sender to the receiver. +This message may contain data and capabilities.

+

Each thread is associated with a special page of memory called an IPC buffer. +The sender populates its own IPC buffer with data and/or CPtrs, and then calls send() with a metadata value called the MessageInfo. +The kernel copies data from the sender's IPC buffer into that of the receiver, and/or capabilities from the sender's CSpace into that of the receiver. +The kernel uses the MessageInfo to determine how much data to copy between the two IPC buffers +(the length field) +and how many CPtrs to read from the IPC buffers for copying betwen CSpaces +(the +caps_unwrapped +and +extra_caps +fields). +Finally, the kernel passes the MessageInfo, and control, to the receiver.

+

In Rust, the sender and receiver can interact with their own IPC buffer using +sel4::with_ipc_buffer +and +sel4::with_ipc_buffer_mut. +Message data is held in the message registers (an array of machine words), which is a field of the IPC buffer ( +msg_regs +and +msg_regs_mut +). +The length field of the MessageInfo specifies how many message registers will be copied into the receiver's IPC buffer.

+

One can also view the message registers as an array of bytes using +msg_bytes +and +msg_bytes_mut. +In this case, one rounds the length of their message up to the nearest multiple of the machine word size when computing the message length for the MessageInfo.

+

The MessageInfo also includes a few bits of data called a label (label_width bits wide) that is not interpreted by the kernel.

+

In Rust, the MessageInfoBuilder type is a clear and concise way to construct a MessageInfo.

+

In Rust, to smooth out differences between the mixed-criticality and legacy kernel schedulers, recv() always takes a reply_authority argument. +Under legacy scheduler configurations, which is what this text uses, this argument can be of type ().

+

Taking all of this together, let's use our IPC endpoint to send an empty message:

+ + +

Step 6.B (exercise)       

+

Exercise: use +sel4::with_ipc_buffer +and +sel4::with_ipc_buffer_mut +to send a message with some data.

+

Step 6.C (exercise)       

+

See seL4 Reference Manual § 4.2.4 (Calling and Replying) for a description of the seL4_Call syscall (Endpoint::call() in Rust).

+

Exercise: Change the

+
inter_thread_ep.send()
+
+

in secondary_thread_main() to

+
inter_thread_ep.call()
+
+

and modify interact_with_secondary_thread() to sel4::reply with a message.

+
+

Spawning a Task (Challenge)

+

This final chapter of Part I contains a more open-ended and challenging exercise. +We start with an example that spawns an entire new process, which, in the context of low-level seL4 userspace, is often called a task:

+
cd workspaces/root-task/spawn-task
+make simulate
+
+

Similarly to what we saw in Chapter 6 (Spawning a Thread), the code in this example is more low-level and complex compared to what you have seen in code that leverages <sel4utils/process.h>. +Again, our code here is more like spawning a task using <sel4/sel4.h> alone.

+

This example consists of two programs. +The spawn-task crate is the root task, and the spawn-task-child crate is the child task.

+

The child task does not spawn in any standard sort of environment, so is includes its own ad-hoc Rust language runtime in child/src/runtime.rs, complete with thread-local storage, a global heap allocator, and exception handling. +This runtime is built using a few Rust langauge runtime building block crates:

+ +

This minimal, ad-hoc language runtime is a neat, instructive piece of code. +It shows how one can build a new Rust language runtime out of the building blocks provided by the rust-sel4 project.

+

Explore the root task and child task.

+

Right now, all the child task does is send a test message over an endpoint back to the root task. +The challenge in this chapter, step 7.E, is to extend the root task so that it sets up the child task to be able to interact with the serial device, and to extend the child task to implement the same echo loop as in [./serial-device.html#step-5h]. +Steps 7.A, 7.B, 7.C, and 7.D, which are not exercises, make some incremental extensions towards those goals to help you get started.

+

Step 7.A       

+

This step extends the ObjectAllocator type in workspaces/root-task/spawn-task/src/object_allocator.rs after 7.B with the recklessly_allocate_at() method. +This method allocates an object according to the blueprint parameter at the given physical address paddr. +Instead of just allocating the object from the largest kernel untyped like the allocate() method does, this method searches through the bootinfo to find the initial untyped capability whose corresponding untyped object contains paddr, allocates dummy objects from this untyped object until its watermark reaches paddr, and then allocates the desired object. +recklessly_allocate_at()'s procedure is similar to that which we followed in step 5.C.

+

This implementation is "reckless" because it modifies the state of the untyped capability it allocates from (allocating from it and changing its watermark) without keeping track of having done so. +So, subsequent calls for paddrs contained in the same initial untyped would fail or, worse, misbehave. +However, we expect to only need to call it once, so we are okay with this caveat.

+

In step 7.E, you be able to use this method to allocate the serial device MMIO register frame.

+

Step 7.B       

+

This step extends the create_child_vspace() function in workspaces/root-task/spawn-task/src/child_vspace.rs after 7.A to take an extra_frames parameter. +create_child_vspace() now maps these extra frames into the child task's address space, after the end of the program image, and after the IPC buffer frame.

+

In step 7.E, you be able to use this parameter to pass in the serial device MMIO register frame to mapped into the child task's address space.

+

Step 7.C       

+

This step simply copies the Device type from chapter 5 into the child task.

+

In step 7.E, you be able to use this type to interact with the serial device's MMIO registers, just like we as part of step 5.E.

+

Step 7.D       

+

This step just adds the SERIAL_DEVICE_MMIO_PADDR and SERIAL_DEVICE_IRQ constants from chapter 5 to the root task.

+

Step 7.E (challenge)       

+

Exercise: +Extend the root task so that it sets up the child task to be able to interact with the serial device, and extend the child task to implement the same echo loop as in [./serial-device.html#step-5h-exercise].

+
+
+ + Hint for the root task (click to expand) + +

Try following this sequence of sub-steps: +- Allocate serial_device_frame_cap: sel4::cap::Granule using object_allocator.recklessly_allocate_at(). +- Map serial_device_frame_cap into the child task's address space using create_child_vspace()'s extra_frames parameter. +- Similarly to how we did so in steps 5.F and 5.G, obtain irq_handler_cap: sel4::cap::IrqHandler for SERIAL_DEVICE_IRQ (object_allocator.allocate_slot() might come in handy), allocate irq_nfn_cap: sel4::cap::Notification, and associate irq_nfn_cap with SERIAL_DEVICE_IRQ using irq_handler_cap. +- Copy irq_handler_cap and irq_nfn_cap into the child task's CSpace in a similar way to how child_tcb and inter_task_ep are copied.

+
+
+

+
+
+ + Hint for the child task (click to expand) + +

Try following this sequence of sub-steps: +- Declare constants IRQ_HANDLER: sel4::cap::IrqHandler and IRQ_NFN: sel4::cap::Notification after OWN_TCB and INTRA_TASK_EP. +- Obtain the virtual address of the serial device MMIO frame with addr_of_page_beyond_image(1) (recall how create_child_vspace()'s extra_frames parameter works). +- Initialize the serial device with Device::new() and Device::init() (as we did for part of step 5.E), and use the serial device just like we did in step 5.H.

+
+
+
+

seL4 Microkit

+

The seL4 Microkit is a framework for creating static systems based on seL4. +This part of the text assumes that the reader is familiar with the basics of the Microkit framework and API, or is using a companion resource to learn about the Microkit in parallel. +Here are three such resources:

+ +

This part also assumes that the reader has worked through chapters 2 and 6 of Part I.

+
+

Hello, World!

+

Navigate to and run the hello world Microkit example:

+
cd workspaces/microkit/hello-world
+make simulate
+
+

Here is its source:

+ +

The sel4_microkit crate implements a Rust language runtime for Microkit protection domains, and implements the Microkit API. +It is written in pure Rust, and does not link against libmicrokit.

+

The Event Handler

+

The #[protection_domain] attribute macro declares a function to be the protection domain's initialization function. +The entrypoint function must have a signature of the form:

+
fn() -> T
+where
+    T: sel4_microkit::Handler
+

An implementation of the Handler trait is used by the runtime as the event handler for the protection domain's main loop. +The +notified, +protected, +and +fault +methods correspond to their equivalents in <microkit.h>.

+

The default implementations of these methods just panic. +Our event handler, which we've called HandlerImpl, is the simplest possible Handler implementation.

+

Language Runtime

+

As detailed in its rustdoc, the #[protection_domain] attribute macro takes the same parameters as #[root_task]. +Furthermore, the sel4_microkit crate supports all of the same Rust language runtime elements that we explored in Chapter 2, including +sel4_microkit::panicking::catch_unwind() +and +sel4_microkit::panicking::set_hook() +.

+
+

IPC

+

This chapter covers making and handling protected procedure calls in protection domains written in Rust. +Navigate to and run the example:

+
cd workspaces/microkit/ipc
+make simulate
+
+

The example system description specifies two protection domains, with a channel between them:

+ + + +

The +Channel type is the Rust equivalent of the +microkit_channel +type alias in libmicrokit. +Note how the functionality corresponding to libmicrokit's microkit_notify, microkit_irq_ack, and microkit_ppcall is implemented in methods for Channel.

+

The +MessageInfo type is the Rust equivalent of the +microkit_msginfo +type alias in libmicrokit. +Just as microkit_msginfo is an alias for seL4_MessageInfo_t, sel4_microkit::MessageInfo is just a thin wrapper around MessageInfo.

+

libmicrokit has microkit_mr_set() and microkit_mr_get() for interacting with the IPC buffer. +In the sel4_microkit crate, we have +get_mr() +and +set_mr() +, +but we also have +with_msg_regs(), +with_msg_regs_mut(), +with_msg_bytes(), and +with_msg_bytes_mut(), +which use +sel4::with_ipc_buffer() and +sel4::with_ipc_buffer_mut() under the hood.

+

Step 10.A (exercise)       

+

Exercise: +In the client's notified() handler, make a protected procedure call to the server using SERVER.pp_call(). +Handle the call in the server's protected() handler. +Include data in the message using sel4_microkit::with_msg_regs{,_mut}.

+

Exercise (optional): +Send something more interesting over IPC using +msg_bytes +and +msg_bytes_mut +. +For example, the zerocopy crate can be used to view certain types as bytes and vice versa, and the lightweight postcard crate can be used to serialize and deserialize a wider range of types using serde.

+
+

Shared Memory

+

This chapter covers interacting with shared memory from protection domains written in Rust. +Navigate to and run the example:

+
cd workspaces/microkit/shared-memory
+make simulate
+
+

The example system description specifies two protection domains which share two memory regions:

+ +

The Microkit tool will inject memory region virtual addresses into protection domain images according to the setvar_vaddr attribute values. +For example, the virtual address of the mapping of region_a into the client protection domain will be injected into the microkit-shared-memory-client.elf image at the location specified by then region_a_vaddr symbol.

+

In the case of Rust, declaring a symbol that the Microkit tool can patch requires a bit more intentionality than in the C case. +The sel4_microkit::var! macro is provided to declare such symbols.

+

The var! macro's implementation is just a few lines of code. +We want to express this symbol as a global variable that does not change at runtime, but which cannot be assumed to have the value we assign it at compile time, and which must not be optimized away. +The near-trivial +sel4_immutable_cell::ImmutableCell type encapsulates this pattern. +The #[no_mangle] attribute instructs the compiler to use the name of the variable as the name of the symbol. +This is the default in C, but not Rust. +We direct the compiler to put this symbol in the .data section with #[link_section = ".data"] to ensure that space is allocated for it in the ELF file itself, not just the program image it describes.

+

So far, the example protection domains just store pointers to the shared memory regions in their handler state:

+ + +

Step 11.A       

+

Let's assign types to these shared memory regions. +We can define our types in a crate that both the client and server can use:

+ +

Suppose region_a: [u8; REGION_A_SIZE] and region_b: RegionB. +You could just turn the virtual addresses we get in our var! symbols into pointers and start interacting with the shared memory regions with unsafe ptr::* operations, but we can leverage the Rust type system to come up with a solution that only requires unsafe at initialization time.

+

Step 11.B       

+

The +sel4-shared-memory +crate provides a way for you to declare a memory region's type and bounds, along with the memory access operations that can safely be used on it, so that you can access it without unsafe code. +That initial declaration is, however, unsafe.

+

The +sel4-shared-memory +is a thin wrapper around the +sel4_abstract_ptr +crate, instantiating its abstract pointer types with memory access operations suitable for memory that is shared with another protection domain.

+

The +sel4_microkit::memory_region_symbol! +macro is like the sel4_microkit::var! macro, except specialized for shared memory region virtual address symbols. +For one, the underlying symbol is always of type usize and the macro returns a value of type NonNull<_>. +memory_region_symbol! has a few additional features. +For example, memory_region_symbol!(foo: *mut [u8] n = BAR) returns a NonNull<[u8]> with a runtime slice length of BAR.

+

See this step's diff for how to put this all together.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + diff --git a/projects/rust/tutorial/root-task/address-space.html b/projects/rust/tutorial/root-task/address-space.html new file mode 100644 index 00000000000..fd1a761f527 --- /dev/null +++ b/projects/rust/tutorial/root-task/address-space.html @@ -0,0 +1,330 @@ + + + + + + Modifying the Address Space - Using Rust in seL4 Userspace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +

Modifying the Address Space

+

This chapter will focus on using the seL4 virtual address space (VSpace) APIs to manipulate the root task's own address space. +Start by navigating to and running this chapter's example, which, so far, is empty.

+
cd workspaces/root-task/address-space
+make simulate
+
+

In seL4, each thread is associated with a virtual address space (VSpace). +A VSpace is comprised of a tree of translation tables mapping virtual addresses into physical frames of memory. +VSpaces are represented by their root translation structures. +While the high-level virtual address space API concepts are architecture-independent, the specific kernel object types for a given architecture mirror that architecture's paging structures. +That said, all architectures share two object types:

+ +

The root task is provided with capabilites for the objects comprising its own virtual address space. +The locations of these capabilities in the root task's CSpace is provided in the BootInfo struct. +Our goal for this chapter will be to create a frame object and experiment with mapping it into the root task's own address space.

+

Step 4.A (exercise)       

+

Exercise: Using code snippets from Chapter 3 (Allocating Kernel Objects), create a frame object. We seek a value frame: sel4::cap::Granule (which can also be written as frame: sel4::Cap<sel4::cap_type::Granule>).

+

Note that, after importing the sel4::CapTypeForObjectOfFixedSize trait, you can express the appropriate sel4::ObjectBlueprint as sel4::cap_type::Granule::object_blueprint().

+

Step 4.B       

+

In order to avoid interacting with intermediate translation structures, let's reserve an aligned granule-sized region in the root task's program image that we can use for our experiment:

+ + +

This reservation covers exactly one page in the root task's virtual address space.

+

Step 4.C       

+

Let's unmap the page in the root task image that initially backs our reserved region. This will give us a hole in the root task VSpace, which we can use for our experiment.

+

This function determines the slot in the root task's CSpace of the page capability corresponding to the page in the root task's VSpace which contains the given address:

+ +

__executable_start is defined by the linker. +We can use it, along with addr, to identify the offset into bootinfo.user_image_frames() of the capability we are after.

+

Use the get_user_image_frame_slot() function to find the capability corresponding to the frame backing our reserved region, and unmap that frame, leaving a hole in the root task's virtual address space. +Try to access that region, and observe a page fault:

+ +

Step 4.D (exercise)       

+

Exercise: Map new_frame at page_a_addr using new_frame.frame_map(), which corresponds to seL4_ARM_Page_Map.

+

Here are some hints for the parameters of .frame_map():

+
    +
  • vspace: A capability for the root task's VSpace can be expressed using sel4::init_thread::slot::VSPACE.cap().
  • +
  • rights: sel4::CapRights::read_write() are the most permissive rights, and will work for our purposes.
  • +
  • attrs: sel4::VmAttributes::default() will work here.
  • +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/projects/rust/tutorial/root-task/hello-world.html b/projects/rust/tutorial/root-task/hello-world.html new file mode 100644 index 00000000000..1b5d6cff6b6 --- /dev/null +++ b/projects/rust/tutorial/root-task/hello-world.html @@ -0,0 +1,328 @@ + + + + + + Hello, World! - Using Rust in seL4 Userspace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +

Hello, World!

+

Run the hello world example:

+
cd workspaces/root-task/hello-world
+make simulate
+
+

Press ctrl-a x to exit QEMU.

+

Here is its source:

+ +

The Rust standard library is divided into three layers:

+
    +
  • core: dependency-free foundation
  • +
  • alloc: implements heap-backed data structures, but requires a runtime that provides a heap allocator
  • +
  • std includes core and alloc, and adds APIs that depend on OS services such as networking and filesystems
  • +
+

The high-level std doesn't support the low-level seL4 root task target. +#![no_std] declares that this crate does not depend on std, and prevents rustc from automatically importing it.

+

Our language runtime will handle the program's entrypoint differently than a typical Rust program. +#![no_main] informs rustc of this fact.

+

The sel4 crate binds the seL4 API. +It is generated from source (.xml, .bf, and .h) in libsel4. +We will cover the contents of this crate in future chapters.

+

The sel4_root_task crate implements a Rust language runtime for the root task environment.

+

The #[root_task] attribute macro declares a function to be the root task's entrypoint. +The entrypoint function must have a signature of the form:

+
fn(&sel4::BootInfoPtr) -> T
+where
+    T: sel4_root_task::Termination
+

(Rustdoc for BootInfoPtr and Termination)

+

The root task has no way to exit, so, to terminate cleanly, it must suspend its own thread. +sel4::init_thread::suspend_self() does exactly this.

+

Step 2.A (exercise)       

+

Exercise: Cause a panic.

+

Step 2.B (exercise)       

+

Exercise: Catch the panic using sel4_root_task::panicking::catch_unwind().

+

Step 2.C (exercise)       

+

You can set a custom panic hook with sel4_root_task::panicking::PanicHook. +The default hook just prints the panic's ExternalPanicInfo.

+

Exercise: Set a custom panic hook.

+

Step 2.D (exercise)       

+

Exercise: Cause a stack overflow.

+

Step 2.E (exercise)       

+

The #[root_task] attribute macro accepts a named stack_size parameter, which can be any expression of type usize and whose value is interpreted as the root task's initial thread's stack size, in bytes. +For example:

+
#[root_task(stack_size = 13 * 37)]
+

The default stack size is sel4_root_task::DEFAULT_STACK_SIZE.

+

Exercise: Adjust the root task's initial thread's stack size to prevent the stack overflow you just caused.

+

Step 2.F (exercise)       

+

By default, the sel4_root_task runtime does not include a heap. +Any attempt to use the alloc crate will result in a link-time failure.

+

The #[root_task] attribute macro accepts a heap_size parameter, which can be any expression of type usize and whose value is interpreted as the root task's heap size, in bytes. +Note that heap_size must come after stack_size in the case where both are present. +For example:

+
#[root_task(heap_size = 0xf00d)]
+

or

+
#[root_task(stack_size = 13 * 37, heap_size = 0xf00d)]
+

Exercise: Add a heap and use it.

+

Step 2.G       

+

The sel4_logging crate builds on top of the log crate to add utilities for initializing simple loggers in minimal environments, such as a seL4 root task. +This step demonstrates one way to initialize a logger using this crate:

+ + + +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/projects/rust/tutorial/root-task/index.html b/projects/rust/tutorial/root-task/index.html new file mode 100644 index 00000000000..fdb85f665f9 --- /dev/null +++ b/projects/rust/tutorial/root-task/index.html @@ -0,0 +1,244 @@ + + + + + + Overview - Using Rust in seL4 Userspace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +

The Root Task

+

After initializing itself, the seL4 kernel passes control to a userspace program called the root task, whose image is provided to the kernel at boot-time. +The root task's capability space contains capabilities for all memory and boot-time objects. +That is to say, the root task spawns with the maximum privilege that a userspace program can have. +The kernel provides the root task with a map of its initial capability space in the form of the BootInfo frame. +You can read more about the root task's environment in seL4 Reference Manual § 9.1.

+

Part I of this tutorial will focus on writing from-scratch root tasks in Rust. +Some of the code in Part I will be quite low-level, interacting with the language runtime, the linker, and some of the finer details related to bootstrapping an seL4-based system. +The only seL4-related crates we will be using are the language runtime and bindings for the seL4 API. +Unlike situations where higher-level seL4-related libraries (such as seL4_libs) are used, we will be allocating objects and manage virtual address spaces from scratch.

+

At boot time, the seL4 kernel and root task are loaded into memory by a kind of bootloader stub referred to as a seL4 kernel loader. +For Part I, we will use the kernel loader from the rust-sel4 project. +We won't cover how it works or how to use it explicitly in this text. +It is built at docker/Dockerfile:94:108, and used at mk/root-task.mk:31:36.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/projects/rust/tutorial/root-task/kernel-objects.html b/projects/rust/tutorial/root-task/kernel-objects.html new file mode 100644 index 00000000000..bc41eeeb4e0 --- /dev/null +++ b/projects/rust/tutorial/root-task/kernel-objects.html @@ -0,0 +1,420 @@ + + + + + + Allocating Kernel Objects - Using Rust in seL4 Userspace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +

Allocating Kernel Objects

+

Start by navigating to and running this chapter's example, which, so far, is empty.

+
cd workspaces/root-task/kernel-objects
+make simulate
+
+

Userspace operates the seL4 kernel by creating, managing, and accessing kernel objects via references called capabilites. +See seL4 Reference Manual § 2.3 (Kernel Objects) for an outline of the core types of kernel objects.

+

In the context of seL4, a capability is a granular, unforgeable token of authority that references a kernel object and carries access rights that limit what the user of a cabability can do with the referenced kernel object. +In general, a system call in seL4 amounts to refering to a cabability and an action on the kernel object the cabability points to. +This is called invoking a capability.

+ +

Just as each thread is associated with a virtual address space which the hardware uses to translate virtual memory addresses into locations in physical memory, each seL4 thread is also assocated with a capability space (CSpace) which the kernel uses to translate so-called capability pointers (CPointers or CPtrs) into locations (slots) in the kernel's capability tables called CNodes.

+

The sel4::CPtr type is a wrapper around a machine word. +The sel4::Cap<T> type wraps a CPtr associated with the current thread's CSpace, and thus points to a particular capability slot within the kernel. +It is paramterized by a capability type T: sel4::CapType, representing the type of capability in that slot. +It is up to the crate user to ensure that Cap's are valid and well-typed in the current thread.

+

The sel4::cap module contains aliases of the form sel4::Cap<sel4::cap_type::*>.

+

Depending on the Cap's type T, a Cap has a number of methods available, which correspond to invocations for that capability type. +For example, sel4::Cap::tcb_resume() is available when T is sel4::cap_type::Tcb.

+

Step 3.A       

+

As elaborated in seL4 Reference Manual § 2.4 (Kernel Memory Allocation), userspace is responsible for managing the memory associated with kernel objects. +Untyped memory is the name of the object type for free memory. +At boot time, the root task is granted untyped memory capabilities for all of the system's memory, except for the memory used for the kernel and the root task's own resources.

+

Print the untyped memory described by the BootInfo frame:

+ +

Sample output:

+
untyped:
+    paddr: 0x00000000000000, size bits: 27, is device: true
+    paddr: 0x00000008001000, size bits: 12, is device: true
+    paddr: 0x00000008002000, size bits: 13, is device: true
+    paddr: 0x00000008004000, size bits: 14, is device: true
+    paddr: 0x00000008008000, size bits: 15, is device: true
+    paddr: 0x00000008011000, size bits: 12, is device: true
+    paddr: 0x00000008012000, size bits: 13, is device: true
+    ...
+
+

sel4::UntypedDesc::size_bits() returns the log base 2 of the size of the region of memory described by the descriptor.

+

sel4::UntypedDesc::is_device() returns whether the region is device memory or kernel memory. +Device memory can only be used for creating frames, whereas kernel memory has no such restrictions.

+

Step 3.B       

+

Add a function that finds the largest untyped region passed to the root task:

+ +

The expression bootinfo.untyped().index(ut_ix).cap() indexes into bootinfo.untyped(): SlotRegion<Untyped> to retrieve a Slot<Untyped>, which can be turned into a Cap<Untyped> (= cap::Untyped).

+

Step 3.C       

+

In this step, we will allocate a Notification object.

+

We already know how to refer to a capability in the current thread's CSpace: a CPtr. +However, some capability invocations allow us to refer to a capability slot in any CSpace whose root CNode is present in the current thread's CSpace. +In these cases, we must provide:

+
    +
  • A CPtr, interpreted in the context of the current thread's CSpace, which points to the target CSpace's root CNode
  • +
  • A CPtr, interpreted in the context of the target CSpace, which points to the target capability slot
  • +
  • A depth, which is the number of bits of the second CPtr to interpret. This allows for the second CPtr to point to a CNode. Why this is necessary is outside the scope of this tutorial, but you can read about it in seL4 Reference Manual § 2.4 (CSpace Addressing).
  • +
+

Consider, for example, the seL4_CNode_Mint capability invocation. +dest_* and src_* are both capability slots addressed in this way.

+

This more flexible method of capability slot addressing is encapsulated in the sel4::AbsoluteCPtr type.

+

The seL4_Untyped_Retype method is used for allocating new objects from an untyped object. +The _service parameter is the address of the untyped object as a normal CPtr. +root, node_index, and node_depth address, in the more flexible way outlined above, the destination CNode into which capabilities for the new objects will be inserted. +node_offset and num_objects specify a range of slots within the selected CNode for the new capabilites (and, simultaneously, the number of new objects that will be created).

+

type and size_bits specify the shape of the new object(s) +Note that size_bits is relevant for only certain object types (see seL4 Reference Manual § 2.4.2 (Summary of Object Sizes) for more information). +This shape information is encapsulated in the sel4::ObjectBlueprint type.

+

Multiple kernel objects can be allocated from a single unytped object. +For each untyped object, the kernel maintains a watermark which tracks how much of the untyped object has been used up for object allocation. +seL4_Untyped_Retype aligns the watermark to the desired object type's size, and then advances it according to the object type size and number of objects. +This process is detailed in the fourth paragraph of seL4 Reference Manual § 2.4.1 (Reusing Memory).

+

Let us now work towards calling sel4::cap::Untyped::untyped_retype() on our previously acquired largest_kernel_ut. +We wish to allocate one notification object and insert a capability for it into a free slot in the current thread's own CSpace. +More precisely, we need a sel4::AbsoluteCPtr for the current thread's own CSpace's root CNode, and an index into that CNode for a free slot.

+

The CPtr for the initial thread's own CSpace root is a constant:

+ +

bootinfo can tell us about a range of empty slots in this CSpace. +We can leverage the fact that Rust's Range<T> type is an iterator for certain T to allocate slots in an ergonomic way:

+ +

The {{#rustdoc_link root-task sel4/cap/type.CNode.html#method.absolute_cptr_for_selfsel4::cap::CNode::absolute_cptr_for_self()}} method elaborates a sel4::cap::Cnode into a sel4::AbsoluteCPtr. +Interestingly, there are two ways to do this, but the current implementation is just to use a depth of zero.

+

Now we can invoke our untyped capability to allocate a notification object:

+ +

Now that we know that notification_slot contains a notification capability, we can cast it and get a sel4::cap::Notification:

+ +

Step 3.D (exercise)       

+

Exercise:: Use sel4::cap::Notification::signal() and sel4::cap::Notification::wait() to signal and then wait on the notification.

+

Step 3.E (exercise)       

+

As described in seL4 Reference Manual § 5 (Notifications), a notification capability can contain a word-sized mask called a badge. +When that capability is used to signal the notification, the notification's word-sized state is bit-wise ored with the capability's badge. +A wait call on the notification returns and clears the notification's state, provided that a signal call has occurred since the last wait call.

+

sel4::AbsoluteCPtr::mint() mints a new capability from an existing capability, updatings its access rights and badge.

+

Exercise:: Allocate a new empty slot in the current CNode.

+

A slot in the root task's CSpace (i.e. a value of type sel4::init_thread::Slot) can be turned into an sel4::AbsoluteCPtr using {{#rustdoc_link root-task sel4/cap/type.CNode.html#method.absolute_cptrsel4::CNode::absolute_cptr()}}:

+ +

Exercise:: Mint a capability based on the capability in notification_slot into your newly allocated slot. Use sel4::CapRights::all() for the rights parameter, and specify a non-zero badge value.

+

Exercise:: Signal the notification using your newly minted badged capability. Using the return value of sel4::Notification::wait(), compare the badge value it returns with the badge you used to mint the capability.

+

Step 3.F (exercise)       

+

Exercise:: sel4::CapRights::all() is overly-permissive. Use the overly-restrictive sel4::CapRights::none() instead and watch the program fail.

+

Step 3.G (exercise)       

+

Exercise:: Now use the minimum rights necessary for the program to run.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/projects/rust/tutorial/root-task/serial-device.html b/projects/rust/tutorial/root-task/serial-device.html new file mode 100644 index 00000000000..7a188bf9504 --- /dev/null +++ b/projects/rust/tutorial/root-task/serial-device.html @@ -0,0 +1,424 @@ + + + + + + Using a Serial Device - Using Rust in seL4 Userspace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +

Using a Serial Device

+

In this chapter, we will build a root task that interacts with a serial device. +Start by navigating to and running this chapter's example, which, so far, doesn't do anything interesting.

+
cd workspaces/root-task/serial-device
+make simulate
+
+

The module at device.rs implements a higher-level interface over the serial device's MMIO registers, whose physical base address is:

+ +

Our first goal will be to map the serial device's MMIO registers into the root task's address space.

+

After that, we will set up the root task's access to the serial device's interrupt, whose value is:

+ +

Finally, we will implement a simple loop that echoes serial input to serial output.

+

Step 5.A       

+

First, add some familiar snippets that we will use for allocating CSlots and kernel objects:

+ + +

Step 5.B (exercise)       

+

largest_kernel_ut will be useful for allocating kernel objects whose backing physical addresses don't matter to us, but we must allocate the frame which contains the serial device's MMIO registers at a particular physicall address (SERIAL_DEVICE_MMIO_PADDR). +Furthermore, the seL4 API distinguishes between general purpose untyped and device untyped. General purpose untyped is backed by normal memory, and can be used to create any type of object. Device untyped is not backed by normal memory, and can only be used to create frames. +See the last two paragraphs of seL4 Reference Manual § 2.4 (Kernel Memory Allocation) for more information. +So, we must allocate the serial device MMIO frame from the particular initial device untyped that contains SERIAL_DEVICE_MMIO_PADDR.

+

Exercice: Identify this initial untyped in the bootinfo. We will need a corresponding sel4::cap::Untyped along with the untyped's physical address (or sel4::UntypedDesc, which contains the physical address) for the next step.

+

Step 5.C       

+

The untyped we've identified contains the frame we are targeting, but that frame may be somewhere in the middle of the region of device memory the untyped covers. +To allocate the frame at SERIAL_DEVICE_MMIO_PADDR, we must allocate dummy objects from this untyped until its watermark is at SERIAL_DEVICE_MMIO_PADDR.

+

This trim_untyped function takes the untyped capability, its physical address, the desired physical address, and two empty slots for temporarily holding dummy objects. +We need two slots because the kernel resets an untyped's watermark if it has no live children. +So, we must always keep one child around so that our progress on advancing the watermark is never lost.

+ + +

Step 5.D       

+

device_ut_cap is now primed; the physical address of the next allocation will be SERIAL_DEVICE_MMIO_PADDR.

+

Exercise: Allocate a small frame object (sel4::cap_type::Granule) from device_ut_cap.

+

If your sel4::cap::Granule is called serial_device_frame_cap, then the following assertion should succeed:

+ +

Step 5.E (exercise)       

+

Exercise: Using code from Step 4.B, Step 4.C, and Step 4.D, map serial_device_frame_cap into the root task's virtual address space.

+

You should now be able interact with the serial device's MMIO registers. +Try printing "Hello, World!" to the serial console with something like:

+ +

where serial_device_mmio_page_addr: *mut _ is a pointer to where the MMIO registers are mapped in the root task's virtual address space.

+

Step 5.F (exercise)       

+

Interrupts are delivered to userspace via notifications. +A IRQHandler capability represents the authority to manage a particular interrupt. +Specifically, an IRQHandler capability (sel4::cap::IrqHandler) has the following methods:

+
    +
  • seL4_IRQHandler_SetNotification(): +Associate the interrupt with the given notification. Userspace can call seL4_Wait() or seL4_Poll() on this notification to receive the interrupt.
  • +
  • seL4_IRQHandler_Clear(): +Disassociate the notification associated with this interrupts.
  • +
  • seL4_IRQHandler_Ack(): +Tell the kernel to pass on acknowledgement of this interrupt to the interrupt controller.
  • +
+

The Rust bindings for these methods are:

+ +

The root task spawns with a special IRQControl capability (sel4::cap::IrqControl) which can be used to create IRQHandler capabilities with seL4_IRQControl_Get() (sel4::cap::IrqControl::irq_control_get()).

+

The intent behind this API is that a highly-privileged component will hold an IRQControl capability, which it will use to distribute more finely-grained IRQHandler capabilities to less privileged components for the interrupts they will manage.

+

The root task can access its IRQControl capability with sel4::init_thread::slot::IRQ_CONTROL.cap()

+

Exercise: Use sel4::init_thread::slot::IRQ_CONTROL.cap() to create a sel4::cap::IrqHandler for SERIAL_DEVICE_IRQ.

+

Step 5.G (exercise)       

+

Exercise: Create a notification object from largest_kernel_ut and associate it with the IRQHandler you just created using sel4::cap::IrqHandler::irq_handler_set_notification().

+

Step 5.H (exercise)       

+

Exercise: Use serial_device: Device, your IRQHandler, and the notification you associated with the interrupt to write a loop that echoes serial input to serial output.

+

Use serial_device.clear_all_interrupts() and irq_handler_cap.irq_handler_ack() in sequence to clear the interrupt at the device and interrupt controller levels respectively. +Note that you should do this at the beginning of the loop in case your loop enters with an interrupt already pending.

+

Use irq_notification_cap.wait() to wait for hte interrupt.

+

Use serial_device.get_char() and serial_device.put_char() to read and write data.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/projects/rust/tutorial/root-task/spawn-task.html b/projects/rust/tutorial/root-task/spawn-task.html new file mode 100644 index 00000000000..e7690797325 --- /dev/null +++ b/projects/rust/tutorial/root-task/spawn-task.html @@ -0,0 +1,301 @@ + + + + + + Spawning a Task (Challenge) - Using Rust in seL4 Userspace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +

Spawning a Task (Challenge)

+

This final chapter of Part I contains a more open-ended and challenging exercise. +We start with an example that spawns an entire new process, which, in the context of low-level seL4 userspace, is often called a task:

+
cd workspaces/root-task/spawn-task
+make simulate
+
+

Similarly to what we saw in Chapter 6 (Spawning a Thread), the code in this example is more low-level and complex compared to what you have seen in code that leverages <sel4utils/process.h>. +Again, our code here is more like spawning a task using <sel4/sel4.h> alone.

+

This example consists of two programs. +The spawn-task crate is the root task, and the spawn-task-child crate is the child task.

+

The child task does not spawn in any standard sort of environment, so is includes its own ad-hoc Rust language runtime in child/src/runtime.rs, complete with thread-local storage, a global heap allocator, and exception handling. +This runtime is built using a few Rust langauge runtime building block crates:

+ +

This minimal, ad-hoc language runtime is a neat, instructive piece of code. +It shows how one can build a new Rust language runtime out of the building blocks provided by the rust-sel4 project.

+

Explore the root task and child task.

+

Right now, all the child task does is send a test message over an endpoint back to the root task. +The challenge in this chapter, step 7.E, is to extend the root task so that it sets up the child task to be able to interact with the serial device, and to extend the child task to implement the same echo loop as in [./serial-device.html#step-5h]. +Steps 7.A, 7.B, 7.C, and 7.D, which are not exercises, make some incremental extensions towards those goals to help you get started.

+

Step 7.A       

+

This step extends the ObjectAllocator type in workspaces/root-task/spawn-task/src/object_allocator.rs after 7.B with the recklessly_allocate_at() method. +This method allocates an object according to the blueprint parameter at the given physical address paddr. +Instead of just allocating the object from the largest kernel untyped like the allocate() method does, this method searches through the bootinfo to find the initial untyped capability whose corresponding untyped object contains paddr, allocates dummy objects from this untyped object until its watermark reaches paddr, and then allocates the desired object. +recklessly_allocate_at()'s procedure is similar to that which we followed in step 5.C.

+

This implementation is "reckless" because it modifies the state of the untyped capability it allocates from (allocating from it and changing its watermark) without keeping track of having done so. +So, subsequent calls for paddrs contained in the same initial untyped would fail or, worse, misbehave. +However, we expect to only need to call it once, so we are okay with this caveat.

+

In step 7.E, you be able to use this method to allocate the serial device MMIO register frame.

+

Step 7.B       

+

This step extends the create_child_vspace() function in workspaces/root-task/spawn-task/src/child_vspace.rs after 7.A to take an extra_frames parameter. +create_child_vspace() now maps these extra frames into the child task's address space, after the end of the program image, and after the IPC buffer frame.

+

In step 7.E, you be able to use this parameter to pass in the serial device MMIO register frame to mapped into the child task's address space.

+

Step 7.C       

+

This step simply copies the Device type from chapter 5 into the child task.

+

In step 7.E, you be able to use this type to interact with the serial device's MMIO registers, just like we as part of step 5.E.

+

Step 7.D       

+

This step just adds the SERIAL_DEVICE_MMIO_PADDR and SERIAL_DEVICE_IRQ constants from chapter 5 to the root task.

+

Step 7.E (challenge)       

+

Exercise: +Extend the root task so that it sets up the child task to be able to interact with the serial device, and extend the child task to implement the same echo loop as in [./serial-device.html#step-5h-exercise].

+
+
+ + Hint for the root task (click to expand) + +

Try following this sequence of sub-steps: +- Allocate serial_device_frame_cap: sel4::cap::Granule using object_allocator.recklessly_allocate_at(). +- Map serial_device_frame_cap into the child task's address space using create_child_vspace()'s extra_frames parameter. +- Similarly to how we did so in steps 5.F and 5.G, obtain irq_handler_cap: sel4::cap::IrqHandler for SERIAL_DEVICE_IRQ (object_allocator.allocate_slot() might come in handy), allocate irq_nfn_cap: sel4::cap::Notification, and associate irq_nfn_cap with SERIAL_DEVICE_IRQ using irq_handler_cap. +- Copy irq_handler_cap and irq_nfn_cap into the child task's CSpace in a similar way to how child_tcb and inter_task_ep are copied.

+
+
+

+
+
+ + Hint for the child task (click to expand) + +

Try following this sequence of sub-steps: +- Declare constants IRQ_HANDLER: sel4::cap::IrqHandler and IRQ_NFN: sel4::cap::Notification after OWN_TCB and INTRA_TASK_EP. +- Obtain the virtual address of the serial device MMIO frame with addr_of_page_beyond_image(1) (recall how create_child_vspace()'s extra_frames parameter works). +- Initialize the serial device with Device::new() and Device::init() (as we did for part of step 5.E), and use the serial device just like we did in step 5.H.

+
+
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/projects/rust/tutorial/root-task/spawn-thread.html b/projects/rust/tutorial/root-task/spawn-thread.html new file mode 100644 index 00000000000..cecf75dc348 --- /dev/null +++ b/projects/rust/tutorial/root-task/spawn-thread.html @@ -0,0 +1,371 @@ + + + + + + Spawning a Thread - Using Rust in seL4 Userspace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +

Spawning a Thread

+

In this chapter, we will explore IPC through an example that spawns a secondary thread. +This example starts with a more interesting program than the other examples we've worked with so far. +It spawns a secondary thread, and then interacts with it using a notification.

+

Navigate to and run the example:

+
cd workspaces/root-task/spawn-thread
+make simulate
+
+

Explore main.rs at will. +If you're used to using seL4_libs, you may notice that our Rust code here is much more low-level and verbose. +That is because we aren't using any higher-level seL4-related libraries such as +<sel4utils/thread.h>. +Our code is more like spawning a thread using <sel4/sel4.h> alone. +Note, though, that our code does depend on a few Rust language runtime building block crates such as +sel4-initialize-tls +and +sel4-stack +.

+

The exercises in this chapter are only concerned with the following two functions, which run concurrently:

+ + +

secondary_thread_main() runs in the secondary thread, and interact_with_secondary_thread() runs in the secondary thread.

+

Step 6.A       

+

In this step, we introduce IPC between secondary_thread_main() and interact_with_secondary_thread by changing

+
inter_thread_nfn: sel4::cap::Notification
+
+

to

+
inter_thread_ep: sel4::cap::Endpoint
+
+

Before, the two sides of the notification communicated via +inter_thread_nfn.signal() +and +inter_thread_nfn.wait().

+

Now, communication over this IPC endpoint will happen by +inter_thread_ep.send() and +inter_thread_ep.recv() +.

+ +

As described in seL4 Reference Manual § 4 (Message Passing (IPC)) and seL4 Reference Manual § 4.2 (Endpoints), a capability for an Endpoint object can be invoked with send() and recv(). +send() and recv() block until the two sides of the object rendezvous, at which point a message is passed from the sender to the receiver. +This message may contain data and capabilities.

+

Each thread is associated with a special page of memory called an IPC buffer. +The sender populates its own IPC buffer with data and/or CPtrs, and then calls send() with a metadata value called the MessageInfo. +The kernel copies data from the sender's IPC buffer into that of the receiver, and/or capabilities from the sender's CSpace into that of the receiver. +The kernel uses the MessageInfo to determine how much data to copy between the two IPC buffers +(the length field) +and how many CPtrs to read from the IPC buffers for copying betwen CSpaces +(the +caps_unwrapped +and +extra_caps +fields). +Finally, the kernel passes the MessageInfo, and control, to the receiver.

+

In Rust, the sender and receiver can interact with their own IPC buffer using +sel4::with_ipc_buffer +and +sel4::with_ipc_buffer_mut. +Message data is held in the message registers (an array of machine words), which is a field of the IPC buffer ( +msg_regs +and +msg_regs_mut +). +The length field of the MessageInfo specifies how many message registers will be copied into the receiver's IPC buffer.

+

One can also view the message registers as an array of bytes using +msg_bytes +and +msg_bytes_mut. +In this case, one rounds the length of their message up to the nearest multiple of the machine word size when computing the message length for the MessageInfo.

+

The MessageInfo also includes a few bits of data called a label (label_width bits wide) that is not interpreted by the kernel.

+

In Rust, the MessageInfoBuilder type is a clear and concise way to construct a MessageInfo.

+

In Rust, to smooth out differences between the mixed-criticality and legacy kernel schedulers, recv() always takes a reply_authority argument. +Under legacy scheduler configurations, which is what this text uses, this argument can be of type ().

+

Taking all of this together, let's use our IPC endpoint to send an empty message:

+ + +

Step 6.B (exercise)       

+

Exercise: use +sel4::with_ipc_buffer +and +sel4::with_ipc_buffer_mut +to send a message with some data.

+

Step 6.C (exercise)       

+

See seL4 Reference Manual § 4.2.4 (Calling and Replying) for a description of the seL4_Call syscall (Endpoint::call() in Rust).

+

Exercise: Change the

+
inter_thread_ep.send()
+
+

in secondary_thread_main() to

+
inter_thread_ep.call()
+
+

and modify interact_with_secondary_thread() to sel4::reply with a message.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/projects/rust/tutorial/searcher.js b/projects/rust/tutorial/searcher.js new file mode 100644 index 00000000000..fc65604eb38 --- /dev/null +++ b/projects/rust/tutorial/searcher.js @@ -0,0 +1,529 @@ +'use strict'; + +/* global Mark, elasticlunr, path_to_root */ + +window.search = window.search || {}; +(function search() { + // Search functionality + // + // You can use !hasFocus() to prevent keyhandling in your key + // event handlers while the user is typing their search. + + if (!Mark || !elasticlunr) { + return; + } + + // eslint-disable-next-line max-len + // IE 11 Compatibility from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith + if (!String.prototype.startsWith) { + String.prototype.startsWith = function(search, pos) { + return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; + }; + } + + const search_wrap = document.getElementById('search-wrapper'), + searchbar = document.getElementById('searchbar'), + searchresults = document.getElementById('searchresults'), + searchresults_outer = document.getElementById('searchresults-outer'), + searchresults_header = document.getElementById('searchresults-header'), + searchicon = document.getElementById('search-toggle'), + content = document.getElementById('content'), + + // SVG text elements don't render if inside a tag. + mark_exclude = ['text'], + marker = new Mark(content), + URL_SEARCH_PARAM = 'search', + URL_MARK_PARAM = 'highlight'; + + let current_searchterm = '', + doc_urls = [], + search_options = { + bool: 'AND', + expand: true, + fields: { + title: {boost: 1}, + body: {boost: 1}, + breadcrumbs: {boost: 0}, + }, + }, + searchindex = null, + results_options = { + teaser_word_count: 30, + limit_results: 30, + }, + teaser_count = 0; + + function hasFocus() { + return searchbar === document.activeElement; + } + + function removeChildren(elem) { + while (elem.firstChild) { + elem.removeChild(elem.firstChild); + } + } + + // Helper to parse a url into its building blocks. + function parseURL(url) { + const a = document.createElement('a'); + a.href = url; + return { + source: url, + protocol: a.protocol.replace(':', ''), + host: a.hostname, + port: a.port, + params: (function() { + const ret = {}; + const seg = a.search.replace(/^\?/, '').split('&'); + for (const part of seg) { + if (!part) { + continue; + } + const s = part.split('='); + ret[s[0]] = s[1]; + } + return ret; + })(), + file: (a.pathname.match(/\/([^/?#]+)$/i) || ['', ''])[1], + hash: a.hash.replace('#', ''), + path: a.pathname.replace(/^([^/])/, '/$1'), + }; + } + + // Helper to recreate a url string from its building blocks. + function renderURL(urlobject) { + let url = urlobject.protocol + '://' + urlobject.host; + if (urlobject.port !== '') { + url += ':' + urlobject.port; + } + url += urlobject.path; + let joiner = '?'; + for (const prop in urlobject.params) { + if (Object.prototype.hasOwnProperty.call(urlobject.params, prop)) { + url += joiner + prop + '=' + urlobject.params[prop]; + joiner = '&'; + } + } + if (urlobject.hash !== '') { + url += '#' + urlobject.hash; + } + return url; + } + + // Helper to escape html special chars for displaying the teasers + const escapeHTML = (function() { + const MAP = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''', + }; + const repl = function(c) { + return MAP[c]; + }; + return function(s) { + return s.replace(/[&<>'"]/g, repl); + }; + })(); + + function formatSearchMetric(count, searchterm) { + if (count === 1) { + return count + ' search result for \'' + searchterm + '\':'; + } else if (count === 0) { + return 'No search results for \'' + searchterm + '\'.'; + } else { + return count + ' search results for \'' + searchterm + '\':'; + } + } + + function formatSearchResult(result, searchterms) { + const teaser = makeTeaser(escapeHTML(result.doc.body), searchterms); + teaser_count++; + + // The ?URL_MARK_PARAM= parameter belongs inbetween the page and the #heading-anchor + const url = doc_urls[result.ref].split('#'); + if (url.length === 1) { // no anchor found + url.push(''); + } + + // encodeURIComponent escapes all chars that could allow an XSS except + // for '. Due to that we also manually replace ' with its url-encoded + // representation (%27). + const encoded_search = encodeURIComponent(searchterms.join(' ')).replace(/'/g, '%27'); + + return '' + + result.doc.breadcrumbs + '' + '' + teaser + ''; + } + + function makeTeaser(body, searchterms) { + // The strategy is as follows: + // First, assign a value to each word in the document: + // Words that correspond to search terms (stemmer aware): 40 + // Normal words: 2 + // First word in a sentence: 8 + // Then use a sliding window with a constant number of words and count the + // sum of the values of the words within the window. Then use the window that got the + // maximum sum. If there are multiple maximas, then get the last one. + // Enclose the terms in . + const stemmed_searchterms = searchterms.map(function(w) { + return elasticlunr.stemmer(w.toLowerCase()); + }); + const searchterm_weight = 40; + const weighted = []; // contains elements of ["word", weight, index_in_document] + // split in sentences, then words + const sentences = body.toLowerCase().split('. '); + let index = 0; + let value = 0; + let searchterm_found = false; + for (const sentenceindex in sentences) { + const words = sentences[sentenceindex].split(' '); + value = 8; + for (const wordindex in words) { + const word = words[wordindex]; + if (word.length > 0) { + for (const searchtermindex in stemmed_searchterms) { + if (elasticlunr.stemmer(word).startsWith( + stemmed_searchterms[searchtermindex]) + ) { + value = searchterm_weight; + searchterm_found = true; + } + } + weighted.push([word, value, index]); + value = 2; + } + index += word.length; + index += 1; // ' ' or '.' if last word in sentence + } + index += 1; // because we split at a two-char boundary '. ' + } + + if (weighted.length === 0) { + return body; + } + + const window_weight = []; + const window_size = Math.min(weighted.length, results_options.teaser_word_count); + + let cur_sum = 0; + for (let wordindex = 0; wordindex < window_size; wordindex++) { + cur_sum += weighted[wordindex][1]; + } + window_weight.push(cur_sum); + for (let wordindex = 0; wordindex < weighted.length - window_size; wordindex++) { + cur_sum -= weighted[wordindex][1]; + cur_sum += weighted[wordindex + window_size][1]; + window_weight.push(cur_sum); + } + + let max_sum_window_index = 0; + if (searchterm_found) { + let max_sum = 0; + // backwards + for (let i = window_weight.length - 1; i >= 0; i--) { + if (window_weight[i] > max_sum) { + max_sum = window_weight[i]; + max_sum_window_index = i; + } + } + } else { + max_sum_window_index = 0; + } + + // add around searchterms + const teaser_split = []; + index = weighted[max_sum_window_index][2]; + for (let i = max_sum_window_index; i < max_sum_window_index + window_size; i++) { + const word = weighted[i]; + if (index < word[2]) { + // missing text from index to start of `word` + teaser_split.push(body.substring(index, word[2])); + index = word[2]; + } + if (word[1] === searchterm_weight) { + teaser_split.push(''); + } + index = word[2] + word[0].length; + teaser_split.push(body.substring(word[2], index)); + if (word[1] === searchterm_weight) { + teaser_split.push(''); + } + } + + return teaser_split.join(''); + } + + function init(config) { + results_options = config.results_options; + search_options = config.search_options; + doc_urls = config.doc_urls; + searchindex = elasticlunr.Index.load(config.index); + + // Set up events + searchicon.addEventListener('click', () => { + searchIconClickHandler(); + }, false); + searchbar.addEventListener('keyup', () => { + searchbarKeyUpHandler(); + }, false); + document.addEventListener('keydown', e => { + globalKeyHandler(e); + }, false); + // If the user uses the browser buttons, do the same as if a reload happened + window.onpopstate = () => { + doSearchOrMarkFromUrl(); + }; + // Suppress "submit" events so the page doesn't reload when the user presses Enter + document.addEventListener('submit', e => { + e.preventDefault(); + }, false); + + // If reloaded, do the search or mark again, depending on the current url parameters + doSearchOrMarkFromUrl(); + + // Exported functions + config.hasFocus = hasFocus; + } + + function unfocusSearchbar() { + // hacky, but just focusing a div only works once + const tmp = document.createElement('input'); + tmp.setAttribute('style', 'position: absolute; opacity: 0;'); + searchicon.appendChild(tmp); + tmp.focus(); + tmp.remove(); + } + + // On reload or browser history backwards/forwards events, parse the url and do search or mark + function doSearchOrMarkFromUrl() { + // Check current URL for search request + const url = parseURL(window.location.href); + if (Object.prototype.hasOwnProperty.call(url.params, URL_SEARCH_PARAM) + && url.params[URL_SEARCH_PARAM] !== '') { + showSearch(true); + searchbar.value = decodeURIComponent( + (url.params[URL_SEARCH_PARAM] + '').replace(/\+/g, '%20')); + searchbarKeyUpHandler(); // -> doSearch() + } else { + showSearch(false); + } + + if (Object.prototype.hasOwnProperty.call(url.params, URL_MARK_PARAM)) { + const words = decodeURIComponent(url.params[URL_MARK_PARAM]).split(' '); + marker.mark(words, { + exclude: mark_exclude, + }); + + const markers = document.querySelectorAll('mark'); + const hide = () => { + for (let i = 0; i < markers.length; i++) { + markers[i].classList.add('fade-out'); + window.setTimeout(() => { + marker.unmark(); + }, 300); + } + }; + + for (let i = 0; i < markers.length; i++) { + markers[i].addEventListener('click', hide); + } + } + } + + // Eventhandler for keyevents on `document` + function globalKeyHandler(e) { + if (e.altKey || + e.ctrlKey || + e.metaKey || + e.shiftKey || + e.target.type === 'textarea' || + e.target.type === 'text' || + !hasFocus() && /^(?:input|select|textarea)$/i.test(e.target.nodeName) + ) { + return; + } + + if (e.key === 'Escape') { + e.preventDefault(); + searchbar.classList.remove('active'); + setSearchUrlParameters('', + searchbar.value.trim() !== '' ? 'push' : 'replace'); + if (hasFocus()) { + unfocusSearchbar(); + } + showSearch(false); + marker.unmark(); + } else if (!hasFocus() && (e.key === 's' || e.key === '/')) { + e.preventDefault(); + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else if (hasFocus() && (e.key === 'ArrowDown' + || e.key === 'Enter')) { + e.preventDefault(); + const first = searchresults.firstElementChild; + if (first !== null) { + unfocusSearchbar(); + first.classList.add('focus'); + if (e.key === 'Enter') { + window.location.assign(first.querySelector('a')); + } + } + } else if (!hasFocus() && (e.key === 'ArrowDown' + || e.key === 'ArrowUp' + || e.key === 'Enter')) { + // not `:focus` because browser does annoying scrolling + const focused = searchresults.querySelector('li.focus'); + if (!focused) { + return; + } + e.preventDefault(); + if (e.key === 'ArrowDown') { + const next = focused.nextElementSibling; + if (next) { + focused.classList.remove('focus'); + next.classList.add('focus'); + } + } else if (e.key === 'ArrowUp') { + focused.classList.remove('focus'); + const prev = focused.previousElementSibling; + if (prev) { + prev.classList.add('focus'); + } else { + searchbar.select(); + } + } else { // Enter + window.location.assign(focused.querySelector('a')); + } + } + } + + function showSearch(yes) { + if (yes) { + search_wrap.classList.remove('hidden'); + searchicon.setAttribute('aria-expanded', 'true'); + } else { + search_wrap.classList.add('hidden'); + searchicon.setAttribute('aria-expanded', 'false'); + const results = searchresults.children; + for (let i = 0; i < results.length; i++) { + results[i].classList.remove('focus'); + } + } + } + + function showResults(yes) { + if (yes) { + searchresults_outer.classList.remove('hidden'); + } else { + searchresults_outer.classList.add('hidden'); + } + } + + // Eventhandler for search icon + function searchIconClickHandler() { + if (search_wrap.classList.contains('hidden')) { + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else { + showSearch(false); + } + } + + // Eventhandler for keyevents while the searchbar is focused + function searchbarKeyUpHandler() { + const searchterm = searchbar.value.trim(); + if (searchterm !== '') { + searchbar.classList.add('active'); + doSearch(searchterm); + } else { + searchbar.classList.remove('active'); + showResults(false); + removeChildren(searchresults); + } + + setSearchUrlParameters(searchterm, 'push_if_new_search_else_replace'); + + // Remove marks + marker.unmark(); + } + + // Update current url with ?URL_SEARCH_PARAM= parameter, remove ?URL_MARK_PARAM and + // `#heading-anchor`. `action` can be one of "push", "replace", + // "push_if_new_search_else_replace" and replaces or pushes a new browser history item. + // "push_if_new_search_else_replace" pushes if there is no `?URL_SEARCH_PARAM=abc` yet. + function setSearchUrlParameters(searchterm, action) { + const url = parseURL(window.location.href); + const first_search = !Object.prototype.hasOwnProperty.call(url.params, URL_SEARCH_PARAM); + + if (searchterm !== '' || action === 'push_if_new_search_else_replace') { + url.params[URL_SEARCH_PARAM] = searchterm; + delete url.params[URL_MARK_PARAM]; + url.hash = ''; + } else { + delete url.params[URL_MARK_PARAM]; + delete url.params[URL_SEARCH_PARAM]; + } + // A new search will also add a new history item, so the user can go back + // to the page prior to searching. A updated search term will only replace + // the url. + if (action === 'push' || action === 'push_if_new_search_else_replace' && first_search ) { + history.pushState({}, document.title, renderURL(url)); + } else if (action === 'replace' || + action === 'push_if_new_search_else_replace' && + !first_search + ) { + history.replaceState({}, document.title, renderURL(url)); + } + } + + function doSearch(searchterm) { + // Don't search the same twice + if (current_searchterm === searchterm) { + return; + } else { + current_searchterm = searchterm; + } + + if (searchindex === null) { + return; + } + + // Do the actual search + const results = searchindex.search(searchterm, search_options); + const resultcount = Math.min(results.length, results_options.limit_results); + + // Display search metrics + searchresults_header.innerText = formatSearchMetric(resultcount, searchterm); + + // Clear and insert results + const searchterms = searchterm.split(' '); + removeChildren(searchresults); + for (let i = 0; i < resultcount ; i++) { + const resultElem = document.createElement('li'); + resultElem.innerHTML = formatSearchResult(results[i], searchterms); + searchresults.appendChild(resultElem); + } + + // Display results + showResults(true); + } + + function loadScript(url, id) { + const script = document.createElement('script'); + script.src = url; + script.id = id; + script.onload = () => init(window.search); + script.onerror = error => { + console.error(`Failed to load \`${url}\`: ${error}`); + }; + document.head.append(script); + } + + loadScript(path_to_root + 'searchindex.js', 'search-index'); + +})(window.search); diff --git a/projects/rust/tutorial/searchindex.js b/projects/rust/tutorial/searchindex.js new file mode 100644 index 00000000000..a93f33bddf1 --- /dev/null +++ b/projects/rust/tutorial/searchindex.js @@ -0,0 +1 @@ +window.search = JSON.parse('{"doc_urls":["introduction.html#tutorial-using-rust-in-sel4-userspace","setup.html#setup","setup.html#docker","setup.html#two-workspaces","setup.html#vscode--dev-containers","setup.html#rustdoc","root-task/index.html#the-root-task","root-task/hello-world.html#hello-world","root-task/hello-world.html#step-2a-exercise","root-task/hello-world.html#step-2b-exercise","root-task/hello-world.html#step-2c-exercise","root-task/hello-world.html#step-2d-exercise","root-task/hello-world.html#step-2e-exercise","root-task/hello-world.html#step-2f-exercise","root-task/hello-world.html#step-2g","root-task/kernel-objects.html#allocating-kernel-objects","root-task/kernel-objects.html#step-3a","root-task/kernel-objects.html#step-3b","root-task/kernel-objects.html#step-3c","root-task/kernel-objects.html#step-3d-exercise","root-task/kernel-objects.html#step-3e-exercise","root-task/kernel-objects.html#step-3f-exercise","root-task/kernel-objects.html#step-3g-exercise","root-task/address-space.html#modifying-the-address-space","root-task/address-space.html#step-4a-exercise","root-task/address-space.html#step-4b","root-task/address-space.html#step-4c","root-task/address-space.html#step-4d-exercise","root-task/serial-device.html#using-a-serial-device","root-task/serial-device.html#step-5a","root-task/serial-device.html#step-5b-exercise","root-task/serial-device.html#step-5c","root-task/serial-device.html#step-5d","root-task/serial-device.html#step-5e-exercise","root-task/serial-device.html#step-5f-exercise","root-task/serial-device.html#step-5g-exercise","root-task/serial-device.html#step-5h-exercise","root-task/spawn-thread.html#spawning-a-thread","root-task/spawn-thread.html#step-6a","root-task/spawn-thread.html#step-6b-exercise","root-task/spawn-thread.html#step-6c-exercise","root-task/spawn-task.html#spawning-a-task-challenge","root-task/spawn-task.html#step-7a","root-task/spawn-task.html#step-7b","root-task/spawn-task.html#step-7c","root-task/spawn-task.html#step-7d","root-task/spawn-task.html#step-7e-challenge","microkit/index.html#sel4-microkit","microkit/hello-world.html#hello-world","microkit/hello-world.html#the-event-handler","microkit/hello-world.html#language-runtime","microkit/ipc.html#ipc","microkit/ipc.html#step-10a-exercise","microkit/shared-memory.html#shared-memory","microkit/shared-memory.html#step-11a","microkit/shared-memory.html#step-11b"],"index":{"documentStore":{"docInfo":{"0":{"body":90,"breadcrumbs":6,"title":5},"1":{"body":107,"breadcrumbs":2,"title":1},"10":{"body":15,"breadcrumbs":5,"title":3},"11":{"body":4,"breadcrumbs":5,"title":3},"12":{"body":40,"breadcrumbs":5,"title":3},"13":{"body":49,"breadcrumbs":5,"title":3},"14":{"body":41,"breadcrumbs":4,"title":2},"15":{"body":172,"breadcrumbs":6,"title":3},"16":{"body":142,"breadcrumbs":5,"title":2},"17":{"body":41,"breadcrumbs":5,"title":2},"18":{"body":332,"breadcrumbs":5,"title":2},"19":{"body":7,"breadcrumbs":6,"title":3},"2":{"body":45,"breadcrumbs":2,"title":1},"20":{"body":116,"breadcrumbs":6,"title":3},"21":{"body":12,"breadcrumbs":6,"title":3},"22":{"body":8,"breadcrumbs":6,"title":3},"23":{"body":148,"breadcrumbs":6,"title":3},"24":{"body":27,"breadcrumbs":6,"title":3},"25":{"body":64,"breadcrumbs":5,"title":2},"26":{"body":104,"breadcrumbs":5,"title":2},"27":{"body":30,"breadcrumbs":6,"title":3},"28":{"body":81,"breadcrumbs":6,"title":3},"29":{"body":43,"breadcrumbs":5,"title":2},"3":{"body":64,"breadcrumbs":3,"title":2},"30":{"body":92,"breadcrumbs":6,"title":3},"31":{"body":116,"breadcrumbs":5,"title":2},"32":{"body":28,"breadcrumbs":5,"title":2},"33":{"body":53,"breadcrumbs":6,"title":3},"34":{"body":95,"breadcrumbs":6,"title":3},"35":{"body":10,"breadcrumbs":6,"title":3},"36":{"body":46,"breadcrumbs":6,"title":3},"37":{"body":116,"breadcrumbs":4,"title":2},"38":{"body":262,"breadcrumbs":4,"title":2},"39":{"body":7,"breadcrumbs":5,"title":3},"4":{"body":62,"breadcrumbs":4,"title":3},"40":{"body":21,"breadcrumbs":5,"title":3},"41":{"body":194,"breadcrumbs":6,"title":3},"42":{"body":101,"breadcrumbs":5,"title":2},"43":{"body":41,"breadcrumbs":5,"title":2},"44":{"body":21,"breadcrumbs":5,"title":2},"45":{"body":9,"breadcrumbs":5,"title":2},"46":{"body":121,"breadcrumbs":6,"title":3},"47":{"body":40,"breadcrumbs":3,"title":2},"48":{"body":56,"breadcrumbs":4,"title":2},"49":{"body":48,"breadcrumbs":4,"title":2},"5":{"body":49,"breadcrumbs":2,"title":1},"50":{"body":24,"breadcrumbs":4,"title":2},"51":{"body":182,"breadcrumbs":2,"title":1},"52":{"body":53,"breadcrumbs":4,"title":3},"53":{"body":280,"breadcrumbs":4,"title":2},"54":{"body":66,"breadcrumbs":4,"title":2},"55":{"body":89,"breadcrumbs":4,"title":2},"6":{"body":137,"breadcrumbs":3,"title":2},"7":{"body":150,"breadcrumbs":4,"title":2},"8":{"body":3,"breadcrumbs":5,"title":3},"9":{"body":5,"breadcrumbs":5,"title":3}},"docs":{"0":{"body":"seL4 has official support for Rust in userspace, funded by the seL4 Foundation: https://github.com/seL4/rust-sel4 The exports of this project covered in this tutorial are: Rust bindings for the seL4 API A runtime for root tasks Rust bindings for the seL4 Microkit API A runtime for seL4 Microkit protection domains Custom rustc target specifications for seL4 userspace Part I covers the Rust bindings for the seL4 API and the runtime for root tasks. Familiarity with the seL4 API isn\'t necessarily assumed or required, but this text doesn\'t introduce its elements in as much detail as the seL4 Manual . Part II is much shorter, and covers the Rust language runtime for seL4 Microkit protection domains and implementation of the Microkit API. This part does assume that the reader is familiar with the basics of the Microkit framework and API, or is using a companion resource to learn about the Microkit in parallel.","breadcrumbs":"Introduction » Tutorial: Using Rust in seL4 Userspace","id":"0","title":"Tutorial: Using Rust in seL4 Userspace"},"1":{"body":"This tutorial is presented as a linear series of patches to https://github.com/seL4/seL4-rust-tutorial-code , starting at commit 8ca0e1939dc1, and ending with commit 5253edc1ed12. Each patch, or step, as we shall call them, is an instructive modification to a code example. You are encouraged (but by no means required) to attempt those marked as exercises in this text on your own. Note that while most step patches include tests, the reader is not expected to write tests for exercises themselves. Clone the repository and checkout the starting commit: git clone https://github.com/seL4/seL4-rust-tutorial-code\\ncd seL4-rust-tutorial-code\\ngit checkout 8ca0e1939dc1 Observe the steps ahead: git log 8ca0e1939dc1..5253edc1ed12 Each step header contains two icons. Clicking the clipboard copies the commit hash corresponding to the step to the clipboard. The GitHub icon is a link to the commit on GitHub. Use any Git workflow that works for you. For example, you could cherry-pick the steps that are not marked as exercises after examining and understanding them, and then attempt the exercises on your own, using those step commits as hints when necessary.","breadcrumbs":"Setup » Setup","id":"1","title":"Setup"},"10":{"body":"You can set a custom panic hook with sel4_root_task::panicking::PanicHook . The default hook just prints the panic\'s ExternalPanicInfo. Exercise: Set a custom panic hook.","breadcrumbs":"Hello, World! » Step 2.C (exercise)","id":"10","title":"Step 2.C (exercise)"},"11":{"body":"Exercise: Cause a stack overflow.","breadcrumbs":"Hello, World! » Step 2.D (exercise)","id":"11","title":"Step 2.D (exercise)"},"12":{"body":"The #[root_task] attribute macro accepts a named stack_size parameter, which can be any expression of type usize and whose value is interpreted as the root task\'s initial thread\'s stack size, in bytes. For example: #[root_task(stack_size = 13 * 37)] The default stack size is sel4_root_task::DEFAULT_STACK_SIZE . Exercise: Adjust the root task\'s initial thread\'s stack size to prevent the stack overflow you just caused.","breadcrumbs":"Hello, World! » Step 2.E (exercise)","id":"12","title":"Step 2.E (exercise)"},"13":{"body":"By default, the sel4_root_task runtime does not include a heap. Any attempt to use the alloc crate will result in a link-time failure. The #[root_task] attribute macro accepts a heap_size parameter, which can be any expression of type usize and whose value is interpreted as the root task\'s heap size, in bytes. Note that heap_size must come after stack_size in the case where both are present. For example: #[root_task(heap_size = 0xf00d)] or #[root_task(stack_size = 13 * 37, heap_size = 0xf00d)] Exercise: Add a heap and use it.","breadcrumbs":"Hello, World! » Step 2.F (exercise)","id":"13","title":"Step 2.F (exercise)"},"14":{"body":"The sel4_logging crate builds on top of the log crate to add utilities for initializing simple loggers in minimal environments, such as a seL4 root task. This step demonstrates one way to initialize a logger using this crate: hello-world/src/main.rs:17:20 after 2.G static LOGGER: Logger = LoggerBuilder::const_default() .level_filter(LevelFilter::Info) .write(|s| sel4::debug_print!(\\"{}\\", s)) .build(); hello-world/src/main.rs:41 after 2.G LOGGER.set().unwrap();","breadcrumbs":"Hello, World! » Step 2.G","id":"14","title":"Step 2.G"},"15":{"body":"Start by navigating to and running this chapter\'s example, which, so far, is empty. cd workspaces/root-task/kernel-objects\\nmake simulate Userspace operates the seL4 kernel by creating, managing, and accessing kernel objects via references called capabilites . See seL4 Reference Manual § 2.3 (Kernel Objects) for an outline of the core types of kernel objects. In the context of seL4, a capability is a granular, unforgeable token of authority that references a kernel object and carries access rights that limit what the user of a cabability can do with the referenced kernel object. In general, a system call in seL4 amounts to refering to a cabability and an action on the kernel object the cabability points to. This is called invoking a capability . Just as each thread is associated with a virtual address space which the hardware uses to translate virtual memory addresses into locations in physical memory, each seL4 thread is also assocated with a capability space ( CSpace ) which the kernel uses to translate so-called capability pointers ( CPointers or CPtrs ) into locations (slots) in the kernel\'s capability tables called CNodes . The sel4::CPtr type is a wrapper around a machine word. The sel4::Cap type wraps a CPtr associated with the current thread\'s CSpace, and thus points to a particular capability slot within the kernel. It is paramterized by a capability type T: sel4::CapType , representing the type of capability in that slot. It is up to the crate user to ensure that Cap\'s are valid and well-typed in the current thread. The sel4::cap module contains aliases of the form sel4::Cap. Depending on the Cap\'s type T, a Cap has a number of methods available, which correspond to invocations for that capability type. For example, sel4::Cap::tcb_resume() is available when T is sel4::cap_type::Tcb .","breadcrumbs":"Allocating Kernel Objects » Allocating Kernel Objects","id":"15","title":"Allocating Kernel Objects"},"16":{"body":"As elaborated in seL4 Reference Manual § 2.4 (Kernel Memory Allocation) , userspace is responsible for managing the memory associated with kernel objects. Untyped memory is the name of the object type for free memory. At boot time, the root task is granted untyped memory capabilities for all of the system\'s memory, except for the memory used for the kernel and the root task\'s own resources. Print the untyped memory described by the BootInfo frame : workspaces/root-task/kernel-objects/src/main.rs:14:22 after 3.A sel4::debug_println!(\\"untyped:\\"); for ut_desc in bootinfo.untyped_list() { sel4::debug_println!( \\" paddr: {:#016x?}, size bits: {:02?}, is device: {:?}\\", ut_desc.paddr(), ut_desc.size_bits(), ut_desc.is_device() ); } Sample output: untyped: paddr: 0x00000000000000, size bits: 27, is device: true paddr: 0x00000008001000, size bits: 12, is device: true paddr: 0x00000008002000, size bits: 13, is device: true paddr: 0x00000008004000, size bits: 14, is device: true paddr: 0x00000008008000, size bits: 15, is device: true paddr: 0x00000008011000, size bits: 12, is device: true paddr: 0x00000008012000, size bits: 13, is device: true ... sel4::UntypedDesc::size_bits() returns the log base 2 of the size of the region of memory described by the descriptor. sel4::UntypedDesc::is_device() returns whether the region is device memory or kernel memory. Device memory can only be used for creating frames, whereas kernel memory has no such restrictions.","breadcrumbs":"Allocating Kernel Objects » Step 3.A","id":"16","title":"Step 3.A"},"17":{"body":"Add a function that finds the largest untyped region passed to the root task: workspaces/root-task/kernel-objects/src/main.rs:32:42 after 3.B fn find_largest_kernel_untyped(bootinfo: &sel4::BootInfo) -> sel4::cap::Untyped { let (ut_ix, _desc) = bootinfo .untyped_list() .iter() .enumerate() .filter(|(_i, desc)| !desc.is_device()) .max_by_key(|(_i, desc)| desc.size_bits()) .unwrap(); bootinfo.untyped().index(ut_ix).cap()\\n} The expression bootinfo.untyped().index(ut_ix).cap() indexes into bootinfo.untyped(): SlotRegion to retrieve a Slot, which can be turned into a Cap (= cap::Untyped).","breadcrumbs":"Allocating Kernel Objects » Step 3.B","id":"17","title":"Step 3.B"},"18":{"body":"In this step, we will allocate a Notification object. We already know how to refer to a capability in the current thread\'s CSpace: a CPtr. However, some capability invocations allow us to refer to a capability slot in any CSpace whose root CNode is present in the current thread\'s CSpace. In these cases, we must provide: A CPtr, interpreted in the context of the current thread\'s CSpace, which points to the target CSpace\'s root CNode A CPtr, interpreted in the context of the target CSpace, which points to the target capability slot A depth, which is the number of bits of the second CPtr to interpret. This allows for the second CPtr to point to a CNode. Why this is necessary is outside the scope of this tutorial, but you can read about it in seL4 Reference Manual § 2.4 (CSpace Addressing) . Consider, for example, the seL4_CNode_Mint capability invocation. dest_* and src_* are both capability slots addressed in this way. This more flexible method of capability slot addressing is encapsulated in the sel4::AbsoluteCPtr type. The seL4_Untyped_Retype method is used for allocating new objects from an untyped object. The _service parameter is the address of the untyped object as a normal CPtr. root, node_index, and node_depth address, in the more flexible way outlined above, the destination CNode into which capabilities for the new objects will be inserted. node_offset and num_objects specify a range of slots within the selected CNode for the new capabilites (and, simultaneously, the number of new objects that will be created). type and size_bits specify the shape of the new object(s) Note that size_bits is relevant for only certain object types (see seL4 Reference Manual § 2.4.2 (Summary of Object Sizes) for more information). This shape information is encapsulated in the sel4::ObjectBlueprint type. Multiple kernel objects can be allocated from a single unytped object. For each untyped object, the kernel maintains a watermark which tracks how much of the untyped object has been used up for object allocation. seL4_Untyped_Retype aligns the watermark to the desired object type\'s size, and then advances it according to the object type size and number of objects. This process is detailed in the fourth paragraph of seL4 Reference Manual § 2.4.1 (Reusing Memory) . Let us now work towards calling sel4::cap::Untyped::untyped_retype() on our previously acquired largest_kernel_ut. We wish to allocate one notification object and insert a capability for it into a free slot in the current thread\'s own CSpace. More precisely, we need a sel4::AbsoluteCPtr for the current thread\'s own CSpace\'s root CNode, and an index into that CNode for a free slot. The CPtr for the initial thread\'s own CSpace root is a constant: workspaces/root-task/kernel-objects/src/main.rs:27:27 after 3.C let cnode = sel4::init_thread::slot::CNODE.cap(); bootinfo can tell us about a range of empty slots in this CSpace. We can leverage the fact that Rust\'s Range type is an iterator for certain T to allocate slots in an ergonomic way: workspaces/root-task/kernel-objects/src/main.rs:29:33 after 3.C let mut empty_slots = bootinfo .empty() .range() .map(sel4::init_thread::Slot::from_index); let notification_slot = empty_slots.next().unwrap(); The {{#rustdoc_link root-task sel4/cap/type.CNode.html#method.absolute_cptr_for_selfsel4::cap::CNode::absolute_cptr_for_self()}} method elaborates a sel4::cap::Cnode into a sel4::AbsoluteCPtr. Interestingly, there are two ways to do this, but the current implementation is just to use a depth of zero. Now we can invoke our untyped capability to allocate a notification object: workspaces/root-task/kernel-objects/src/main.rs:36:43 after 3.C largest_kernel_ut .untyped_retype( &sel4::ObjectBlueprint::Notification, &cnode.absolute_cptr_for_self(), notification_slot.index(), 1, ) .unwrap(); Now that we know that notification_slot contains a notification capability, we can cast it and get a sel4::cap::Notification : workspaces/root-task/kernel-objects/src/main.rs:45:47 after 3.C let notification = notification_slot .downcast::() .cap();","breadcrumbs":"Allocating Kernel Objects » Step 3.C","id":"18","title":"Step 3.C"},"19":{"body":"Exercise: : Use sel4::cap::Notification::signal() and sel4::cap::Notification::wait() to signal and then wait on the notification.","breadcrumbs":"Allocating Kernel Objects » Step 3.D (exercise)","id":"19","title":"Step 3.D (exercise)"},"2":{"body":"We will work inside of a Docker container built with docker/Dockerfile . This Dockerfile installs some build-time dependencies, and then builds seL4, seL4 Microkit , and some additional programs and tools. Build the image: make -C docker build Run a container in the background: make -C docker run Start a shell inside the container: make -C docker exec The rest of this text assumes that you are in a shell inside the container.","breadcrumbs":"Setup » Docker","id":"2","title":"Docker"},"20":{"body":"As described in seL4 Reference Manual § 5 (Notifications) , a notification capability can contain a word-sized mask called a badge. When that capability is used to signal the notification, the notification\'s word-sized state is bit-wise ored with the capability\'s badge. A wait call on the notification returns and clears the notification\'s state, provided that a signal call has occurred since the last wait call. sel4::AbsoluteCPtr::mint() mints a new capability from an existing capability, updatings its access rights and badge. Exercise: : Allocate a new empty slot in the current CNode. A slot in the root task\'s CSpace (i.e. a value of type sel4::init_thread::Slot ) can be turned into an sel4::AbsoluteCPtr using {{#rustdoc_link root-task sel4/cap/type.CNode.html#method.absolute_cptrsel4::CNode::absolute_cptr()}}: workspaces/root-task/kernel-objects/src/main.rs:63:63 after 3.E &cnode.absolute_cptr(notification_slot.cptr()), Exercise: : Mint a capability based on the capability in notification_slot into your newly allocated slot. Use sel4::CapRights::all() for the rights parameter, and specify a non-zero badge value. Exercise: : Signal the notification using your newly minted badged capability. Using the return value of sel4::Notification::wait(), compare the badge value it returns with the badge you used to mint the capability.","breadcrumbs":"Allocating Kernel Objects » Step 3.E (exercise)","id":"20","title":"Step 3.E (exercise)"},"21":{"body":"Exercise: : sel4::CapRights::all() is overly-permissive. Use the overly-restrictive sel4::CapRights::none() instead and watch the program fail.","breadcrumbs":"Allocating Kernel Objects » Step 3.F (exercise)","id":"21","title":"Step 3.F (exercise)"},"22":{"body":"Exercise: : Now use the minimum rights necessary for the program to run.","breadcrumbs":"Allocating Kernel Objects » Step 3.G (exercise)","id":"22","title":"Step 3.G (exercise)"},"23":{"body":"This chapter will focus on using the seL4 virtual address space (VSpace) APIs to manipulate the root task\'s own address space. Start by navigating to and running this chapter\'s example, which, so far, is empty. cd workspaces/root-task/address-space\\nmake simulate In seL4, each thread is associated with a virtual address space (VSpace). A VSpace is comprised of a tree of translation tables mapping virtual addresses into physical frames of memory. VSpaces are represented by their root translation structures. While the high-level virtual address space API concepts are architecture-independent, the specific kernel object types for a given architecture mirror that architecture\'s paging structures. That said, all architectures share two object types: The top-level paging structure, called a VSpace, which is used to represent a virtual address space. In the sel4 crate , the corresponding sel4::CapType is sel4::cap_type::VSpace (note that, for some architectures, this is a type alias). Frames of physical memory. The set of possible frames sizes is architecture-dependant. See seL4 Reference Manual § 7.1.3 (Page) . In the sel4 crate , sel4::cap_type::Granule is an alias for the sel4::CapType corresponding to the smallest frame object type. The root task is provided with capabilites for the objects comprising its own virtual address space. The locations of these capabilities in the root task\'s CSpace is provided in the BootInfo struct. Our goal for this chapter will be to create a frame object and experiment with mapping it into the root task\'s own address space.","breadcrumbs":"Modifying the Address Space » Modifying the Address Space","id":"23","title":"Modifying the Address Space"},"24":{"body":"Exercise: Using code snippets from Chapter 3 (Allocating Kernel Objects) , create a frame object. We seek a value frame: sel4::cap::Granule (which can also be written as frame: sel4::Cap). Note that, after importing the sel4::CapTypeForObjectOfFixedSize trait, you can express the appropriate sel4::ObjectBlueprint as sel4::cap_type::Granule::object_blueprint().","breadcrumbs":"Modifying the Address Space » Step 4.A (exercise)","id":"24","title":"Step 4.A (exercise)"},"25":{"body":"In order to avoid interacting with intermediate translation structures, let\'s reserve an aligned granule-sized region in the root task\'s program image that we can use for our experiment: workspaces/root-task/address-space/src/main.rs:15:20 after 4.B const GRANULE_SIZE: usize = sel4::FrameObjectType::GRANULE.bytes(); // 4096 #[repr(C, align(4096))]\\nstruct PagePlaceholder(#[allow(dead_code)] [u8; GRANULE_SIZE]); static mut PAGE_A: PagePlaceholder = PagePlaceholder([0xee; GRANULE_SIZE]); workspaces/root-task/address-space/src/main.rs:46:49 after 4.B let page_a_addr = ptr::addr_of!(PAGE_A).cast::(); sel4::debug_println!(\\"PAGE_A: {page_a_addr:#x?}\\"); assert_eq!(page_a_addr as usize % GRANULE_SIZE, 0); assert_eq!(unsafe { page_a_addr.read() }, 0xee); This reservation covers exactly one page in the root task\'s virtual address space.","breadcrumbs":"Modifying the Address Space » Step 4.B","id":"25","title":"Step 4.B"},"26":{"body":"Let\'s unmap the page in the root task image that initially backs our reserved region. This will give us a hole in the root task VSpace, which we can use for our experiment. This function determines the slot in the root task\'s CSpace of the page capability corresponding to the page in the root task\'s VSpace which contains the given address: workspaces/root-task/address-space/src/main.rs:73:84 after 4.C fn get_user_image_frame_slot( bootinfo: &sel4::BootInfo, addr: usize,\\n) -> sel4::init_thread::Slot { extern \\"C\\" { static __executable_start: usize; } let user_image_addr = ptr::addr_of!(__executable_start) as usize; bootinfo .user_image_frames() .index(addr / GRANULE_SIZE - user_image_addr / GRANULE_SIZE)\\n} __executable_start is defined by the linker. We can use it, along with addr, to identify the offset into bootinfo.user_image_frames() of the capability we are after. Use the get_user_image_frame_slot() function to find the capability corresponding to the frame backing our reserved region, and unmap that frame, leaving a hole in the root task\'s virtual address space. Try to access that region, and observe a page fault: workspaces/root-task/address-space/src/main.rs:51:54 after 4.C let page_a_slot = get_user_image_frame_slot(bootinfo, page_a_addr as usize); page_a_slot.cap().frame_unmap().unwrap(); unsafe { page_a_addr.read() };","breadcrumbs":"Modifying the Address Space » Step 4.C","id":"26","title":"Step 4.C"},"27":{"body":"Exercise: Map new_frame at page_a_addr using new_frame.frame_map() , which corresponds to seL4_ARM_Page_Map . Here are some hints for the parameters of .frame_map(): vspace: A capability for the root task\'s VSpace can be expressed using sel4::init_thread::slot::VSPACE.cap(). rights: sel4::CapRights::read_write() are the most permissive rights, and will work for our purposes. attrs: sel4::VmAttributes::default() will work here.","breadcrumbs":"Modifying the Address Space » Step 4.D (exercise)","id":"27","title":"Step 4.D (exercise)"},"28":{"body":"In this chapter, we will build a root task that interacts with a serial device. Start by navigating to and running this chapter\'s example, which, so far, doesn\'t do anything interesting. cd workspaces/root-task/serial-device\\nmake simulate The module at device.rs implements a higher-level interface over the serial device\'s MMIO registers, whose physical base address is: workspaces/root-task/serial-device/src/main.rs:16:16 const SERIAL_DEVICE_MMIO_PADDR: usize = 0x0900_0000; Our first goal will be to map the serial device\'s MMIO registers into the root task\'s address space. After that, we will set up the root task\'s access to the serial device\'s interrupt, whose value is: workspaces/root-task/serial-device/src/main.rs:18:18 const SERIAL_DEVICE_IRQ: usize = 33; Finally, we will implement a simple loop that echoes serial input to serial output.","breadcrumbs":"Using a Serial Device » Using a Serial Device","id":"28","title":"Using a Serial Device"},"29":{"body":"First, add some familiar snippets that we will use for allocating CSlots and kernel objects: workspaces/root-task/serial-device/src/main.rs:34:44 after 5.A fn find_largest_kernel_untyped(bootinfo: &sel4::BootInfo) -> sel4::cap::Untyped { let (ut_ix, _desc) = bootinfo .untyped_list() .iter() .enumerate() .filter(|(_i, desc)| !desc.is_device()) .max_by_key(|(_i, desc)| desc.size_bits()) .unwrap(); bootinfo.untyped().index(ut_ix).cap()\\n} workspaces/root-task/serial-device/src/main.rs:22:27 after 5.A let mut empty_slots = bootinfo .empty() .range() .map(sel4::init_thread::Slot::::from_index); let largest_kernel_ut = find_largest_kernel_untyped(bootinfo);","breadcrumbs":"Using a Serial Device » Step 5.A","id":"29","title":"Step 5.A"},"3":{"body":"To simplify our Cargo invocations, this repository\'s Rust code has been divided between two distinct workspaces: workspaces/root-task and workspaces/microkit . Both are subject to the top-level .cargo/config.toml , whereas workspaces/root-task/.cargo/config.toml and workspaces/microkit/.cargo/config.toml each apply to only one. These workspace-specific config.toml files demonstrate all that is required to configure the crates in the rust-sel4 project: An environment variable pointing at libsel4 (which includes the kernel configuration). See the relevant crate docs for information on this environment variable. A reference to a custom rustc target specification (the location of the target specification is given at .cargo/config.toml:8 , which refers to target-specs ).","breadcrumbs":"Setup » Two Workspaces","id":"3","title":"Two Workspaces"},"30":{"body":"largest_kernel_ut will be useful for allocating kernel objects whose backing physical addresses don\'t matter to us, but we must allocate the frame which contains the serial device\'s MMIO registers at a particular physicall address (SERIAL_DEVICE_MMIO_PADDR). Furthermore, the seL4 API distinguishes between general purpose untyped and device untyped . General purpose untyped is backed by normal memory, and can be used to create any type of object. Device untyped is not backed by normal memory, and can only be used to create frames. See the last two paragraphs of seL4 Reference Manual § 2.4 (Kernel Memory Allocation) for more information. So, we must allocate the serial device MMIO frame from the particular initial device untyped that contains SERIAL_DEVICE_MMIO_PADDR. Exercice: Identify this initial untyped in the bootinfo. We will need a corresponding sel4::cap::Untyped along with the untyped\'s physical address (or sel4::UntypedDesc, which contains the physical address) for the next step.","breadcrumbs":"Using a Serial Device » Step 5.B (exercise)","id":"30","title":"Step 5.B (exercise)"},"31":{"body":"The untyped we\'ve identified contains the frame we are targeting, but that frame may be somewhere in the middle of the region of device memory the untyped covers. To allocate the frame at SERIAL_DEVICE_MMIO_PADDR, we must allocate dummy objects from this untyped until its watermark is at SERIAL_DEVICE_MMIO_PADDR. This trim_untyped function takes the untyped capability, its physical address, the desired physical address, and two empty slots for temporarily holding dummy objects. We need two slots because the kernel resets an untyped\'s watermark if it has no live children. So, we must always keep one child around so that our progress on advancing the watermark is never lost. workspaces/root-task/serial-device/src/main.rs:43:49 after 5.C trim_untyped( device_ut_cap, device_ut_desc.paddr(), SERIAL_DEVICE_MMIO_PADDR, empty_slots.next().unwrap(), empty_slots.next().unwrap(), ); workspaces/root-task/serial-device/src/main.rs:68:97 after 5.C fn trim_untyped( ut: sel4::cap::Untyped, ut_paddr: usize, target_paddr: usize, free_slot_a: sel4::init_thread::Slot, free_slot_b: sel4::init_thread::Slot,\\n) { let rel_a = sel4::init_thread::slot::CNODE .cap() .absolute_cptr(free_slot_a.cptr()); let rel_b = sel4::init_thread::slot::CNODE .cap() .absolute_cptr(free_slot_b.cptr()); let mut cur_paddr = ut_paddr; while cur_paddr != target_paddr { let size_bits = (target_paddr - cur_paddr).ilog2().try_into().unwrap(); ut.untyped_retype( &sel4::ObjectBlueprint::Untyped { size_bits }, &sel4::init_thread::slot::CNODE .cap() .absolute_cptr_for_self(), free_slot_b.index(), 1, ) .unwrap(); rel_a.delete().unwrap(); rel_a.move_(&rel_b).unwrap(); cur_paddr += 1 << size_bits; }\\n}","breadcrumbs":"Using a Serial Device » Step 5.C","id":"31","title":"Step 5.C"},"32":{"body":"device_ut_cap is now primed; the physical address of the next allocation will be SERIAL_DEVICE_MMIO_PADDR. Exercise: Allocate a small frame object (sel4::cap_type::Granule) from device_ut_cap. If your sel4::cap::Granule is called serial_device_frame_cap, then the following assertion should succeed: workspaces/root-task/serial-device/src/main.rs:70:73 after 5.D assert_eq!( serial_device_frame_cap.frame_get_address().unwrap(), SERIAL_DEVICE_MMIO_PADDR );","breadcrumbs":"Using a Serial Device » Step 5.D","id":"32","title":"Step 5.D"},"33":{"body":"Exercise: Using code from Step 4.B , Step 4.C , and Step 4.D , map serial_device_frame_cap into the root task\'s virtual address space. You should now be able interact with the serial device\'s MMIO registers. Try printing \\"Hello, World!\\" to the serial console with something like: workspaces/root-task/serial-device/src/main.rs:102:108 after 5.E let serial_device = unsafe { Device::new(serial_device_mmio_page_addr.cast()) }; serial_device.init(); for c in b\\"Hello, World!\\\\n\\" { serial_device.put_char(*c); } where serial_device_mmio_page_addr: *mut _ is a pointer to where the MMIO registers are mapped in the root task\'s virtual address space.","breadcrumbs":"Using a Serial Device » Step 5.E (exercise)","id":"33","title":"Step 5.E (exercise)"},"34":{"body":"Interrupts are delivered to userspace via notifications. A IRQHandler capability represents the authority to manage a particular interrupt. Specifically, an IRQHandler capability ( sel4::cap::IrqHandler ) has the following methods: seL4_IRQHandler_SetNotification() : Associate the interrupt with the given notification. Userspace can call seL4_Wait() or seL4_Poll() on this notification to receive the interrupt. seL4_IRQHandler_Clear() : Disassociate the notification associated with this interrupts. seL4_IRQHandler_Ack() : Tell the kernel to pass on acknowledgement of this interrupt to the interrupt controller. The Rust bindings for these methods are: sel4::cap::IrqHandler::irq_handler_set_notification() sel4::cap::IrqHandler::irq_handler_clear() sel4::cap::IrqHandler::irq_handler_ack() The root task spawns with a special IRQControl capability ( sel4::cap::IrqControl ) which can be used to create IRQHandler capabilities with seL4_IRQControl_Get() ( sel4::cap::IrqControl::irq_control_get() ). The intent behind this API is that a highly-privileged component will hold an IRQControl capability, which it will use to distribute more finely-grained IRQHandler capabilities to less privileged components for the interrupts they will manage. The root task can access its IRQControl capability with sel4::init_thread::slot::IRQ_CONTROL.cap() Exercise: Use sel4::init_thread::slot::IRQ_CONTROL.cap() to create a sel4::cap::IrqHandler for SERIAL_DEVICE_IRQ.","breadcrumbs":"Using a Serial Device » Step 5.F (exercise)","id":"34","title":"Step 5.F (exercise)"},"35":{"body":"Exercise: Create a notification object from largest_kernel_ut and associate it with the IRQHandler you just created using sel4::cap::IrqHandler::irq_handler_set_notification() .","breadcrumbs":"Using a Serial Device » Step 5.G (exercise)","id":"35","title":"Step 5.G (exercise)"},"36":{"body":"Exercise: Use serial_device: Device, your IRQHandler, and the notification you associated with the interrupt to write a loop that echoes serial input to serial output. Use serial_device.clear_all_interrupts() and irq_handler_cap.irq_handler_ack() in sequence to clear the interrupt at the device and interrupt controller levels respectively. Note that you should do this at the beginning of the loop in case your loop enters with an interrupt already pending. Use irq_notification_cap.wait() to wait for hte interrupt. Use serial_device.get_char() and serial_device.put_char() to read and write data.","breadcrumbs":"Using a Serial Device » Step 5.H (exercise)","id":"36","title":"Step 5.H (exercise)"},"37":{"body":"In this chapter, we will explore IPC through an example that spawns a secondary thread. This example starts with a more interesting program than the other examples we\'ve worked with so far. It spawns a secondary thread, and then interacts with it using a notification. Navigate to and run the example: cd workspaces/root-task/spawn-thread\\nmake simulate Explore main.rs at will. If you\'re used to using seL4_libs , you may notice that our Rust code here is much more low-level and verbose. That is because we aren\'t using any higher-level seL4-related libraries such as . Our code is more like spawning a thread using alone. Note, though, that our code does depend on a few Rust language runtime building block crates such as sel4-initialize-tls and sel4-stack . The exercises in this chapter are only concerned with the following two functions, which run concurrently: workspaces/root-task/spawn-thread/src/main.rs:75:79 fn secondary_thread_main(inter_thread_nfn: sel4::cap::Notification) { sel4::debug_println!(\\"In secondary thread\\"); inter_thread_nfn.signal();\\n} workspaces/root-task/spawn-thread/src/main.rs:81:85 fn interact_with_secondary_thread(inter_thread_nfn: sel4::cap::Notification) { sel4::debug_println!(\\"In primary thread\\"); inter_thread_nfn.wait();\\n} secondary_thread_main() runs in the secondary thread, and interact_with_secondary_thread() runs in the secondary thread.","breadcrumbs":"Spawning a Thread » Spawning a Thread","id":"37","title":"Spawning a Thread"},"38":{"body":"In this step, we introduce IPC between secondary_thread_main() and interact_with_secondary_thread by changing inter_thread_nfn: sel4::cap::Notification to inter_thread_ep: sel4::cap::Endpoint Before, the two sides of the notification communicated via inter_thread_nfn.signal() and inter_thread_nfn.wait() . Now, communication over this IPC endpoint will happen by inter_thread_ep.send() and inter_thread_ep.recv() . As described in seL4 Reference Manual § 4 (Message Passing (IPC)) and seL4 Reference Manual § 4.2 (Endpoints) , a capability for an Endpoint object can be invoked with send() and recv() . send() and recv() block until the two sides of the object rendezvous, at which point a message is passed from the sender to the receiver. This message may contain data and capabilities. Each thread is associated with a special page of memory called an IPC buffer. The sender populates its own IPC buffer with data and/or CPtrs, and then calls send() with a metadata value called the MessageInfo . The kernel copies data from the sender\'s IPC buffer into that of the receiver, and/or capabilities from the sender\'s CSpace into that of the receiver. The kernel uses the MessageInfo to determine how much data to copy between the two IPC buffers (the length field) and how many CPtrs to read from the IPC buffers for copying betwen CSpaces (the caps_unwrapped and extra_caps fields). Finally, the kernel passes the MessageInfo, and control, to the receiver. In Rust, the sender and receiver can interact with their own IPC buffer using sel4::with_ipc_buffer and sel4::with_ipc_buffer_mut . Message data is held in the message registers (an array of machine words), which is a field of the IPC buffer ( msg_regs and msg_regs_mut ). The length field of the MessageInfo specifies how many message registers will be copied into the receiver\'s IPC buffer. One can also view the message registers as an array of bytes using msg_bytes and msg_bytes_mut . In this case, one rounds the length of their message up to the nearest multiple of the machine word size when computing the message length for the MessageInfo. The MessageInfo also includes a few bits of data called a label ( label_width bits wide) that is not interpreted by the kernel. In Rust, the MessageInfoBuilder type is a clear and concise way to construct a MessageInfo . In Rust, to smooth out differences between the mixed-criticality and legacy kernel schedulers, recv() always takes a reply_authority argument. Under legacy scheduler configurations, which is what this text uses, this argument can be of type (). Taking all of this together, let\'s use our IPC endpoint to send an empty message: workspaces/root-task/spawn-thread/src/main.rs:75:79 after 6.A fn secondary_thread_main(inter_thread_ep: sel4::cap::Endpoint) { sel4::debug_println!(\\"In secondary thread\\"); inter_thread_ep.send(sel4::MessageInfoBuilder::default().label(123).build());\\n} workspaces/root-task/spawn-thread/src/main.rs:81:87 after 6.A fn interact_with_secondary_thread(inter_thread_ep: sel4::cap::Endpoint) { sel4::debug_println!(\\"In primary thread\\"); let (msg_info, _badge) = inter_thread_ep.recv(()); assert_eq!(msg_info.label(), 123);\\n}","breadcrumbs":"Spawning a Thread » Step 6.A","id":"38","title":"Step 6.A"},"39":{"body":"Exercise: use sel4::with_ipc_buffer and sel4::with_ipc_buffer_mut to send a message with some data.","breadcrumbs":"Spawning a Thread » Step 6.B (exercise)","id":"39","title":"Step 6.B (exercise)"},"4":{"body":"If you want help from rust-analyzer , the Rust Language Server, you can use VSCode with the Dev Containers extension . This will enable you to run VSCode inside of the container you just built, which contains the seL4 build artifacts that rust-analyzer will require to analyzer your code. This repository provides a separate Dev Container configuration for each workspace: .devcontainer/root-task/devcontainer.json .devcontainer/microkit/devcontainer.json To work in a particular workspace, open this repository in VSCode, run > Dev Containers: Reopen in Container, and select the corresponding configuration. You should now be able to use the rust-analyzer VSCode extension normally for the code in the selected workspace.","breadcrumbs":"Setup » VSCode + Dev Containers","id":"4","title":"VSCode + Dev Containers"},"40":{"body":"See seL4 Reference Manual § 4.2.4 (Calling and Replying) for a description of the seL4_Call syscall ( Endpoint::call() in Rust). Exercise: Change the inter_thread_ep.send() in secondary_thread_main() to inter_thread_ep.call() and modify interact_with_secondary_thread() to sel4::reply with a message.","breadcrumbs":"Spawning a Thread » Step 6.C (exercise)","id":"40","title":"Step 6.C (exercise)"},"41":{"body":"This final chapter of Part I contains a more open-ended and challenging exercise. We start with an example that spawns an entire new process, which, in the context of low-level seL4 userspace, is often called a task : cd workspaces/root-task/spawn-task\\nmake simulate Similarly to what we saw in Chapter 6 (Spawning a Thread) , the code in this example is more low-level and complex compared to what you have seen in code that leverages . Again, our code here is more like spawning a task using alone. This example consists of two programs. The spawn-task crate is the root task, and the spawn-task-child crate is the child task. The child task does not spawn in any standard sort of environment, so is includes its own ad-hoc Rust language runtime in child/src/runtime.rs , complete with thread-local storage, a global heap allocator, and exception handling. This runtime is built using a few Rust langauge runtime building block crates: sel4-runtime-common sel4-initialize-tls sel4-dlmalloc sel4-stack sel4-panicking sel4-panicking-env This minimal, ad-hoc language runtime is a neat, instructive piece of code. It shows how one can build a new Rust language runtime out of the building blocks provided by the rust-sel4 project. Explore the root task and child task . Right now, all the child task does is send a test message over an endpoint back to the root task. The challenge in this chapter, step 7.E , is to extend the root task so that it sets up the child task to be able to interact with the serial device, and to extend the child task to implement the same echo loop as in [./serial-device.html#step-5h]. Steps 7.A , 7.B , 7.C , and 7.D , which are not exercises, make some incremental extensions towards those goals to help you get started.","breadcrumbs":"Spawning a Task (Challenge) » Spawning a Task (Challenge)","id":"41","title":"Spawning a Task (Challenge)"},"42":{"body":"This step extends the ObjectAllocator type in workspaces/root-task/spawn-task/src/object_allocator.rs after 7.B with the recklessly_allocate_at() method. This method allocates an object according to the blueprint parameter at the given physical address paddr. Instead of just allocating the object from the largest kernel untyped like the allocate() method does, this method searches through the bootinfo to find the initial untyped capability whose corresponding untyped object contains paddr, allocates dummy objects from this untyped object until its watermark reaches paddr, and then allocates the desired object. recklessly_allocate_at()\'s procedure is similar to that which we followed in step 5.C . This implementation is \\"reckless\\" because it modifies the state of the untyped capability it allocates from (allocating from it and changing its watermark) without keeping track of having done so. So, subsequent calls for paddrs contained in the same initial untyped would fail or, worse, misbehave. However, we expect to only need to call it once, so we are okay with this caveat. In step 7.E , you be able to use this method to allocate the serial device MMIO register frame.","breadcrumbs":"Spawning a Task (Challenge) » Step 7.A","id":"42","title":"Step 7.A"},"43":{"body":"This step extends the create_child_vspace() function in workspaces/root-task/spawn-task/src/child_vspace.rs after 7.A to take an extra_frames parameter. create_child_vspace() now maps these extra frames into the child task\'s address space, after the end of the program image, and after the IPC buffer frame. In step 7.E , you be able to use this parameter to pass in the serial device MMIO register frame to mapped into the child task\'s address space.","breadcrumbs":"Spawning a Task (Challenge) » Step 7.B","id":"43","title":"Step 7.B"},"44":{"body":"This step simply copies the Device type from chapter 5 into the child task. In step 7.E , you be able to use this type to interact with the serial device\'s MMIO registers, just like we as part of step 5.E .","breadcrumbs":"Spawning a Task (Challenge) » Step 7.C","id":"44","title":"Step 7.C"},"45":{"body":"This step just adds the SERIAL_DEVICE_MMIO_PADDR and SERIAL_DEVICE_IRQ constants from chapter 5 to the root task.","breadcrumbs":"Spawning a Task (Challenge) » Step 7.D","id":"45","title":"Step 7.D"},"46":{"body":"Exercise: Extend the root task so that it sets up the child task to be able to interact with the serial device, and extend the child task to implement the same echo loop as in [./serial-device.html#step-5h-exercise]. Hint for the root task (click to expand) Try following this sequence of sub-steps: - Allocate serial_device_frame_cap: sel4::cap::Granule using object_allocator.recklessly_allocate_at(). - Map serial_device_frame_cap into the child task\'s address space using create_child_vspace()\'s extra_frames parameter. - Similarly to how we did so in steps 5.F and 5.G , obtain irq_handler_cap: sel4::cap::IrqHandler for SERIAL_DEVICE_IRQ (object_allocator.allocate_slot() might come in handy), allocate irq_nfn_cap: sel4::cap::Notification, and associate irq_nfn_cap with SERIAL_DEVICE_IRQ using irq_handler_cap. - Copy irq_handler_cap and irq_nfn_cap into the child task\'s CSpace in a similar way to how child_tcb and inter_task_ep are copied. Hint for the child task (click to expand) Try following this sequence of sub-steps: - Declare constants IRQ_HANDLER: sel4::cap::IrqHandler and IRQ_NFN: sel4::cap::Notification after OWN_TCB and INTRA_TASK_EP. - Obtain the virtual address of the serial device MMIO frame with addr_of_page_beyond_image(1) (recall how create_child_vspace()\'s extra_frames parameter works). - Initialize the serial device with Device::new() and Device::init() (as we did for part of step 5.E ), and use the serial device just like we did in step 5.H .","breadcrumbs":"Spawning a Task (Challenge) » Step 7.E (challenge)","id":"46","title":"Step 7.E (challenge)"},"47":{"body":"The seL4 Microkit is a framework for creating static systems based on seL4. This part of the text assumes that the reader is familiar with the basics of the Microkit framework and API, or is using a companion resource to learn about the Microkit in parallel. Here are three such resources: The Mirokit manual The Mirokit tutorial This part also assumes that the reader has worked through chapters 2 and 6 of Part I .","breadcrumbs":"Overview » seL4 Microkit","id":"47","title":"seL4 Microkit"},"48":{"body":"Navigate to and run the hello world Microkit example: cd workspaces/microkit/hello-world\\nmake simulate Here is its source: hello-world/pds/hello/src/main.rs:7:22 #![no_std]\\n#![no_main] use sel4_microkit::{debug_println, protection_domain, Handler, Infallible}; #[protection_domain]\\nfn init() -> impl Handler { debug_println!(\\"Hello, World!\\"); HandlerImpl\\n} struct HandlerImpl; impl Handler for HandlerImpl { type Error = Infallible;\\n} The sel4_microkit crate implements a Rust language runtime for Microkit protection domains, and implements the Microkit API. It is written in pure Rust, and does not link against libmicrokit .","breadcrumbs":"Hello, World! » Hello, World!","id":"48","title":"Hello, World!"},"49":{"body":"The #[protection_domain] attribute macro declares a function to be the protection domain\'s initialization function. The entrypoint function must have a signature of the form: fn() -> T\\nwhere T: sel4_microkit::Handler An implementation of the Handler trait is used by the runtime as the event handler for the protection domain\'s main loop. The notified , protected , and fault methods correspond to their equivalents in . The default implementations of these methods just panic. Our event handler, which we\'ve called HandlerImpl, is the simplest possible Handler implementation.","breadcrumbs":"Hello, World! » The Event Handler","id":"49","title":"The Event Handler"},"5":{"body":"Rustdoc for the rust-sel4 project is hosted here: https://sel4.github.io/rust-sel4/ However, for the sake of consistency, rustdoc for the particular configurations studied in this text are hosted here too. There is one set of rustdoc for each of the two workspace configurations mentioned in Two Workspaces . Rustdoc does not generate an index page, but you can navigate across crates within a workspace configuration using the sidebar present on top-level rustdoc page for any module. Rustdoc for Part I Rustdoc for Part II","breadcrumbs":"Setup » Rustdoc","id":"5","title":"Rustdoc"},"50":{"body":"As detailed in its rustdoc, the #[protection_domain] attribute macro takes the same parameters as #[root_task] . Furthermore, the sel4_microkit crate supports all of the same Rust language runtime elements that we explored in Chapter 2 , including sel4_microkit::panicking::catch_unwind() and sel4_microkit::panicking::set_hook() .","breadcrumbs":"Hello, World! » Language Runtime","id":"50","title":"Language Runtime"},"51":{"body":"This chapter covers making and handling protected procedure calls in protection domains written in Rust. Navigate to and run the example: cd workspaces/microkit/ipc\\nmake simulate The example system description specifies two protection domains, with a channel between them: ipc.system:7:20 \\n pds/client/src/main.rs:14:36 const SERVER: Channel = Channel::new(13); #[protection_domain]\\nfn init() -> impl Handler { debug_println!(\\"client: initializing\\"); HandlerImpl\\n} struct HandlerImpl; impl Handler for HandlerImpl { type Error = Infallible; fn notified(&mut self, channels: ChannelSet) -> Result<(), Self::Error> { debug_println!(\\"client: notified by {}\\", channels.display()); if channels.contains(SERVER) { debug_println!(\\"client: TEST_PASS\\"); } Ok(()) }\\n} pds/server/src/main.rs:12:39 const CLIENT: Channel = Channel::new(37); #[protection_domain]\\nfn init() -> impl Handler { debug_println!(\\"server: initializing\\"); debug_println!(\\"server: notifying client\\"); CLIENT.notify(); HandlerImpl\\n} struct HandlerImpl; impl Handler for HandlerImpl { type Error = Infallible; fn protected( &mut self, channel: Channel, msg_info: MessageInfo, ) -> Result { debug_println!(\\"server: called by {:?}\\", channel); todo!() }\\n} The Channel type is the Rust equivalent of the microkit_channel type alias in libmicrokit. Note how the functionality corresponding to libmicrokit\'s microkit_notify, microkit_irq_ack, and microkit_ppcall is implemented in methods for Channel. The MessageInfo type is the Rust equivalent of the microkit_msginfo type alias in libmicrokit. Just as microkit_msginfo is an alias for seL4_MessageInfo_t, sel4_microkit::MessageInfo is just a thin wrapper around MessageInfo . libmicrokit has microkit_mr_set() and microkit_mr_get() for interacting with the IPC buffer. In the sel4_microkit crate, we have get_mr() and set_mr() , but we also have with_msg_regs() , with_msg_regs_mut() , with_msg_bytes() , and with_msg_bytes_mut() , which use sel4::with_ipc_buffer() and sel4::with_ipc_buffer_mut() under the hood.","breadcrumbs":"IPC » IPC","id":"51","title":"IPC"},"52":{"body":"Exercise: In the client\'s notified() handler, make a protected procedure call to the server using SERVER.pp_call(). Handle the call in the server\'s protected() handler. Include data in the message using sel4_microkit::with_msg_regs{,_mut}. Exercise (optional): Send something more interesting over IPC using msg_bytes and msg_bytes_mut . For example, the zerocopy crate can be used to view certain types as bytes and vice versa, and the lightweight postcard crate can be used to serialize and deserialize a wider range of types using serde .","breadcrumbs":"IPC » Step 10.A (exercise)","id":"52","title":"Step 10.A (exercise)"},"53":{"body":"This chapter covers interacting with shared memory from protection domains written in Rust. Navigate to and run the example: cd workspaces/microkit/shared-memory\\nmake simulate The example system description specifies two protection domains which share two memory regions: shared-memory.system:7:28 \\n The Microkit tool will inject memory region virtual addresses into protection domain images according to the setvar_vaddr attribute values. For example, the virtual address of the mapping of region_a into the client protection domain will be injected into the microkit-shared-memory-client.elf image at the location specified by then region_a_vaddr symbol. In the case of Rust, declaring a symbol that the Microkit tool can patch requires a bit more intentionality than in the C case. The sel4_microkit::var! macro is provided to declare such symbols. The var! macro\'s implementation is just a few lines of code. We want to express this symbol as a global variable that does not change at runtime, but which cannot be assumed to have the value we assign it at compile time, and which must not be optimized away. The near-trivial sel4_immutable_cell::ImmutableCell type encapsulates this pattern. The #[no_mangle] attribute instructs the compiler to use the name of the variable as the name of the symbol. This is the default in C, but not Rust. We direct the compiler to put this symbol in the .data section with #[link_section = \\".data\\"] to ensure that space is allocated for it in the ELF file itself, not just the program image it describes. So far, the example protection domains just store pointers to the shared memory regions in their handler state: pds/client/src/main.rs:17:31 fn init() -> impl Handler { debug_println!(\\"client: initializing\\"); let region_a = *var!(region_a_vaddr: usize = 0); let region_b = *var!(region_b_vaddr: usize = 0); debug_println!(\\"client: region_a = {region_a:#x?}\\"); debug_println!(\\"client: region_b = {region_b:#x?}\\"); let _ = SERVER.pp_call(MessageInfo::default()); debug_println!(\\"TEST_PASS\\"); NullHandler::new()\\n} pds/server/src/main.rs:17:46 fn init() -> impl Handler { debug_println!(\\"server: initializing\\"); let region_a = *var!(region_a_vaddr: usize = 0); let region_b = *var!(region_b_vaddr: usize = 0); debug_println!(\\"server: region_a = {region_a:#x?}\\"); debug_println!(\\"server: region_b = {region_b:#x?}\\"); HandlerImpl { region_a, region_b }\\n} struct HandlerImpl { region_a: usize, region_b: usize,\\n} impl Handler for HandlerImpl { type Error = Infallible; fn protected( &mut self, channel: Channel, _msg_info: MessageInfo, ) -> Result { assert_eq!(channel, CLIENT); Ok(MessageInfo::default()) }\\n}","breadcrumbs":"Shared Memory » Shared Memory","id":"53","title":"Shared Memory"},"54":{"body":"Let\'s assign types to these shared memory regions. We can define our types in a crate that both the client and server can use: pds/common/src/lib.rs:9:18 use zerocopy::{FromBytes, IntoBytes}; pub const REGION_A_SIZE: usize = 1337; #[repr(C)]\\n#[derive(IntoBytes, FromBytes)]\\npub struct RegionB { pub field_1: u64, pub foo: [u16; 16],\\n} Suppose region_a: [u8; REGION_A_SIZE] and region_b: RegionB. You could just turn the virtual addresses we get in our var! symbols into pointers and start interacting with the shared memory regions with unsafe ptr::* operations, but we can leverage the Rust type system to come up with a solution that only requires unsafe at initialization time.","breadcrumbs":"Shared Memory » Step 11.A","id":"54","title":"Step 11.A"},"55":{"body":"The sel4-shared-memory crate provides a way for you to declare a memory region\'s type and bounds, along with the memory access operations that can safely be used on it, so that you can access it without unsafe code. That initial declaration is, however, unsafe. The sel4-shared-memory is a thin wrapper around the sel4_abstract_ptr crate, instantiating its abstract pointer types with memory access operations suitable for memory that is shared with another protection domain. The sel4_microkit::memory_region_symbol! macro is like the sel4_microkit::var! macro, except specialized for shared memory region virtual address symbols. For one, the underlying symbol is always of type usize and the macro returns a value of type NonNull<_>. memory_region_symbol! has a few additional features. For example, memory_region_symbol!(foo: *mut [u8] n = BAR) returns a NonNull<[u8]> with a runtime slice length of BAR. See this step\'s diff for how to put this all together.","breadcrumbs":"Shared Memory » Step 11.B","id":"55","title":"Step 11.B"},"6":{"body":"After initializing itself, the seL4 kernel passes control to a userspace program called the root task, whose image is provided to the kernel at boot-time. The root task\'s capability space contains capabilities for all memory and boot-time objects. That is to say, the root task spawns with the maximum privilege that a userspace program can have. The kernel provides the root task with a map of its initial capability space in the form of the BootInfo frame . You can read more about the root task\'s environment in seL4 Reference Manual § 9.1 . Part I of this tutorial will focus on writing from-scratch root tasks in Rust. Some of the code in Part I will be quite low-level, interacting with the language runtime, the linker, and some of the finer details related to bootstrapping an seL4-based system. The only seL4-related crates we will be using are the language runtime and bindings for the seL4 API. Unlike situations where higher-level seL4-related libraries (such as seL4_libs ) are used, we will be allocating objects and manage virtual address spaces from scratch. At boot time, the seL4 kernel and root task are loaded into memory by a kind of bootloader stub referred to as a seL4 kernel loader. For Part I, we will use the kernel loader from the rust-sel4 project . We won\'t cover how it works or how to use it explicitly in this text. It is built at docker/Dockerfile:94:108 , and used at mk/root-task.mk:31:36 .","breadcrumbs":"Overview » The Root Task","id":"6","title":"The Root Task"},"7":{"body":"Run the hello world example: cd workspaces/root-task/hello-world\\nmake simulate Press ctrl-a x to exit QEMU. Here is its source: hello-world/src/main.rs:7:17 #![no_std]\\n#![no_main] use sel4_root_task::root_task; #[root_task]\\nfn main(_bootinfo: &sel4::BootInfoPtr) -> ! { sel4::debug_println!(\\"Hello, World!\\"); sel4::init_thread::suspend_self()\\n} The Rust standard library is divided into three layers: core : dependency-free foundation alloc : implements heap-backed data structures, but requires a runtime that provides a heap allocator std includes core and alloc, and adds APIs that depend on OS services such as networking and filesystems The high-level std doesn\'t support the low-level seL4 root task target. #![no_std] declares that this crate does not depend on std, and prevents rustc from automatically importing it. Our language runtime will handle the program\'s entrypoint differently than a typical Rust program. #![no_main] informs rustc of this fact. The sel4 crate binds the seL4 API. It is generated from source (.xml, .bf, and .h) in libsel4. We will cover the contents of this crate in future chapters. The sel4_root_task crate implements a Rust language runtime for the root task environment. The #[root_task] attribute macro declares a function to be the root task\'s entrypoint. The entrypoint function must have a signature of the form: fn(&sel4::BootInfoPtr) -> T\\nwhere T: sel4_root_task::Termination (Rustdoc for BootInfoPtr and Termination ) The root task has no way to exit, so, to terminate cleanly, it must suspend its own thread. sel4::init_thread::suspend_self() does exactly this.","breadcrumbs":"Hello, World! » Hello, World!","id":"7","title":"Hello, World!"},"8":{"body":"Exercise: Cause a panic.","breadcrumbs":"Hello, World! » Step 2.A (exercise)","id":"8","title":"Step 2.A (exercise)"},"9":{"body":"Exercise: Catch the panic using sel4_root_task::panicking::catch_unwind() .","breadcrumbs":"Hello, World! » Step 2.B (exercise)","id":"9","title":"Step 2.B (exercise)"}},"length":56,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"0":{"1":{"6":{"df":0,"docs":{},"x":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":2,"docs":{"25":{"tf":1.0},"53":{"tf":2.0}},"x":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"0":{"0":{"1":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"0":{"0":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"25":{"tf":1.0}}}},"f":{"0":{"0":{"d":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"1":{"0":{".":{"a":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"a":{"df":1,"docs":{"54":{"tf":1.0}}},"b":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"3":{"df":1,"docs":{"38":{"tf":1.0}}},"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"3":{"3":{"7":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"df":3,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.4142135623730951}}},"4":{"df":1,"docs":{"16":{"tf":1.0}}},"5":{"df":1,"docs":{"16":{"tf":1.0}}},"6":{"df":1,"docs":{"54":{"tf":1.0}}},"df":2,"docs":{"18":{"tf":1.0},"31":{"tf":1.4142135623730951}}},"2":{".":{"3":{"df":1,"docs":{"15":{"tf":1.0}}},"4":{".":{"1":{"df":1,"docs":{"18":{"tf":1.0}}},"2":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}},"df":3,"docs":{"16":{"tf":1.0},"18":{"tf":1.0},"30":{"tf":1.0}}},"a":{"df":1,"docs":{"8":{"tf":1.0}}},"b":{"df":1,"docs":{"9":{"tf":1.0}}},"c":{"df":1,"docs":{"10":{"tf":1.0}}},"d":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"12":{"tf":1.0}}},"f":{"df":1,"docs":{"13":{"tf":1.0}}},"g":{"df":1,"docs":{"14":{"tf":1.7320508075688772}}}},"7":{"df":1,"docs":{"16":{"tf":1.0}}},"df":3,"docs":{"16":{"tf":1.0},"47":{"tf":1.0},"50":{"tf":1.0}}},"3":{".":{"a":{"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"b":{"df":1,"docs":{"17":{"tf":1.4142135623730951}}},"c":{"df":1,"docs":{"18":{"tf":2.23606797749979}}},"d":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}},"f":{"df":1,"docs":{"21":{"tf":1.0}}},"g":{"df":1,"docs":{"22":{"tf":1.0}}}},"3":{"df":1,"docs":{"28":{"tf":1.0}}},"7":{"df":2,"docs":{"12":{"tf":1.0},"13":{"tf":1.0}}},"df":1,"docs":{"24":{"tf":1.0}}},"4":{".":{"2":{".":{"4":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"38":{"tf":1.0}}},"a":{"df":1,"docs":{"24":{"tf":1.0}}},"b":{"df":2,"docs":{"25":{"tf":1.7320508075688772},"33":{"tf":1.0}}},"c":{"df":2,"docs":{"26":{"tf":1.7320508075688772},"33":{"tf":1.0}}},"d":{"df":2,"docs":{"27":{"tf":1.0},"33":{"tf":1.0}}},"df":0,"docs":{}},"0":{"9":{"6":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"38":{"tf":1.0}}},"5":{".":{"a":{"df":1,"docs":{"29":{"tf":1.7320508075688772}}},"b":{"df":1,"docs":{"30":{"tf":1.0}}},"c":{"df":2,"docs":{"31":{"tf":1.7320508075688772},"42":{"tf":1.0}}},"d":{"df":1,"docs":{"32":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":3,"docs":{"33":{"tf":1.4142135623730951},"44":{"tf":1.0},"46":{"tf":1.0}}},"f":{"df":2,"docs":{"34":{"tf":1.0},"46":{"tf":1.0}}},"g":{"df":2,"docs":{"35":{"tf":1.0},"46":{"tf":1.0}}},"h":{"df":2,"docs":{"36":{"tf":1.0},"46":{"tf":1.0}}}},"2":{"5":{"3":{"df":0,"docs":{},"e":{"d":{"c":{"1":{"df":0,"docs":{},"e":{"d":{"1":{"2":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"20":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0}},"h":{"df":2,"docs":{"41":{"tf":1.0},"46":{"tf":1.0}}}},"6":{".":{"a":{"df":1,"docs":{"38":{"tf":1.7320508075688772}}},"b":{"df":1,"docs":{"39":{"tf":1.0}}},"c":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"41":{"tf":1.0},"47":{"tf":1.0}}},"7":{".":{"1":{".":{"3":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":3,"docs":{"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0}}},"b":{"df":3,"docs":{"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0}}},"c":{"df":2,"docs":{"41":{"tf":1.0},"44":{"tf":1.0}}},"d":{"df":2,"docs":{"41":{"tf":1.0},"45":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":5,"docs":{"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.0}}}},"df":0,"docs":{}},"8":{"c":{"a":{"0":{"df":0,"docs":{},"e":{"1":{"9":{"3":{"9":{"d":{"c":{"1":{".":{".":{"5":{"2":{"5":{"3":{"df":0,"docs":{},"e":{"d":{"c":{"1":{"df":0,"docs":{},"e":{"d":{"1":{"2":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"1":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"1":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"b":{"a":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}}}},"df":2,"docs":{"33":{"tf":1.0},"53":{"tf":1.0}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"18":{"tf":1.0}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"a":{".":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{".":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"55":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"13":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":6,"docs":{"15":{"tf":1.4142135623730951},"20":{"tf":1.0},"26":{"tf":1.0},"28":{"tf":1.0},"34":{"tf":1.0},"55":{"tf":1.7320508075688772}}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"18":{"tf":1.0},"42":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"d":{"d":{"df":6,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"17":{"tf":1.0},"29":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"2":{"tf":1.0},"55":{"tf":1.0}}}},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"1":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":1,"docs":{"26":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":17,"docs":{"15":{"tf":1.4142135623730951},"18":{"tf":2.23606797749979},"23":{"tf":3.0},"25":{"tf":1.0},"26":{"tf":1.4142135623730951},"28":{"tf":1.4142135623730951},"30":{"tf":2.0},"31":{"tf":1.4142135623730951},"32":{"tf":1.0},"33":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"54":{"tf":1.0},"55":{"tf":1.0},"6":{"tf":1.0}}}}}}},"df":1,"docs":{"41":{"tf":1.4142135623730951}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"18":{"tf":1.0},"31":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"41":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"51":{"tf":1.7320508075688772}},"s":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"(":{"4":{"0":{"9":{"6":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"18":{"tf":1.0},"25":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":16,"docs":{"13":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":2.6457513110645907},"20":{"tf":1.4142135623730951},"24":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":2.0},"31":{"tf":1.4142135623730951},"32":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":2.8284271247461903},"46":{"tf":1.4142135623730951},"53":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.7320508075688772}}},"df":0,"docs":{},"w":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"37":{"tf":1.0},"41":{"tf":1.0}},"g":{"df":3,"docs":{"26":{"tf":1.0},"30":{"tf":1.0},"55":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":2,"docs":{"18":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"31":{"tf":1.0},"38":{"tf":1.0},"55":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"df":1,"docs":{"4":{"tf":2.0}}}}}},"d":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"38":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"55":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"i":{"df":8,"docs":{"0":{"tf":2.449489742783178},"23":{"tf":1.4142135623730951},"30":{"tf":1.0},"34":{"tf":1.0},"47":{"tf":1.0},"48":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}},"r":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":2.23606797749979}},"e":{"\'":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"\'":{"df":0,"docs":{},"t":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"15":{"tf":1.0},"31":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"!":{"(":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"38":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"a":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"32":{"tf":1.0}}}}},"df":1,"docs":{"32":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"53":{"tf":1.0},"54":{"tf":1.0}}}}},"o":{"c":{"df":1,"docs":{"15":{"tf":1.0}},"i":{"df":8,"docs":{"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"23":{"tf":1.0},"34":{"tf":1.4142135623730951},"35":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0},"46":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"2":{"tf":1.0},"47":{"tf":1.4142135623730951},"53":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"27":{"tf":1.0}},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":6,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"49":{"tf":1.0},"50":{"tf":1.0},"53":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"15":{"tf":1.0},"34":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}}},"b":{"\\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"a":{"c":{"df":0,"docs":{},"k":{"df":4,"docs":{"26":{"tf":1.4142135623730951},"30":{"tf":1.7320508075688772},"41":{"tf":1.0},"7":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"20":{"tf":2.6457513110645907}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"55":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"16":{"tf":1.0},"20":{"tf":1.0},"28":{"tf":1.0},"47":{"tf":1.0},"6":{"tf":1.0}}},"i":{"c":{"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"38":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"3":{"tf":1.0},"30":{"tf":1.0},"38":{"tf":1.7320508075688772},"51":{"tf":1.0}}}},"n":{"df":1,"docs":{"38":{"tf":1.0}}}}}}},"f":{"df":1,"docs":{"7":{"tf":1.0}}},"i":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"0":{"tf":1.7320508075688772},"34":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":5,"docs":{"16":{"tf":2.8284271247461903},"18":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.4142135623730951},"53":{"tf":1.0}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"37":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"6":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"17":{"tf":1.0}},"e":{"d":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{")":{".":{"c":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"17":{"tf":1.4142135623730951},"29":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":9,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"23":{"tf":1.0},"26":{"tf":1.4142135623730951},"29":{"tf":1.4142135623730951},"30":{"tf":1.0},"42":{"tf":1.0},"6":{"tf":1.0}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"13":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.0},"54":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"38":{"tf":2.8284271247461903},"43":{"tf":1.0},"51":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"df":6,"docs":{"14":{"tf":1.4142135623730951},"2":{"tf":2.0},"28":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.7320508075688772}}},"df":0,"docs":{},"t":{"df":4,"docs":{"2":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0},"6":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":4,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"38":{"tf":1.0},"52":{"tf":1.0}}}}}},"c":{"a":{"b":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"15":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"d":{"=":{"\\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"53":{"tf":2.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":15,"docs":{"1":{"tf":1.0},"15":{"tf":2.23606797749979},"18":{"tf":1.0},"20":{"tf":2.0},"23":{"tf":1.0},"32":{"tf":1.0},"34":{"tf":1.0},"38":{"tf":2.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"49":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"6":{"tf":1.0}}}},"p":{"\'":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}},":":{":":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"15":{"tf":1.0},"18":{"tf":1.0},"23":{"tf":1.0}},"y":{"\'":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{}}}}}},"l":{"df":12,"docs":{"15":{"tf":3.0},"16":{"tf":1.0},"18":{"tf":3.3166247903554},"20":{"tf":2.8284271247461903},"23":{"tf":1.0},"26":{"tf":1.7320508075688772},"27":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":2.6457513110645907},"38":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":3,"docs":{"15":{"tf":1.0},"18":{"tf":1.0},"31":{"tf":1.7320508075688772}},"s":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{":":{"8":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"3":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"3":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"15":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"13":{"tf":1.0},"18":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0},"53":{"tf":1.4142135623730951}}},"t":{"df":1,"docs":{"18":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":3,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"8":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}},"d":{"df":10,"docs":{"1":{"tf":1.0},"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":1.0},"48":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}}},"df":4,"docs":{"2":{"tf":1.7320508075688772},"26":{"tf":1.0},"33":{"tf":1.0},"53":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"18":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"41":{"tf":1.7320508075688772},"46":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"g":{"df":4,"docs":{"38":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"53":{"tf":1.0}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"1":{"3":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}},"3":{"7":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"51":{"tf":3.3166247903554},"53":{"tf":2.0}},"s":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"51":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"51":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"\'":{"df":3,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0}}},"df":12,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"45":{"tf":1.0},"47":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"41":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"t":{"c":{"b":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":5,"docs":{"31":{"tf":1.0},"41":{"tf":2.6457513110645907},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"46":{"tf":2.23606797749979}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"7":{"tf":1.0}}}}},"r":{"df":3,"docs":{"20":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"1":{"tf":1.0},"46":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"\'":{"df":1,"docs":{"52":{"tf":1.0}}},".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.4142135623730951}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.0}}}}}}}}},"df":3,"docs":{"51":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}},"p":{"b":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}}}}},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{".":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{".":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"15":{"tf":1.0},"18":{"tf":2.8284271247461903},"20":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"d":{"df":0,"docs":{},"e":{"df":10,"docs":{"1":{"tf":2.0},"24":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"41":{"tf":2.0},"53":{"tf":1.0},"55":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":3,"docs":{"13":{"tf":1.0},"46":{"tf":1.0},"54":{"tf":1.0}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":2.449489742783178}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"41":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"38":{"tf":1.4142135623730951}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}}}}}},"r":{"df":2,"docs":{"20":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"53":{"tf":1.7320508075688772}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}},"x":{"df":1,"docs":{"41":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"34":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"38":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"3":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"3":{"tf":1.4142135623730951},"38":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.7320508075688772}}}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"41":{"tf":1.0},"5":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"33":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"18":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}}}},"df":4,"docs":{"25":{"tf":1.0},"28":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"54":{"tf":1.0}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"1":{"tf":1.0},"15":{"tf":1.0},"18":{"tf":1.0},"2":{"tf":2.0},"20":{"tf":1.0},"26":{"tf":1.0},"30":{"tf":1.7320508075688772},"31":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":2.6457513110645907},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"15":{"tf":1.0},"18":{"tf":1.4142135623730951},"41":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":4,"docs":{"34":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0},"6":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"i":{"df":4,"docs":{"1":{"tf":1.0},"38":{"tf":2.0},"44":{"tf":1.0},"46":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"15":{"tf":1.0},"7":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":10,"docs":{"1":{"tf":1.0},"15":{"tf":1.0},"23":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"27":{"tf":1.0},"30":{"tf":1.0},"4":{"tf":1.0},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":7,"docs":{"0":{"tf":1.7320508075688772},"25":{"tf":1.0},"31":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"15":{"tf":1.4142135623730951},"18":{"tf":2.6457513110645907},"38":{"tf":1.4142135623730951}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":16,"docs":{"13":{"tf":1.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.0},"23":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"37":{"tf":1.0},"41":{"tf":1.7320508075688772},"48":{"tf":1.0},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.4142135623730951},"54":{"tf":1.0},"55":{"tf":1.4142135623730951},"6":{"tf":1.0},"7":{"tf":2.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":9,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"30":{"tf":1.4142135623730951},"34":{"tf":1.4142135623730951},"35":{"tf":1.4142135623730951},"47":{"tf":1.0}},"e":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"v":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"43":{"tf":1.4142135623730951}},"e":{"(":{")":{"\'":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"29":{"tf":1.0}}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"\'":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}},"df":7,"docs":{"15":{"tf":1.4142135623730951},"18":{"tf":3.0},"20":{"tf":1.0},"23":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.4142135623730951},"46":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"2":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"31":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"15":{"tf":1.4142135623730951},"18":{"tf":2.449489742783178},"20":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"10":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":6,"docs":{"36":{"tf":1.0},"38":{"tf":2.449489742783178},"39":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.4142135623730951},"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\\"":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"51":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"48":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"51":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"53":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"46":{"tf":1.0},"49":{"tf":1.0},"53":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":5,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"49":{"tf":1.0},"53":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"26":{"tf":1.0},"54":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"34":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"14":{"tf":1.0},"3":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"15":{"tf":1.0},"2":{"tf":1.0},"23":{"tf":1.0},"37":{"tf":1.0},"7":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"s":{"c":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":2,"docs":{"17":{"tf":1.4142135623730951},"29":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"i":{"b":{"df":4,"docs":{"16":{"tf":1.4142135623730951},"20":{"tf":1.0},"38":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":3,"docs":{"40":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"18":{"tf":1.0},"31":{"tf":1.0},"42":{"tf":1.0}}}},"t":{"_":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":4,"docs":{"0":{"tf":1.0},"18":{"tf":1.0},"50":{"tf":1.0},"6":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"26":{"tf":1.0},"38":{"tf":1.0}}}}}}}},"v":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"4":{"tf":2.0}},"i":{"c":{"df":10,"docs":{"16":{"tf":3.1622776601683795},"28":{"tf":1.7320508075688772},"30":{"tf":2.0},"31":{"tf":1.0},"36":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":2.0}},"e":{"\'":{"df":4,"docs":{"28":{"tf":1.7320508075688772},"30":{"tf":1.0},"33":{"tf":1.0},"44":{"tf":1.0}}},".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"41":{"tf":1.0},"46":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"r":{"df":1,"docs":{"28":{"tf":1.0}}}},"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"0":{"2":{":":{"1":{"0":{"8":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"1":{"6":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"1":{"8":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"2":{":":{"2":{"7":{"df":1,"docs":{"29":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"4":{":":{"4":{"4":{"df":1,"docs":{"29":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"3":{":":{"4":{"9":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"8":{":":{"9":{"7":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{":":{"7":{"3":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{".":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"46":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"31":{"tf":1.0},"32":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{".":{"df":0,"docs":{},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"55":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"38":{"tf":1.0},"7":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"34":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"3":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"c":{"df":1,"docs":{"3":{"tf":1.0}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"2":{"tf":1.0}},"e":{":":{"9":{"4":{":":{"1":{"0":{"8":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"2":{"tf":2.23606797749979}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"\'":{"df":0,"docs":{},"t":{"df":3,"docs":{"0":{"tf":1.0},"28":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"\'":{"df":1,"docs":{"49":{"tf":1.4142135623730951}}},"df":5,"docs":{"0":{"tf":1.4142135623730951},"48":{"tf":1.0},"51":{"tf":1.4142135623730951},"53":{"tf":2.23606797749979},"55":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"\'":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"42":{"tf":1.0}}}},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{":":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{":":{":":{"c":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"18":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":2,"docs":{"31":{"tf":1.4142135623730951},"42":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":8,"docs":{"1":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"18":{"tf":1.0},"23":{"tf":1.0},"3":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":4,"docs":{"28":{"tf":1.0},"36":{"tf":1.0},"41":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"16":{"tf":1.0},"18":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"50":{"tf":1.0}}}}}}},"f":{"df":1,"docs":{"53":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":7,"docs":{"15":{"tf":1.0},"18":{"tf":1.4142135623730951},"20":{"tf":1.0},"23":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"38":{"tf":1.0}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"18":{"tf":1.0},"29":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"18":{"tf":1.0},"31":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"4":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"18":{"tf":1.4142135623730951},"53":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}}}},"d":{"df":5,"docs":{"1":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"51":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"38":{"tf":2.0},"41":{"tf":1.0}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"15":{"tf":1.0},"53":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"41":{"tf":1.0}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"49":{"tf":1.0},"7":{"tf":1.7320508075688772}}}}}}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.0}}}}}},"v":{"df":1,"docs":{"41":{"tf":1.0}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"14":{"tf":1.0},"3":{"tf":1.4142135623730951},"41":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"49":{"tf":1.0},"51":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"48":{"tf":1.0},"51":{"tf":1.4142135623730951},"53":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"49":{"tf":1.7320508075688772}}}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"25":{"tf":1.0},"7":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":15,"docs":{"1":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.0},"15":{"tf":1.4142135623730951},"18":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":2.0},"41":{"tf":1.7320508075688772},"48":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"53":{"tf":2.0},"55":{"tf":1.0},"7":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"41":{"tf":1.0},"55":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":25,"docs":{"1":{"tf":2.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"19":{"tf":1.4142135623730951},"20":{"tf":2.0},"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"27":{"tf":1.4142135623730951},"30":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":1.4142135623730951},"35":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951},"37":{"tf":1.0},"39":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"52":{"tf":1.7320508075688772},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}},"t":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}},"p":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"1":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"23":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"37":{"tf":1.4142135623730951},"41":{"tf":1.0},"50":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":6,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"17":{"tf":1.0},"24":{"tf":1.0},"27":{"tf":1.0},"53":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":2,"docs":{"4":{"tf":1.4142135623730951},"41":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":1,"docs":{"10":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":1,"docs":{"26":{"tf":1.0}}}}},"r":{"a":{"_":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"43":{"tf":1.0},"46":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":1,"docs":{"43":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"18":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"21":{"tf":1.0},"42":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.4142135623730951},"29":{"tf":1.0},"47":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"df":5,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":1.0},"53":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"49":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"df":0,"docs":{},"w":{"df":5,"docs":{"37":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.0},"53":{"tf":1.0},"55":{"tf":1.0}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"1":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"38":{"tf":2.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":2,"docs":{"3":{"tf":1.0},"53":{"tf":1.0}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"(":{"_":{"df":0,"docs":{},"i":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"28":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.0}}}},"d":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.4142135623730951}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"17":{"tf":1.0},"26":{"tf":1.0},"42":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"34":{"tf":1.0}},"r":{"df":1,"docs":{"6":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"28":{"tf":1.0},"29":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"n":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{":":{":":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":11,"docs":{"17":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"37":{"tf":1.4142135623730951},"38":{"tf":1.4142135623730951},"48":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":2.0},"53":{"tf":1.7320508075688772},"7":{"tf":1.0}}},"o":{"c":{"df":0,"docs":{},"u":{"df":2,"docs":{"23":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":5,"docs":{"32":{"tf":1.0},"34":{"tf":1.0},"37":{"tf":1.0},"42":{"tf":1.0},"46":{"tf":1.4142135623730951}}}}}},"o":{"df":1,"docs":{"54":{"tf":1.0}}},"r":{"df":0,"docs":{},"m":{"df":4,"docs":{"15":{"tf":1.0},"49":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}},"df":11,"docs":{"16":{"tf":1.4142135623730951},"23":{"tf":2.23606797749979},"24":{"tf":1.7320508075688772},"26":{"tf":1.4142135623730951},"30":{"tf":1.7320508075688772},"31":{"tf":1.7320508075688772},"32":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.7320508075688772},"46":{"tf":1.0},"6":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"a":{"df":1,"docs":{"31":{"tf":1.0}}},"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"31":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":3,"docs":{"16":{"tf":1.0},"18":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"o":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":8,"docs":{"17":{"tf":1.0},"26":{"tf":1.4142135623730951},"31":{"tf":1.0},"37":{"tf":1.0},"43":{"tf":1.0},"49":{"tf":1.7320508075688772},"51":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}}}},"d":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"30":{"tf":1.0},"50":{"tf":1.0}}}}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"15":{"tf":1.0},"30":{"tf":1.4142135623730951},"5":{"tf":1.0},"7":{"tf":1.0}}}}},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"r":{"df":1,"docs":{"51":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"(":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":2.0}},"h":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"26":{"tf":1.0}},"n":{"df":5,"docs":{"23":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":1.0},"34":{"tf":1.0},"42":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"41":{"tf":1.0},"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"23":{"tf":1.0},"28":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"34":{"tf":1.0}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":1,"docs":{"25":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"s":{"df":2,"docs":{"25":{"tf":2.0},"26":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"46":{"tf":1.0}}},"l":{"df":4,"docs":{"41":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"48":{"tf":1.7320508075688772},"49":{"tf":2.23606797749979},"51":{"tf":2.0},"52":{"tf":1.4142135623730951},"53":{"tf":2.0}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"48":{"tf":1.7320508075688772},"49":{"tf":1.0},"51":{"tf":2.449489742783178},"53":{"tf":1.7320508075688772}}}}}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"r":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":1,"docs":{"7":{"tf":1.0}},"e":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"13":{"tf":1.7320508075688772}}}}}},"df":3,"docs":{"13":{"tf":1.7320508075688772},"41":{"tf":1.0},"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":4,"docs":{"14":{"tf":1.4142135623730951},"33":{"tf":1.0},"48":{"tf":1.7320508075688772},"7":{"tf":1.7320508075688772}}}},"p":{"df":2,"docs":{"4":{"tf":1.0},"41":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":7,"docs":{"27":{"tf":1.4142135623730951},"37":{"tf":1.0},"41":{"tf":1.0},"47":{"tf":1.0},"48":{"tf":1.0},"5":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"23":{"tf":1.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"28":{"tf":1.0},"37":{"tf":1.0},"6":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"1":{"tf":1.0},"27":{"tf":1.0},"46":{"tf":1.4142135623730951}}}}},"o":{"c":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}},"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"31":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}},"o":{"d":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":1,"docs":{"10":{"tf":1.7320508075688772}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"36":{"tf":1.0}}},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"5":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{".":{"df":1,"docs":{"20":{"tf":1.0}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}}}},"d":{"=":{"\\"":{"1":{"3":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}},"3":{"7":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":3,"docs":{"26":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"i":{"df":2,"docs":{"0":{"tf":1.0},"5":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"g":{"df":6,"docs":{"2":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"43":{"tf":1.0},"53":{"tf":1.7320508075688772},"6":{"tf":1.0}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"48":{"tf":1.4142135623730951},"51":{"tf":2.0},"53":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":11,"docs":{"0":{"tf":1.0},"18":{"tf":1.0},"28":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":1.4142135623730951},"49":{"tf":1.7320508075688772},"51":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"7":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":8,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"3":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.0},"50":{"tf":1.0},"52":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"x":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"17":{"tf":1.0},"18":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"48":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"53":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":4,"docs":{"18":{"tf":1.4142135623730951},"3":{"tf":1.0},"30":{"tf":1.0},"7":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"48":{"tf":1.0},"51":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951}},"i":{"df":15,"docs":{"12":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"18":{"tf":1.0},"26":{"tf":1.0},"30":{"tf":1.4142135623730951},"37":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"46":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"54":{"tf":1.0},"55":{"tf":1.0},"6":{"tf":1.4142135623730951}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"28":{"tf":1.0},"36":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":2,"docs":{"2":{"tf":1.7320508075688772},"4":{"tf":1.0}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"2":{"tf":1.0}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"21":{"tf":1.0},"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"1":{"tf":1.0},"41":{"tf":1.0},"53":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"34":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},"r":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"46":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{".":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"df":1,"docs":{"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"(":{"1":{"2":{"3":{")":{".":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":2,"docs":{"38":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":1,"docs":{"38":{"tf":1.0}}}},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"37":{"tf":1.0},"38":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"37":{"tf":1.0},"38":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"38":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"a":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"38":{"tf":1.0}}}},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":3,"docs":{"37":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":12,"docs":{"25":{"tf":1.0},"28":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"28":{"tf":1.0},"37":{"tf":1.0},"52":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.0}}}}}}}}}},"f":{"a":{"c":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.7320508075688772},"38":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":3,"docs":{"28":{"tf":1.0},"34":{"tf":2.8284271247461903},"36":{"tf":2.23606797749979}}}}}}}},"o":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"a":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"46":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":2,"docs":{"0":{"tf":1.0},"38":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"15":{"tf":1.0},"18":{"tf":1.4142135623730951},"3":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":3,"docs":{"15":{"tf":1.0},"18":{"tf":1.0},"38":{"tf":1.0}}}}}},"p":{"c":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{"7":{":":{"2":{"0":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":5,"docs":{"37":{"tf":1.0},"38":{"tf":3.4641016151377544},"43":{"tf":1.0},"51":{"tf":2.0},"52":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"q":{"_":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"46":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"q":{"_":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":1,"docs":{"46":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"46":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"46":{"tf":1.0}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"34":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":3,"docs":{"34":{"tf":2.0},"35":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"n":{"\'":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"17":{"tf":1.0},"18":{"tf":1.0},"29":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"53":{"tf":1.0},"6":{"tf":1.0}}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"31":{"tf":1.0},"42":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"\'":{"df":1,"docs":{"15":{"tf":1.0}}},"df":13,"docs":{"15":{"tf":3.1622776601683795},"16":{"tf":2.23606797749979},"18":{"tf":1.4142135623730951},"23":{"tf":1.0},"24":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0},"34":{"tf":1.0},"38":{"tf":2.23606797749979},"42":{"tf":1.0},"6":{"tf":2.449489742783178}}}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"38":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"38":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"41":{"tf":1.0}}}}},"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":8,"docs":{"0":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.7320508075688772},"48":{"tf":1.0},"50":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"18":{"tf":1.4142135623730951},"29":{"tf":1.0},"30":{"tf":1.0},"35":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"df":2,"docs":{"17":{"tf":1.0},"42":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"20":{"tf":1.0},"30":{"tf":1.0}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}}}},"v":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{},"g":{"a":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"38":{"tf":2.0},"55":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"34":{"tf":1.0}}}},"t":{"\'":{"df":4,"docs":{"25":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.0},"54":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}}}}}}}},"df":9,"docs":{"23":{"tf":1.4142135623730951},"28":{"tf":1.0},"3":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951}}},"r":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"18":{"tf":1.0},"41":{"tf":1.0},"54":{"tf":1.0}}}},"df":0,"docs":{}}}}},"i":{"b":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"\'":{"df":1,"docs":{"51":{"tf":1.0}}},"df":2,"docs":{"48":{"tf":1.0},"51":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"37":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{"df":2,"docs":{"3":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":1,"docs":{"53":{"tf":1.0}}},"k":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":3,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"48":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"26":{"tf":1.0},"6":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"31":{"tf":1.0}}}}},"o":{"a":{"d":{"df":1,"docs":{"6":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"41":{"tf":1.0}}},"t":{"df":4,"docs":{"15":{"tf":1.4142135623730951},"23":{"tf":1.0},"3":{"tf":1.0},"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":3,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.0}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"14":{"tf":2.0}}}}}},"o":{"df":0,"docs":{},"p":{"df":5,"docs":{"28":{"tf":1.0},"36":{"tf":1.7320508075688772},"41":{"tf":1.0},"46":{"tf":1.0},"49":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}},"w":{"df":4,"docs":{"37":{"tf":1.0},"41":{"tf":1.4142135623730951},"6":{"tf":1.0},"7":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"15":{"tf":1.0},"38":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"o":{"\'":{"df":1,"docs":{"53":{"tf":1.0}}},"df":7,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"49":{"tf":1.0},"50":{"tf":1.0},"53":{"tf":1.0},"55":{"tf":1.7320508075688772},"7":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":1,"docs":{"49":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"18":{"tf":1.0}}}}},"df":0,"docs":{}}}},"k":{"df":0,"docs":{},"e":{"df":11,"docs":{"15":{"tf":1.0},"2":{"tf":1.7320508075688772},"23":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":1.4142135623730951},"48":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"34":{"tf":1.4142135623730951},"6":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"38":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":11,"docs":{"0":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.7320508075688772},"20":{"tf":1.0},"23":{"tf":1.0},"30":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.0},"47":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{":":{":":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{":":{":":{"c":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"d":{">":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"29":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"18":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":8,"docs":{"23":{"tf":1.4142135623730951},"27":{"tf":1.0},"28":{"tf":1.0},"33":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"46":{"tf":1.0},"53":{"tf":2.23606797749979},"6":{"tf":1.0}}},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"20":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"30":{"tf":1.0}}}}}},"x":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"|":{"(":{"_":{"df":0,"docs":{},"i":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":11,"docs":{"15":{"tf":1.4142135623730951},"16":{"tf":3.605551275463989},"18":{"tf":1.0},"23":{"tf":1.4142135623730951},"30":{"tf":1.7320508075688772},"31":{"tf":1.0},"38":{"tf":1.0},"53":{"tf":3.0},"54":{"tf":1.4142135623730951},"55":{"tf":2.6457513110645907},"6":{"tf":1.4142135623730951}}},"y":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{"7":{":":{"2":{"8":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"55":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"53":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"38":{"tf":3.1622776601683795},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"52":{"tf":1.0}},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":3,"docs":{"38":{"tf":2.6457513110645907},"51":{"tf":1.7320508075688772},"53":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":6,"docs":{"15":{"tf":1.0},"18":{"tf":1.7320508075688772},"34":{"tf":1.4142135623730951},"42":{"tf":2.23606797749979},"49":{"tf":1.4142135623730951},"51":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":1,"docs":{"49":{"tf":1.0}}}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"51":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"q":{"_":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"51":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}}}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"p":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"51":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":5,"docs":{"0":{"tf":2.449489742783178},"2":{"tf":1.0},"47":{"tf":2.0},"48":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772}}}}}}}},"d":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"14":{"tf":1.0},"41":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"22":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"20":{"tf":2.0}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"47":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"s":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"x":{"df":1,"docs":{"38":{"tf":1.0}}}},"k":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":7,"docs":{"28":{"tf":1.4142135623730951},"30":{"tf":1.4142135623730951},"33":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.0}}}}},"o":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"1":{"tf":1.0}},"i":{"df":3,"docs":{"23":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"15":{"tf":1.0},"28":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":8,"docs":{"18":{"tf":2.0},"30":{"tf":1.0},"34":{"tf":1.0},"37":{"tf":1.7320508075688772},"41":{"tf":1.7320508075688772},"52":{"tf":1.0},"53":{"tf":1.0},"6":{"tf":1.0}}}}},"r":{"=":{"\\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"a":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"b":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"g":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"38":{"tf":1.0},"52":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"38":{"tf":1.0},"52":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":2,"docs":{"38":{"tf":1.0},"51":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"38":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"u":{"c":{"df":0,"docs":{},"h":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"18":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"18":{"tf":1.0},"38":{"tf":1.0}}}}}}},"t":{"df":8,"docs":{"18":{"tf":1.0},"25":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"55":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"=":{"\\"":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"a":{"df":1,"docs":{"53":{"tf":1.0}}},"b":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"12":{"tf":1.0},"16":{"tf":1.0},"53":{"tf":1.4142135623730951}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":8,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":1.0},"48":{"tf":1.0},"5":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0}}}}}},"df":1,"docs":{"55":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"41":{"tf":1.0}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"1":{"tf":1.0},"18":{"tf":1.0},"22":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":4,"docs":{"18":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"42":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}},"w":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"27":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":3,"docs":{"18":{"tf":2.23606797749979},"20":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}}}},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"30":{"tf":1.0},"32":{"tf":1.0}}}}},"o":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"48":{"tf":1.0},"7":{"tf":1.4142135623730951}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"53":{"tf":1.0}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"d":{"df":2,"docs":{"48":{"tf":1.0},"7":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"e":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"18":{"tf":1.0}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":1,"docs":{"20":{"tf":1.0}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"[":{"df":0,"docs":{},"u":{"8":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}}},"_":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"18":{"tf":1.0},"30":{"tf":1.4142135623730951},"4":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":8,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"51":{"tf":1.0}}},"i":{"c":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":8,"docs":{"18":{"tf":2.23606797749979},"19":{"tf":1.0},"20":{"tf":2.23606797749979},"34":{"tf":2.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0}},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"\'":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"18":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"18":{"tf":1.7320508075688772},"20":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":3,"docs":{"49":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0}},"e":{"d":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":8,"docs":{"18":{"tf":1.7320508075688772},"22":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"53":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"m":{"_":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"15":{"tf":1.0},"18":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"df":1,"docs":{"18":{"tf":1.0}}},"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":13,"docs":{"15":{"tf":2.8284271247461903},"16":{"tf":1.4142135623730951},"18":{"tf":4.242640687119285},"23":{"tf":2.23606797749979},"24":{"tf":1.4142135623730951},"29":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"42":{"tf":2.449489742783178},"6":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"4":{":":{"2":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"7":{":":{"2":{"7":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"3":{"3":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{":":{"4":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"4":{"3":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"5":{":":{"4":{"7":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"3":{":":{"6":{"3":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"1":{"tf":1.0},"26":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.0}}}}}}},"k":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":1,"docs":{"51":{"tf":1.0}}},"n":{"c":{"df":1,"docs":{"42":{"tf":1.0}}},"df":9,"docs":{"14":{"tf":1.0},"18":{"tf":1.0},"25":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"38":{"tf":1.4142135623730951},"41":{"tf":1.0},"5":{"tf":1.0},"55":{"tf":1.0}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"4":{"tf":1.0},"41":{"tf":1.0}}},"r":{"df":3,"docs":{"15":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"53":{"tf":1.0}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":1,"docs":{"20":{"tf":1.0}}},"s":{"df":1,"docs":{"7":{"tf":1.0}}},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"38":{"tf":1.0},"41":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"15":{"tf":1.0},"18":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"28":{"tf":1.0},"36":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"28":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.0},"52":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"11":{"tf":1.0},"12":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.4142135623730951}}}}}}},"w":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"c":{"b":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":2,"docs":{"16":{"tf":2.8284271247461903},"42":{"tf":2.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"a":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"25":{"tf":1.0},"26":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{"#":{"df":0,"docs":{},"x":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"df":3,"docs":{"25":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{".":{"c":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"26":{"tf":1.0}}}}}}},"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"23":{"tf":1.7320508075688772},"25":{"tf":1.0},"26":{"tf":2.0},"38":{"tf":1.0},"5":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"25":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"#":{"[":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"df":0,"docs":{},"e":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"i":{"c":{"\'":{"df":1,"docs":{"10":{"tf":1.0}}},"df":4,"docs":{"10":{"tf":1.4142135623730951},"49":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"18":{"tf":1.0},"30":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":9,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.0},"20":{"tf":1.0},"27":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"50":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"df":0,"docs":{},"t":{"df":7,"docs":{"0":{"tf":1.7320508075688772},"41":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.0},"47":{"tf":1.7320508075688772},"5":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772}},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"15":{"tf":1.0},"30":{"tf":1.4142135623730951},"34":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":5,"docs":{"17":{"tf":1.0},"34":{"tf":1.0},"38":{"tf":1.7320508075688772},"43":{"tf":1.0},"6":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"1":{"tf":1.7320508075688772},"53":{"tf":1.0}}}},"df":0,"docs":{},"h":{"=":{"\\"":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"51":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"53":{"tf":1.0}}}}}}}},"d":{"=":{"\\"":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"/":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"4":{":":{"3":{"6":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"3":{"1":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"9":{":":{"1":{"8":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"2":{":":{"3":{"9":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"4":{"6":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"21":{"tf":1.0},"27":{"tf":1.0}}}}},"s":{"=":{"\\"":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.4142135623730951}},"w":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"30":{"tf":1.0}}}},"df":7,"docs":{"15":{"tf":1.0},"23":{"tf":1.4142135623730951},"28":{"tf":1.0},"30":{"tf":1.7320508075688772},"31":{"tf":1.4142135623730951},"32":{"tf":1.0},"42":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"15":{"tf":1.4142135623730951},"18":{"tf":1.7320508075688772},"3":{"tf":1.0},"38":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"15":{"tf":1.0},"33":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"38":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"23":{"tf":1.0},"49":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"=":{"\\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"18":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.0},"5":{"tf":1.0}}}}},"s":{"df":1,"docs":{"7":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"7":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"18":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"37":{"tf":1.0},"38":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"32":{"tf":1.0}}}},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"33":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"=":{"\\"":{"1":{"0":{"0":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"0":{"0":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":2,"docs":{"34":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}}}}},"o":{"c":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"42":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.0},"41":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"\'":{"df":1,"docs":{"7":{"tf":1.0}}},"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"51":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":10,"docs":{"2":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"25":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"53":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"31":{"tf":1.0}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.0},"3":{"tf":1.0},"41":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":7,"docs":{"0":{"tf":1.4142135623730951},"48":{"tf":1.0},"49":{"tf":1.7320508075688772},"51":{"tf":2.0},"52":{"tf":1.4142135623730951},"53":{"tf":2.449489742783178},"55":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"48":{"tf":1.4142135623730951},"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":2.449489742783178},"53":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"18":{"tf":1.0},"20":{"tf":1.0},"23":{"tf":1.4142135623730951},"4":{"tf":1.0},"41":{"tf":1.0},"53":{"tf":1.0},"55":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{":":{":":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"!":{"(":{"_":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"a":{")":{".":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{":":{"<":{"df":0,"docs":{},"u":{"8":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"54":{"tf":1.0}}}},"u":{"b":{"df":1,"docs":{"54":{"tf":2.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"48":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"27":{"tf":1.0},"30":{"tf":1.4142135623730951}}}}}},"t":{"df":2,"docs":{"53":{"tf":1.0},"55":{"tf":1.0}}}}},"q":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":1,"docs":{"7":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"18":{"tf":1.7320508075688772},"29":{"tf":1.0},"52":{"tf":1.0}},"e":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"42":{"tf":1.0}}}},"d":{"df":4,"docs":{"18":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0},"6":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"47":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"34":{"tf":1.0},"38":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"\'":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}}}}},"k":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}},"l":{"df":0,"docs":{},"y":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"t":{"(":{")":{"\'":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"v":{"df":1,"docs":{"38":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":10,"docs":{"15":{"tf":2.0},"16":{"tf":1.0},"18":{"tf":2.23606797749979},"20":{"tf":1.0},"23":{"tf":1.0},"3":{"tf":1.4142135623730951},"30":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.0},"6":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"\'":{"df":1,"docs":{"55":{"tf":1.0}}},"_":{"a":{":":{"#":{"df":0,"docs":{},"x":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"54":{"tf":1.4142135623730951}}},"v":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"53":{"tf":2.6457513110645907},"54":{"tf":1.0}}},"b":{":":{"#":{"df":0,"docs":{},"x":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":2,"docs":{"53":{"tf":2.449489742783178},"54":{"tf":1.0}}},"df":0,"docs":{}},"b":{"df":1,"docs":{"54":{"tf":1.4142135623730951}}},"df":8,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.7320508075688772},"31":{"tf":1.0},"53":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951},"55":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"28":{"tf":1.4142135623730951},"30":{"tf":1.0},"33":{"tf":1.4142135623730951},"38":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0}}}}}},"l":{"_":{"a":{".":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"_":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"b":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"31":{"tf":1.0}}},"b":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"37":{"tf":1.0},"6":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"18":{"tf":1.0},"3":{"tf":1.0}}}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"z":{"df":0,"docs":{},"v":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}},"y":{"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"38":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"1":{"tf":1.0},"4":{"tf":1.4142135623730951}}},"y":{"\'":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"r":{"(":{"c":{"df":2,"docs":{"25":{"tf":1.0},"54":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":3,"docs":{"15":{"tf":1.0},"23":{"tf":1.4142135623730951},"34":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":7,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"7":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951}}}},"t":{"df":1,"docs":{"31":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"47":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"2":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"21":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"13":{"tf":1.0},"51":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":3,"docs":{"16":{"tf":1.4142135623730951},"20":{"tf":1.7320508075688772},"55":{"tf":1.4142135623730951}}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"18":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":5,"docs":{"15":{"tf":1.0},"20":{"tf":1.4142135623730951},"22":{"tf":1.0},"27":{"tf":1.4142135623730951},"41":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"s":{"df":2,"docs":{"12":{"tf":1.0},"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":4,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"50":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":20,"docs":{"0":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"18":{"tf":2.449489742783178},"20":{"tf":1.4142135623730951},"23":{"tf":2.23606797749979},"25":{"tf":1.4142135623730951},"26":{"tf":2.23606797749979},"27":{"tf":1.0},"28":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951},"34":{"tf":1.4142135623730951},"41":{"tf":2.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"6":{"tf":2.8284271247461903},"7":{"tf":2.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":11,"docs":{"15":{"tf":1.0},"2":{"tf":1.4142135623730951},"22":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":2.0},"4":{"tf":1.4142135623730951},"48":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":11,"docs":{"0":{"tf":2.0},"13":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":2.449489742783178},"48":{"tf":1.0},"49":{"tf":1.0},"50":{"tf":1.4142135623730951},"53":{"tf":1.0},"55":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772}}}}}},"s":{"df":0,"docs":{},"t":{"\'":{"df":1,"docs":{"18":{"tf":1.0}}},"c":{"df":3,"docs":{"0":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.4142135623730951}}},"d":{"df":0,"docs":{},"o":{"c":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"18":{"tf":1.0},"20":{"tf":1.0}}}}}}},"df":3,"docs":{"5":{"tf":2.8284271247461903},"50":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":17,"docs":{"0":{"tf":2.449489742783178},"1":{"tf":1.7320508075688772},"3":{"tf":1.4142135623730951},"34":{"tf":1.0},"37":{"tf":1.4142135623730951},"38":{"tf":1.7320508075688772},"4":{"tf":2.0},"40":{"tf":1.0},"41":{"tf":2.0},"48":{"tf":1.4142135623730951},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772},"54":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772}}}}}},"s":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"55":{"tf":1.0}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"5":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"df":4,"docs":{"41":{"tf":1.0},"42":{"tf":1.0},"46":{"tf":1.0},"50":{"tf":1.4142135623730951}}},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}}},"w":{"df":1,"docs":{"41":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"38":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"18":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"6":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"14":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"37":{"tf":2.23606797749979},"38":{"tf":1.0}}},"y":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"38":{"tf":1.0}}}},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":3,"docs":{"37":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"18":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":7,"docs":{"15":{"tf":1.0},"18":{"tf":1.0},"23":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"40":{"tf":1.0},"55":{"tf":1.0}},"k":{"df":1,"docs":{"24":{"tf":1.0}}},"n":{"df":1,"docs":{"41":{"tf":1.0}}}},"l":{"4":{"/":{"c":{"a":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{".":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{":":{":":{"c":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{":":{":":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{".":{"df":0,"docs":{},"h":{"df":2,"docs":{"37":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{":":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"18":{"tf":1.7320508075688772},"20":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":3,"docs":{"17":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}}}}}},"c":{"a":{"df":0,"docs":{},"p":{":":{":":{"c":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"24":{"tf":1.0},"32":{"tf":1.0},"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"q":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"q":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"34":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"34":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"q":{"_":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":2,"docs":{"34":{"tf":1.0},"35":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":4,"docs":{"18":{"tf":1.0},"37":{"tf":1.4142135623730951},"38":{"tf":1.0},"46":{"tf":1.4142135623730951}},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"c":{"b":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":4,"docs":{"17":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0}},"e":{"d":{":":{":":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"18":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{":":{":":{"c":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"15":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":1,"docs":{"15":{"tf":1.0}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"23":{"tf":1.0},"32":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"t":{"c":{"b":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"15":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"20":{"tf":1.0},"21":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"21":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"15":{"tf":1.0},"23":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"s":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.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":{"7":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"37":{"tf":1.4142135623730951},"38":{"tf":1.4142135623730951}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"a":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"16":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{":":{":":{"c":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"31":{"tf":1.7320508075688772}},"e":{".":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"q":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{".":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"34":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"e":{".":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{":":{":":{"c":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":2,"docs":{"20":{"tf":1.0},"31":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"31":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"18":{"tf":1.0},"24":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"c":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":3,"docs":{"38":{"tf":1.0},"39":{"tf":1.0},"51":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"38":{"tf":1.0},"39":{"tf":1.0},"51":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"53":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"q":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"34":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"i":{"b":{"df":2,"docs":{"37":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"14":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"i":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"49":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"55":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":1,"docs":{"51":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"c":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"50":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"50":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"53":{"tf":1.0},"55":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"df":0,"docs":{},"{":{",":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"{":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"df":1,"docs":{"48":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":3,"docs":{"48":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"34":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"c":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"10":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"13":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"34":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":21,"docs":{"0":{"tf":3.4641016151377544},"1":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":2.23606797749979},"16":{"tf":1.0},"18":{"tf":1.7320508075688772},"2":{"tf":1.4142135623730951},"20":{"tf":1.0},"23":{"tf":2.23606797749979},"3":{"tf":1.0},"30":{"tf":1.4142135623730951},"37":{"tf":1.7320508075688772},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":2.8284271247461903},"47":{"tf":1.7320508075688772},"5":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"6":{"tf":3.0},"7":{"tf":1.7320508075688772}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"/":{"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":{},"h":{"df":1,"docs":{"41":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{".":{"df":0,"docs":{},"h":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"18":{"tf":1.0},"4":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"f":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"51":{"tf":1.4142135623730951},"53":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"51":{"tf":1.4142135623730951},"53":{"tf":1.0}}}},"n":{"d":{"df":4,"docs":{"38":{"tf":2.0},"39":{"tf":1.0},"41":{"tf":1.0},"52":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"\'":{"df":1,"docs":{"38":{"tf":1.4142135623730951}}},"df":1,"docs":{"38":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"4":{"tf":1.0}}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"36":{"tf":1.0},"46":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"r":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"33":{"tf":1.0},"36":{"tf":1.0}},"e":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"(":{"*":{"c":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"32":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":3,"docs":{"32":{"tf":1.0},"33":{"tf":1.0},"46":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"q":{"df":4,"docs":{"28":{"tf":1.0},"34":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951}}}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":5,"docs":{"28":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.7320508075688772},"32":{"tf":1.4142135623730951},"45":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":10,"docs":{"28":{"tf":2.6457513110645907},"30":{"tf":1.4142135623730951},"33":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":2.23606797749979},"52":{"tf":1.0}}}},"df":1,"docs":{"1":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"\'":{"df":1,"docs":{"52":{"tf":1.0}}},".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"p":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}},"l":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":4,"docs":{"4":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"54":{"tf":1.0}}}},"i":{"c":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"r":{"df":1,"docs":{"51":{"tf":1.0}}}}},"df":6,"docs":{"10":{"tf":1.4142135623730951},"23":{"tf":1.0},"28":{"tf":1.0},"41":{"tf":1.0},"46":{"tf":1.0},"5":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"1":{"tf":1.0}}}},"v":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"v":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"=":{"\\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"a":{"_":{"df":0,"docs":{},"v":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"_":{"df":0,"docs":{},"v":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"e":{"df":4,"docs":{"23":{"tf":1.0},"53":{"tf":2.8284271247461903},"54":{"tf":1.4142135623730951},"55":{"tf":2.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"2":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"w":{"df":1,"docs":{"41":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"e":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"19":{"tf":1.0},"20":{"tf":1.7320508075688772}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"49":{"tf":1.0},"7":{"tf":1.0}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"42":{"tf":1.0},"46":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"41":{"tf":1.0},"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"14":{"tf":1.0},"28":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"49":{"tf":1.0}}}}},"i":{"df":1,"docs":{"44":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"l":{"df":9,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":1.0},"48":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"18":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}},"z":{"df":0,"docs":{},"e":{"=":{"\\"":{"0":{"df":0,"docs":{},"x":{"1":{"_":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"18":{"tf":1.4142135623730951},"31":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":8,"docs":{"12":{"tf":1.7320508075688772},"13":{"tf":1.0},"16":{"tf":3.0},"18":{"tf":1.7320508075688772},"20":{"tf":1.4142135623730951},"23":{"tf":1.0},"25":{"tf":1.0},"38":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"55":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"df":5,"docs":{"15":{"tf":1.7320508075688772},"18":{"tf":3.0},"20":{"tf":1.7320508075688772},"26":{"tf":1.0},"31":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"32":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"38":{"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":2,"docs":{"24":{"tf":1.0},"29":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"33":{"tf":1.0},"52":{"tf":1.0}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"48":{"tf":1.0},"7":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"5":{":":{"2":{"0":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"6":{":":{"4":{"9":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"1":{":":{"5":{"4":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"3":{":":{"8":{"4":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":10,"docs":{"15":{"tf":1.4142135623730951},"23":{"tf":3.0},"25":{"tf":1.0},"26":{"tf":1.0},"28":{"tf":1.0},"33":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"46":{"tf":1.0},"53":{"tf":1.0},"6":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":4,"docs":{"34":{"tf":1.0},"37":{"tf":2.0},"41":{"tf":2.6457513110645907},"6":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"3":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"34":{"tf":1.0},"38":{"tf":1.0},"55":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":4,"docs":{"0":{"tf":1.0},"23":{"tf":1.0},"3":{"tf":1.7320508075688772},"34":{"tf":1.0}},"i":{"df":5,"docs":{"18":{"tf":1.4142135623730951},"20":{"tf":1.0},"38":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"r":{"c":{"_":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"a":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"12":{"tf":1.0},"13":{"tf":1.0}}}}}},"df":4,"docs":{"11":{"tf":1.0},"12":{"tf":2.0},"37":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"41":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":8,"docs":{"1":{"tf":1.4142135623730951},"15":{"tf":1.0},"2":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":1.4142135623730951},"54":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"20":{"tf":1.4142135623730951},"42":{"tf":1.0},"53":{"tf":1.0}}},"i":{"c":{"df":4,"docs":{"14":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"47":{"tf":1.0}}},"df":0,"docs":{}}}},"d":{"df":1,"docs":{"7":{"tf":1.7320508075688772}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"\'":{"df":1,"docs":{"55":{"tf":1.0}}},"df":39,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.4142135623730951},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":2.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.4142135623730951},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"42":{"tf":2.0},"43":{"tf":1.7320508075688772},"44":{"tf":2.0},"45":{"tf":1.4142135623730951},"46":{"tf":2.449489742783178},"52":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"41":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"53":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"23":{"tf":1.0},"25":{"tf":1.0},"48":{"tf":1.0},"51":{"tf":1.4142135623730951},"53":{"tf":1.0},"54":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"23":{"tf":1.7320508075688772},"25":{"tf":1.0},"7":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"b":{"df":1,"docs":{"6":{"tf":1.0}}},"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"b":{"df":1,"docs":{"46":{"tf":1.4142135623730951}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"42":{"tf":1.0}}}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"32":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":7,"docs":{"14":{"tf":1.0},"16":{"tf":1.0},"37":{"tf":1.4142135623730951},"47":{"tf":1.0},"53":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"55":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":3,"docs":{"0":{"tf":1.0},"50":{"tf":1.0},"7":{"tf":1.0}}}},"s":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":3,"docs":{"53":{"tf":2.449489742783178},"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"s":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"\'":{"df":1,"docs":{"16":{"tf":1.0}}},"df":6,"docs":{"15":{"tf":1.0},"47":{"tf":1.0},"51":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772},"54":{"tf":1.0},"6":{"tf":1.0}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"15":{"tf":1.0},"23":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":4,"docs":{"31":{"tf":1.0},"38":{"tf":1.4142135623730951},"43":{"tf":1.0},"50":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":5,"docs":{"0":{"tf":1.0},"18":{"tf":1.7320508075688772},"3":{"tf":1.7320508075688772},"31":{"tf":1.0},"7":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"k":{"\'":{"df":14,"docs":{"12":{"tf":1.4142135623730951},"13":{"tf":1.0},"16":{"tf":1.0},"20":{"tf":1.0},"23":{"tf":1.7320508075688772},"25":{"tf":1.4142135623730951},"26":{"tf":1.7320508075688772},"27":{"tf":1.0},"28":{"tf":1.4142135623730951},"33":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.0}}},".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"k":{":":{"3":{"1":{":":{"3":{"6":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"/":{".":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"3":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"23":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":5,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":2.0},"20":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"28":{"tf":1.7320508075688772},"29":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"32":{"tf":1.0},"33":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":5,"docs":{"37":{"tf":1.7320508075688772},"38":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"c":{"/":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"v":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"43":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":17,"docs":{"0":{"tf":1.4142135623730951},"14":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"20":{"tf":1.0},"23":{"tf":1.0},"26":{"tf":1.4142135623730951},"28":{"tf":1.0},"3":{"tf":1.0},"34":{"tf":1.4142135623730951},"41":{"tf":4.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":2.23606797749979},"6":{"tf":2.449489742783178},"7":{"tf":1.7320508075688772}}}}},"df":4,"docs":{"15":{"tf":1.7320508075688772},"18":{"tf":1.0},"49":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"18":{"tf":1.0},"34":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"31":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"51":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":2,"docs":{"1":{"tf":1.4142135623730951},"41":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"df":7,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"2":{"tf":1.0},"38":{"tf":1.0},"47":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"51":{"tf":1.0},"55":{"tf":1.0}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"1":{"tf":1.4142135623730951},"41":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"\'":{"df":3,"docs":{"12":{"tf":1.4142135623730951},"15":{"tf":1.0},"18":{"tf":2.449489742783178}}},"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"7":{"5":{":":{"7":{"9":{"df":2,"docs":{"37":{"tf":1.0},"38":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"1":{":":{"8":{"5":{"df":1,"docs":{"37":{"tf":1.0}}},"7":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":6,"docs":{"15":{"tf":1.7320508075688772},"23":{"tf":1.0},"37":{"tf":3.0},"38":{"tf":1.7320508075688772},"41":{"tf":1.4142135623730951},"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":2,"docs":{"47":{"tf":1.0},"7":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":3,"docs":{"37":{"tf":1.0},"42":{"tf":1.0},"47":{"tf":1.0}}}}}}},"u":{"df":1,"docs":{"15":{"tf":1.0}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":6,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"6":{"tf":1.7320508075688772}}}}},"l":{"df":2,"docs":{"37":{"tf":1.0},"41":{"tf":1.0}}},"o":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"51":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"38":{"tf":1.0},"55":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"15":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"2":{"tf":1.0},"53":{"tf":1.4142135623730951}}}},"p":{"df":4,"docs":{"14":{"tf":1.0},"23":{"tf":1.0},"3":{"tf":1.0},"5":{"tf":1.0}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"18":{"tf":1.0},"41":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"18":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"49":{"tf":1.0}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"15":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"25":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"23":{"tf":1.0}}}},"i":{"df":3,"docs":{"26":{"tf":1.0},"33":{"tf":1.0},"46":{"tf":1.4142135623730951}},"m":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"31":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":2.6457513110645907}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":3,"docs":{"17":{"tf":1.0},"20":{"tf":1.0},"54":{"tf":1.0}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":2.0},"18":{"tf":1.0},"47":{"tf":1.0},"6":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"o":{"df":12,"docs":{"1":{"tf":1.0},"18":{"tf":1.0},"23":{"tf":1.0},"3":{"tf":1.4142135623730951},"30":{"tf":1.0},"31":{"tf":1.4142135623730951},"37":{"tf":1.0},"38":{"tf":1.7320508075688772},"41":{"tf":1.0},"5":{"tf":1.4142135623730951},"51":{"tf":1.0},"53":{"tf":1.4142135623730951}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"\'":{"df":1,"docs":{"18":{"tf":1.0}}},"df":17,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"15":{"tf":2.8284271247461903},"16":{"tf":1.0},"18":{"tf":2.449489742783178},"20":{"tf":1.0},"23":{"tf":2.0},"30":{"tf":1.0},"38":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.4142135623730951},"48":{"tf":1.0},"51":{"tf":2.449489742783178},"52":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"54":{"tf":1.7320508075688772},"55":{"tf":2.0}}},"i":{"c":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"1":{"6":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":3,"docs":{"25":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0}}},"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"38":{"tf":1.0},"51":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"55":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":1,"docs":{"6":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"s":{"a":{"df":0,"docs":{},"f":{"df":4,"docs":{"26":{"tf":1.0},"33":{"tf":1.0},"54":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"31":{"tf":1.0},"38":{"tf":1.0},"42":{"tf":1.0}}}},"y":{"df":0,"docs":{},"p":{"df":6,"docs":{"16":{"tf":2.0},"17":{"tf":1.0},"18":{"tf":2.23606797749979},"30":{"tf":2.449489742783178},"31":{"tf":2.0},"42":{"tf":2.449489742783178}},"e":{"d":{"\'":{"df":2,"docs":{"30":{"tf":1.0},"31":{"tf":1.0}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"18":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":4,"docs":{"17":{"tf":1.0},"18":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}},"df":7,"docs":{"15":{"tf":1.0},"18":{"tf":1.0},"28":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.0},"46":{"tf":1.0},"54":{"tf":1.0}}},"s":{"df":44,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"18":{"tf":1.7320508075688772},"19":{"tf":1.0},"20":{"tf":2.449489742783178},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.7320508075688772},"27":{"tf":1.4142135623730951},"28":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.7320508075688772},"33":{"tf":1.0},"34":{"tf":1.7320508075688772},"35":{"tf":1.0},"36":{"tf":2.0},"37":{"tf":2.23606797749979},"38":{"tf":2.23606797749979},"39":{"tf":1.0},"4":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":2.0},"47":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":2.449489742783178},"53":{"tf":1.0},"54":{"tf":1.4142135623730951},"55":{"tf":1.0},"6":{"tf":2.23606797749979},"7":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":1,"docs":{"15":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":6,"docs":{"0":{"tf":1.7320508075688772},"15":{"tf":1.0},"16":{"tf":1.0},"34":{"tf":1.4142135623730951},"41":{"tf":1.0},"6":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"z":{"df":9,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":2.0},"28":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"53":{"tf":2.449489742783178},"54":{"tf":1.0},"55":{"tf":1.0}}}}},"t":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"31":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.0}}}},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"31":{"tf":1.0}},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"v":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"=":{"\\"":{"0":{"df":0,"docs":{},"x":{"2":{"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"0":{"0":{"_":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":8,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"20":{"tf":2.0},"24":{"tf":1.0},"28":{"tf":1.0},"38":{"tf":1.0},"53":{"tf":1.4142135623730951},"55":{"tf":1.0}}}},"r":{"!":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"a":{"_":{"df":0,"docs":{},"v":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"_":{"df":0,"docs":{},"v":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"53":{"tf":1.0},"54":{"tf":1.0}},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"37":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"a":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"a":{"df":3,"docs":{"15":{"tf":1.0},"34":{"tf":1.0},"38":{"tf":1.0}}},"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"38":{"tf":1.0},"52":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":10,"docs":{"15":{"tf":1.4142135623730951},"23":{"tf":2.449489742783178},"25":{"tf":1.0},"26":{"tf":1.0},"33":{"tf":1.4142135623730951},"46":{"tf":1.0},"53":{"tf":1.4142135623730951},"54":{"tf":1.0},"55":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"s":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"4":{"tf":2.23606797749979}}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":3,"docs":{"23":{"tf":2.23606797749979},"26":{"tf":1.4142135623730951},"27":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"19":{"tf":1.0},"20":{"tf":1.4142135623730951},"36":{"tf":1.0}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"4":{"tf":1.0},"53":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"21":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"18":{"tf":1.4142135623730951},"31":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"y":{"df":6,"docs":{"14":{"tf":1.0},"18":{"tf":2.0},"38":{"tf":1.0},"46":{"tf":1.0},"55":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"\'":{"df":0,"docs":{},"v":{"df":3,"docs":{"31":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"15":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":2,"docs":{"16":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":7,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.0},"28":{"tf":1.4142135623730951},"30":{"tf":1.0},"42":{"tf":1.0},"6":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"38":{"tf":1.0}},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"20":{"tf":1.0}}},"h":{"df":1,"docs":{"18":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"51":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"15":{"tf":1.0},"18":{"tf":1.0},"5":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"55":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"\'":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"d":{"df":3,"docs":{"15":{"tf":1.0},"20":{"tf":1.4142135623730951},"38":{"tf":1.4142135623730951}}},"df":0,"docs":{},"k":{"df":9,"docs":{"1":{"tf":1.0},"18":{"tf":1.0},"2":{"tf":1.0},"27":{"tf":1.4142135623730951},"37":{"tf":1.0},"4":{"tf":1.0},"46":{"tf":1.0},"47":{"tf":1.0},"6":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":3,"docs":{"3":{"tf":1.7320508075688772},"4":{"tf":1.7320508075688772},"5":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"/":{".":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"3":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"48":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"p":{"c":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":1,"docs":{"3":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":20,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":2.0},"20":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"28":{"tf":1.7320508075688772},"29":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"32":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.7320508075688772},"38":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"7":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"d":{"!":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"33":{"tf":1.0}}}},"df":0,"docs":{}},"/":{"df":0,"docs":{},"p":{"d":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"7":{":":{"2":{"2":{"df":1,"docs":{"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"7":{":":{"2":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"1":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"7":{":":{"1":{"7":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":3,"docs":{"33":{"tf":1.0},"48":{"tf":2.0},"7":{"tf":2.0}}},"df":0,"docs":{}},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"15":{"tf":1.0}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"15":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":3,"docs":{"1":{"tf":1.0},"36":{"tf":1.4142135623730951},"6":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"24":{"tf":1.0},"48":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0}}}}}}}}},"x":{"df":1,"docs":{"7":{"tf":1.0}},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"\'":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}}}},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}},"y":{":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":2,"docs":{"18":{"tf":1.0},"20":{"tf":1.0}}}}}}}},"breadcrumbs":{"root":{"0":{"1":{"6":{"df":0,"docs":{},"x":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}},"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":2,"docs":{"25":{"tf":1.0},"53":{"tf":2.0}},"x":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"0":{"0":{"1":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"1":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"0":{"0":{"0":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"0":{"0":{"_":{"0":{"0":{"0":{"0":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"25":{"tf":1.0}}}},"f":{"0":{"0":{"d":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"1":{"0":{".":{"a":{"df":1,"docs":{"52":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"a":{"df":1,"docs":{"54":{"tf":1.4142135623730951}}},"b":{"df":1,"docs":{"55":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"3":{"df":1,"docs":{"38":{"tf":1.0}}},"df":1,"docs":{"16":{"tf":1.4142135623730951}}},"3":{"3":{"7":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"df":3,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"16":{"tf":1.4142135623730951}}},"4":{"df":1,"docs":{"16":{"tf":1.0}}},"5":{"df":1,"docs":{"16":{"tf":1.0}}},"6":{"df":1,"docs":{"54":{"tf":1.0}}},"df":2,"docs":{"18":{"tf":1.0},"31":{"tf":1.4142135623730951}}},"2":{".":{"3":{"df":1,"docs":{"15":{"tf":1.0}}},"4":{".":{"1":{"df":1,"docs":{"18":{"tf":1.0}}},"2":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}},"df":3,"docs":{"16":{"tf":1.0},"18":{"tf":1.0},"30":{"tf":1.0}}},"a":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}},"b":{"df":1,"docs":{"9":{"tf":1.4142135623730951}}},"c":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}},"d":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":1,"docs":{"12":{"tf":1.4142135623730951}}},"f":{"df":1,"docs":{"13":{"tf":1.4142135623730951}}},"g":{"df":1,"docs":{"14":{"tf":2.0}}}},"7":{"df":1,"docs":{"16":{"tf":1.0}}},"df":3,"docs":{"16":{"tf":1.0},"47":{"tf":1.0},"50":{"tf":1.0}}},"3":{".":{"a":{"df":1,"docs":{"16":{"tf":1.7320508075688772}}},"b":{"df":1,"docs":{"17":{"tf":1.7320508075688772}}},"c":{"df":1,"docs":{"18":{"tf":2.449489742783178}}},"d":{"df":1,"docs":{"19":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":1,"docs":{"20":{"tf":1.7320508075688772}}},"f":{"df":1,"docs":{"21":{"tf":1.4142135623730951}}},"g":{"df":1,"docs":{"22":{"tf":1.4142135623730951}}}},"3":{"df":1,"docs":{"28":{"tf":1.0}}},"7":{"df":2,"docs":{"12":{"tf":1.0},"13":{"tf":1.0}}},"df":1,"docs":{"24":{"tf":1.0}}},"4":{".":{"2":{".":{"4":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"38":{"tf":1.0}}},"a":{"df":1,"docs":{"24":{"tf":1.4142135623730951}}},"b":{"df":2,"docs":{"25":{"tf":2.0},"33":{"tf":1.0}}},"c":{"df":2,"docs":{"26":{"tf":2.0},"33":{"tf":1.0}}},"d":{"df":2,"docs":{"27":{"tf":1.4142135623730951},"33":{"tf":1.0}}},"df":0,"docs":{}},"0":{"9":{"6":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"38":{"tf":1.0}}},"5":{".":{"a":{"df":1,"docs":{"29":{"tf":2.0}}},"b":{"df":1,"docs":{"30":{"tf":1.4142135623730951}}},"c":{"df":2,"docs":{"31":{"tf":2.0},"42":{"tf":1.0}}},"d":{"df":1,"docs":{"32":{"tf":1.7320508075688772}}},"df":0,"docs":{},"e":{"df":3,"docs":{"33":{"tf":1.7320508075688772},"44":{"tf":1.0},"46":{"tf":1.0}}},"f":{"df":2,"docs":{"34":{"tf":1.4142135623730951},"46":{"tf":1.0}}},"g":{"df":2,"docs":{"35":{"tf":1.4142135623730951},"46":{"tf":1.0}}},"h":{"df":2,"docs":{"36":{"tf":1.4142135623730951},"46":{"tf":1.0}}}},"2":{"5":{"3":{"df":0,"docs":{},"e":{"d":{"c":{"1":{"df":0,"docs":{},"e":{"d":{"1":{"2":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"20":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0}},"h":{"df":2,"docs":{"41":{"tf":1.0},"46":{"tf":1.0}}}},"6":{".":{"a":{"df":1,"docs":{"38":{"tf":2.0}}},"b":{"df":1,"docs":{"39":{"tf":1.4142135623730951}}},"c":{"df":1,"docs":{"40":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":2,"docs":{"41":{"tf":1.0},"47":{"tf":1.0}}},"7":{".":{"1":{".":{"3":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":3,"docs":{"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"43":{"tf":1.0}}},"b":{"df":3,"docs":{"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951}}},"c":{"df":2,"docs":{"41":{"tf":1.0},"44":{"tf":1.4142135623730951}}},"d":{"df":2,"docs":{"41":{"tf":1.0},"45":{"tf":1.4142135623730951}}},"df":0,"docs":{},"e":{"df":5,"docs":{"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"8":{"c":{"a":{"0":{"df":0,"docs":{},"e":{"1":{"9":{"3":{"9":{"d":{"c":{"1":{".":{".":{"5":{"2":{"5":{"3":{"df":0,"docs":{},"e":{"d":{"c":{"1":{"df":0,"docs":{},"e":{"d":{"1":{"2":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"1":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{".":{"1":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"b":{"a":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}}}},"df":2,"docs":{"33":{"tf":1.0},"53":{"tf":1.0}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":1,"docs":{"18":{"tf":1.0}}}},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"a":{".":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{".":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"31":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"55":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"13":{"tf":1.0}}}},"s":{"df":0,"docs":{},"s":{"df":6,"docs":{"15":{"tf":1.4142135623730951},"20":{"tf":1.0},"26":{"tf":1.0},"28":{"tf":1.0},"34":{"tf":1.0},"55":{"tf":1.7320508075688772}}}}},"o":{"df":0,"docs":{},"r":{"d":{"df":3,"docs":{"18":{"tf":1.0},"42":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"d":{"d":{"df":6,"docs":{"13":{"tf":1.0},"14":{"tf":1.0},"17":{"tf":1.0},"29":{"tf":1.0},"45":{"tf":1.0},"7":{"tf":1.0}},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"2":{"tf":1.0},"55":{"tf":1.0}}}},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"(":{"1":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":1,"docs":{"26":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":19,"docs":{"15":{"tf":1.4142135623730951},"18":{"tf":2.23606797749979},"23":{"tf":3.3166247903554},"24":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.7320508075688772},"27":{"tf":1.0},"28":{"tf":1.4142135623730951},"30":{"tf":2.0},"31":{"tf":1.4142135623730951},"32":{"tf":1.0},"33":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"54":{"tf":1.0},"55":{"tf":1.0},"6":{"tf":1.0}}}}}}},"df":1,"docs":{"41":{"tf":1.4142135623730951}},"j":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"12":{"tf":1.0}}}}}},"v":{"a":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"18":{"tf":1.0},"31":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"41":{"tf":1.0}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"48":{"tf":1.0}}}}}}},"df":0,"docs":{}},"h":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"i":{"a":{"df":2,"docs":{"23":{"tf":1.4142135623730951},"51":{"tf":1.7320508075688772}},"s":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"(":{"4":{"0":{"9":{"6":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"18":{"tf":1.0},"25":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":20,"docs":{"13":{"tf":1.0},"15":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"18":{"tf":2.8284271247461903},"19":{"tf":1.0},"20":{"tf":1.7320508075688772},"21":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":2.0},"31":{"tf":1.4142135623730951},"32":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":2.8284271247461903},"46":{"tf":1.4142135623730951},"53":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.7320508075688772}}},"df":0,"docs":{},"w":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"37":{"tf":1.0},"41":{"tf":1.0}},"g":{"df":3,"docs":{"26":{"tf":1.0},"30":{"tf":1.0},"55":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":0,"docs":{},"i":{"df":2,"docs":{"18":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"w":{"a":{"df":0,"docs":{},"y":{"df":3,"docs":{"31":{"tf":1.0},"38":{"tf":1.0},"55":{"tf":1.0}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"z":{"df":1,"docs":{"4":{"tf":2.0}}}}}},"d":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"38":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"55":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"28":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"i":{"df":8,"docs":{"0":{"tf":2.449489742783178},"23":{"tf":1.4142135623730951},"30":{"tf":1.0},"34":{"tf":1.0},"47":{"tf":1.0},"48":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.4142135623730951}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}},"r":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":2.23606797749979}},"e":{"\'":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"\'":{"df":0,"docs":{},"t":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"15":{"tf":1.0},"31":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0}}},"df":0,"docs":{}}}},"r":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"!":{"(":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"38":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"a":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"f":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"32":{"tf":1.0}}}}},"df":1,"docs":{"32":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"53":{"tf":1.0},"54":{"tf":1.0}}}}},"o":{"c":{"df":1,"docs":{"15":{"tf":1.0}},"i":{"df":8,"docs":{"15":{"tf":1.4142135623730951},"16":{"tf":1.0},"23":{"tf":1.0},"34":{"tf":1.4142135623730951},"35":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0},"46":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"m":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"2":{"tf":1.0},"47":{"tf":1.4142135623730951},"53":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"1":{"tf":1.4142135623730951},"13":{"tf":1.0}}}}}},"r":{"df":1,"docs":{"27":{"tf":1.0}},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":6,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"49":{"tf":1.0},"50":{"tf":1.0},"53":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"15":{"tf":1.0},"34":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}}}},"v":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}}},"b":{"\\"":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"33":{"tf":1.0}}}}}}}},"a":{"c":{"df":0,"docs":{},"k":{"df":4,"docs":{"26":{"tf":1.4142135623730951},"30":{"tf":1.7320508075688772},"41":{"tf":1.0},"7":{"tf":1.0}},"g":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"20":{"tf":2.6457513110645907}}}},"df":0,"docs":{},"r":{"df":1,"docs":{"55":{"tf":1.4142135623730951}}},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"16":{"tf":1.0},"20":{"tf":1.0},"28":{"tf":1.0},"47":{"tf":1.0},"6":{"tf":1.0}}},"i":{"c":{"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"38":{"tf":1.0}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"36":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"34":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"3":{"tf":1.0},"30":{"tf":1.0},"38":{"tf":1.7320508075688772},"51":{"tf":1.0}}}},"n":{"df":1,"docs":{"38":{"tf":1.0}}}}}}},"f":{"df":1,"docs":{"7":{"tf":1.0}}},"i":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"0":{"tf":1.7320508075688772},"34":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":5,"docs":{"16":{"tf":2.8284271247461903},"18":{"tf":1.0},"20":{"tf":1.0},"38":{"tf":1.4142135623730951},"53":{"tf":1.0}}}},"l":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":3,"docs":{"37":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}}}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"6":{"tf":1.7320508075688772}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"17":{"tf":1.0}},"e":{"d":{"(":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"(":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{")":{".":{"c":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"17":{"tf":1.4142135623730951},"29":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":9,"docs":{"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.4142135623730951},"23":{"tf":1.0},"26":{"tf":1.4142135623730951},"29":{"tf":1.4142135623730951},"30":{"tf":1.0},"42":{"tf":1.0},"6":{"tf":1.0}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}},"l":{"df":0,"docs":{},"o":{"a":{"d":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"t":{"df":0,"docs":{},"h":{"df":4,"docs":{"13":{"tf":1.0},"18":{"tf":1.0},"3":{"tf":1.0},"54":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"38":{"tf":2.8284271247461903},"43":{"tf":1.0},"51":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"df":6,"docs":{"14":{"tf":1.4142135623730951},"2":{"tf":2.0},"28":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.7320508075688772}}},"df":0,"docs":{},"t":{"df":4,"docs":{"2":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0},"6":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":4,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"38":{"tf":1.0},"52":{"tf":1.0}}}}}},"c":{"a":{"b":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"15":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"d":{"=":{"\\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":1,"docs":{"53":{"tf":2.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":15,"docs":{"1":{"tf":1.0},"15":{"tf":2.23606797749979},"18":{"tf":1.0},"20":{"tf":2.0},"23":{"tf":1.0},"32":{"tf":1.0},"34":{"tf":1.0},"38":{"tf":2.0},"40":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"49":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.4142135623730951},"6":{"tf":1.0}}}},"p":{"\'":{"df":1,"docs":{"15":{"tf":1.4142135623730951}}},":":{":":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"a":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"15":{"tf":1.0},"18":{"tf":1.0},"23":{"tf":1.0}},"y":{"\'":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{}}}}}},"l":{"df":12,"docs":{"15":{"tf":3.0},"16":{"tf":1.0},"18":{"tf":3.3166247903554},"20":{"tf":2.8284271247461903},"23":{"tf":1.0},"26":{"tf":1.7320508075688772},"27":{"tf":1.0},"31":{"tf":1.0},"34":{"tf":2.6457513110645907},"38":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":3,"docs":{"15":{"tf":1.0},"18":{"tf":1.0},"31":{"tf":1.7320508075688772}},"s":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{":":{"8":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"3":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"3":{"tf":1.0}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"15":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":5,"docs":{"13":{"tf":1.0},"18":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0},"53":{"tf":1.4142135623730951}}},"t":{"df":1,"docs":{"18":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"s":{"df":3,"docs":{"11":{"tf":1.0},"12":{"tf":1.0},"8":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}},"d":{"df":10,"docs":{"1":{"tf":1.0},"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":1.0},"48":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}}},"df":4,"docs":{"2":{"tf":1.7320508075688772},"26":{"tf":1.0},"33":{"tf":1.0},"53":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"18":{"tf":1.4142135623730951},"52":{"tf":1.0}}}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":6,"docs":{"41":{"tf":2.23606797749979},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.7320508075688772}}}}}}},"n":{"df":0,"docs":{},"g":{"df":4,"docs":{"38":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"53":{"tf":1.0}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"1":{"3":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}},"3":{"7":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":2,"docs":{"51":{"tf":3.3166247903554},"53":{"tf":2.0}},"s":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":1,"docs":{"51":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"51":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}}}}}}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"\'":{"df":3,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0}}},"df":12,"docs":{"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":1.4142135623730951},"41":{"tf":1.7320508075688772},"44":{"tf":1.0},"45":{"tf":1.0},"47":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"l":{"d":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"41":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"_":{"df":0,"docs":{},"t":{"c":{"b":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":5,"docs":{"31":{"tf":1.0},"41":{"tf":2.6457513110645907},"43":{"tf":1.4142135623730951},"44":{"tf":1.0},"46":{"tf":2.23606797749979}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"31":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"7":{"tf":1.0}}}}},"r":{"df":3,"docs":{"20":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"1":{"tf":1.0},"46":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"\'":{"df":1,"docs":{"52":{"tf":1.0}}},".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.4142135623730951}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.0}}}}}}}}},"df":3,"docs":{"51":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"54":{"tf":1.0}}}}},"p":{"b":{"df":0,"docs":{},"o":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}}}}},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{".":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{".":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"15":{"tf":1.0},"18":{"tf":2.8284271247461903},"20":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"d":{"df":0,"docs":{},"e":{"df":10,"docs":{"1":{"tf":2.0},"24":{"tf":1.0},"3":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"41":{"tf":2.0},"53":{"tf":1.0},"55":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":3,"docs":{"13":{"tf":1.0},"46":{"tf":1.0},"54":{"tf":1.0}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":2.449489742783178}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"41":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"df":1,"docs":{"38":{"tf":1.4142135623730951}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}}}}}},"r":{"df":2,"docs":{"20":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"53":{"tf":1.7320508075688772}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}},"x":{"df":1,"docs":{"41":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"34":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"23":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"n":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"38":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"3":{"tf":1.0}}}}}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":4,"docs":{"3":{"tf":1.4142135623730951},"38":{"tf":1.0},"4":{"tf":1.4142135623730951},"5":{"tf":1.7320508075688772}}}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"41":{"tf":1.0},"5":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"33":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"18":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0}}}}},"df":4,"docs":{"25":{"tf":1.0},"28":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"54":{"tf":1.0}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":13,"docs":{"1":{"tf":1.0},"15":{"tf":1.0},"18":{"tf":1.0},"2":{"tf":2.0},"20":{"tf":1.0},"26":{"tf":1.0},"30":{"tf":1.7320508075688772},"31":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":2.8284271247461903},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"df":3,"docs":{"15":{"tf":1.0},"18":{"tf":1.4142135623730951},"41":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":4,"docs":{"34":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0},"6":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"i":{"df":4,"docs":{"1":{"tf":1.0},"38":{"tf":2.0},"44":{"tf":1.0},"46":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"e":{"df":2,"docs":{"15":{"tf":1.0},"7":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"df":10,"docs":{"1":{"tf":1.0},"15":{"tf":1.0},"23":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"27":{"tf":1.0},"30":{"tf":1.0},"4":{"tf":1.0},"42":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":7,"docs":{"0":{"tf":1.7320508075688772},"25":{"tf":1.0},"31":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"t":{"df":0,"docs":{},"r":{"df":3,"docs":{"15":{"tf":1.4142135623730951},"18":{"tf":2.6457513110645907},"38":{"tf":1.4142135623730951}}}}},"r":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":16,"docs":{"13":{"tf":1.0},"14":{"tf":1.7320508075688772},"15":{"tf":1.0},"23":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"37":{"tf":1.0},"41":{"tf":1.7320508075688772},"48":{"tf":1.0},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.4142135623730951},"54":{"tf":1.0},"55":{"tf":1.4142135623730951},"6":{"tf":1.0},"7":{"tf":2.0}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":9,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"30":{"tf":1.4142135623730951},"34":{"tf":1.4142135623730951},"35":{"tf":1.4142135623730951},"47":{"tf":1.0}},"e":{"_":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"v":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"43":{"tf":1.4142135623730951}},"e":{"(":{")":{"\'":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"29":{"tf":1.0}}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"\'":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}},"df":7,"docs":{"15":{"tf":1.4142135623730951},"18":{"tf":3.0},"20":{"tf":1.0},"23":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.4142135623730951},"46":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{")":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"2":{"(":{")":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"31":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"15":{"tf":1.4142135623730951},"18":{"tf":2.449489742783178},"20":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":3,"docs":{"0":{"tf":1.0},"10":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}}}},"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":6,"docs":{"36":{"tf":1.0},"38":{"tf":2.449489742783178},"39":{"tf":1.0},"52":{"tf":1.0},"53":{"tf":1.4142135623730951},"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"!":{"(":{"\\"":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"51":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"48":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"51":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"53":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"c":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"46":{"tf":1.0},"49":{"tf":1.0},"53":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":5,"docs":{"10":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"49":{"tf":1.0},"53":{"tf":1.0}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"26":{"tf":1.0},"54":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"34":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":2,"docs":{"14":{"tf":1.0},"3":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":5,"docs":{"15":{"tf":1.0},"2":{"tf":1.0},"23":{"tf":1.0},"37":{"tf":1.0},"7":{"tf":1.7320508075688772}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"s":{"c":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":2,"docs":{"17":{"tf":1.4142135623730951},"29":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"i":{"b":{"df":4,"docs":{"16":{"tf":1.4142135623730951},"20":{"tf":1.0},"38":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":3,"docs":{"40":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0}},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"r":{"df":3,"docs":{"18":{"tf":1.0},"31":{"tf":1.0},"42":{"tf":1.0}}}},"t":{"_":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":4,"docs":{"0":{"tf":1.0},"18":{"tf":1.0},"50":{"tf":1.0},"6":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"26":{"tf":1.0},"38":{"tf":1.0}}}}}}}},"v":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"/":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"4":{"tf":2.23606797749979}},"i":{"c":{"df":15,"docs":{"16":{"tf":3.1622776601683795},"28":{"tf":2.23606797749979},"29":{"tf":1.0},"30":{"tf":2.23606797749979},"31":{"tf":1.4142135623730951},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":2.0}},"e":{"\'":{"df":4,"docs":{"28":{"tf":1.7320508075688772},"30":{"tf":1.0},"33":{"tf":1.0},"44":{"tf":1.0}}},".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"41":{"tf":1.0},"46":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"r":{"df":1,"docs":{"28":{"tf":1.0}}}},"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"0":{"2":{":":{"1":{"0":{"8":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"1":{"6":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{":":{"1":{"8":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"2":{":":{"2":{"7":{"df":1,"docs":{"29":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"4":{":":{"4":{"4":{"df":1,"docs":{"29":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"3":{":":{"4":{"9":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"8":{":":{"9":{"7":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"0":{":":{"7":{"3":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{".":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":1,"docs":{"46":{"tf":1.0}}}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"c":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"31":{"tf":1.0},"32":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{".":{"df":0,"docs":{},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":1,"docs":{"55":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"38":{"tf":1.0},"7":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"30":{"tf":1.0}}}}}}}}},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"34":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"i":{"d":{"df":2,"docs":{"3":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}},"l":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"o":{"c":{"df":1,"docs":{"3":{"tf":1.0}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"d":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"2":{"tf":1.0}},"e":{":":{"9":{"4":{":":{"1":{"0":{"8":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":1,"docs":{"2":{"tf":2.449489742783178}},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"\'":{"df":0,"docs":{},"t":{"df":3,"docs":{"0":{"tf":1.0},"28":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"\'":{"df":1,"docs":{"49":{"tf":1.4142135623730951}}},"df":5,"docs":{"0":{"tf":1.4142135623730951},"48":{"tf":1.0},"51":{"tf":1.4142135623730951},"53":{"tf":2.23606797749979},"55":{"tf":1.0}}}}},"df":0,"docs":{}},"n":{"\'":{"df":0,"docs":{},"t":{"df":1,"docs":{"30":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"42":{"tf":1.0}}}},"w":{"df":0,"docs":{},"n":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{":":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{":":{":":{"c":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"18":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":2,"docs":{"31":{"tf":1.4142135623730951},"42":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":8,"docs":{"1":{"tf":1.4142135623730951},"15":{"tf":1.4142135623730951},"18":{"tf":1.0},"23":{"tf":1.0},"3":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":4,"docs":{"28":{"tf":1.0},"36":{"tf":1.0},"41":{"tf":1.0},"46":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"16":{"tf":1.0},"18":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"50":{"tf":1.0}}}}}}},"f":{"df":1,"docs":{"53":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":7,"docs":{"15":{"tf":1.0},"18":{"tf":1.4142135623730951},"20":{"tf":1.0},"23":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"38":{"tf":1.0}}},"y":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":2,"docs":{"18":{"tf":1.0},"29":{"tf":1.0}},"s":{".":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":2,"docs":{"18":{"tf":1.0},"31":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"n":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"4":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"18":{"tf":1.4142135623730951},"53":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{}}}}},"d":{"df":5,"docs":{"1":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"51":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"38":{"tf":2.0},"41":{"tf":1.0}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"15":{"tf":1.0},"53":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}},"i":{"df":0,"docs":{},"r":{"df":1,"docs":{"41":{"tf":1.0}}}},"r":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"49":{"tf":1.0},"7":{"tf":1.7320508075688772}}}}}}}}}},"u":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.0}}}}}},"v":{"df":1,"docs":{"41":{"tf":1.0}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":5,"docs":{"14":{"tf":1.0},"3":{"tf":1.4142135623730951},"41":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"49":{"tf":1.0},"51":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"48":{"tf":1.0},"51":{"tf":1.4142135623730951},"53":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"49":{"tf":2.0}}}}}},"x":{"a":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"25":{"tf":1.0},"7":{"tf":1.0}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.0}}}},"p":{"df":0,"docs":{},"l":{"df":15,"docs":{"1":{"tf":1.4142135623730951},"12":{"tf":1.0},"13":{"tf":1.0},"15":{"tf":1.4142135623730951},"18":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":2.0},"41":{"tf":1.7320508075688772},"48":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"53":{"tf":2.0},"55":{"tf":1.0},"7":{"tf":1.0}}}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"41":{"tf":1.0},"55":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{},"s":{"df":25,"docs":{"1":{"tf":2.0},"10":{"tf":1.7320508075688772},"11":{"tf":1.7320508075688772},"12":{"tf":1.7320508075688772},"13":{"tf":1.7320508075688772},"19":{"tf":1.7320508075688772},"20":{"tf":2.23606797749979},"21":{"tf":1.7320508075688772},"22":{"tf":1.7320508075688772},"24":{"tf":1.7320508075688772},"27":{"tf":1.7320508075688772},"30":{"tf":1.4142135623730951},"32":{"tf":1.0},"33":{"tf":1.7320508075688772},"34":{"tf":1.7320508075688772},"35":{"tf":1.7320508075688772},"36":{"tf":1.7320508075688772},"37":{"tf":1.0},"39":{"tf":1.7320508075688772},"40":{"tf":1.7320508075688772},"41":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"52":{"tf":2.0},"8":{"tf":1.7320508075688772},"9":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}},"t":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}},"p":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"1":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"23":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"r":{"df":3,"docs":{"37":{"tf":1.4142135623730951},"41":{"tf":1.0},"50":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":6,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"17":{"tf":1.0},"24":{"tf":1.0},"27":{"tf":1.0},"53":{"tf":1.0}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":4,"docs":{"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"46":{"tf":1.4142135623730951}}},"df":0,"docs":{},"s":{"df":2,"docs":{"4":{"tf":1.4142135623730951},"41":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":1,"docs":{"10":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":1,"docs":{"26":{"tf":1.0}}}}},"r":{"a":{"_":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"38":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"43":{"tf":1.0},"46":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":1,"docs":{"43":{"tf":1.0}}},"df":0,"docs":{}}}}},"f":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"18":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":2,"docs":{"21":{"tf":1.0},"42":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"13":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.4142135623730951},"29":{"tf":1.0},"47":{"tf":1.0}}}},"df":0,"docs":{}}}}},"r":{"df":5,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":1.0},"53":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":2,"docs":{"26":{"tf":1.0},"49":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"df":0,"docs":{},"w":{"df":5,"docs":{"37":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.0},"53":{"tf":1.0},"55":{"tf":1.0}}}},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"d":{"_":{"1":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"38":{"tf":2.0}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"e":{"df":2,"docs":{"3":{"tf":1.0},"53":{"tf":1.0}},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"|":{"(":{"_":{"df":0,"docs":{},"i":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"28":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.0}}}},"d":{"_":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"d":{"(":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.4142135623730951}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":3,"docs":{"17":{"tf":1.0},"26":{"tf":1.0},"42":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"34":{"tf":1.0}},"r":{"df":1,"docs":{"6":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"28":{"tf":1.0},"29":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}},"n":{"(":{"&":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{":":{":":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":11,"docs":{"17":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"37":{"tf":1.4142135623730951},"38":{"tf":1.4142135623730951},"48":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":2.0},"53":{"tf":1.7320508075688772},"7":{"tf":1.0}}},"o":{"c":{"df":0,"docs":{},"u":{"df":2,"docs":{"23":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":5,"docs":{"32":{"tf":1.0},"34":{"tf":1.0},"37":{"tf":1.0},"42":{"tf":1.0},"46":{"tf":1.4142135623730951}}}}}},"o":{"df":1,"docs":{"54":{"tf":1.0}}},"r":{"df":0,"docs":{},"m":{"df":4,"docs":{"15":{"tf":1.0},"49":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"0":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}},"df":11,"docs":{"16":{"tf":1.4142135623730951},"23":{"tf":2.23606797749979},"24":{"tf":1.7320508075688772},"26":{"tf":1.4142135623730951},"30":{"tf":1.7320508075688772},"31":{"tf":1.7320508075688772},"32":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.7320508075688772},"46":{"tf":1.0},"6":{"tf":1.0}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"a":{"df":1,"docs":{"31":{"tf":1.0}}},"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"31":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":3,"docs":{"16":{"tf":1.0},"18":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"o":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":8,"docs":{"17":{"tf":1.0},"26":{"tf":1.4142135623730951},"31":{"tf":1.0},"37":{"tf":1.0},"43":{"tf":1.0},"49":{"tf":1.7320508075688772},"51":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}}}},"d":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"30":{"tf":1.0},"50":{"tf":1.0}}}}}}}}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"15":{"tf":1.0},"30":{"tf":1.4142135623730951},"5":{"tf":1.0},"7":{"tf":1.0}}}}},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"r":{"df":1,"docs":{"51":{"tf":1.0}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"(":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":1,"docs":{"26":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"26":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"1":{"tf":2.0}},"h":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"26":{"tf":1.0}},"n":{"df":5,"docs":{"23":{"tf":1.0},"26":{"tf":1.0},"3":{"tf":1.0},"34":{"tf":1.0},"42":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"41":{"tf":1.0},"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"23":{"tf":1.0},"28":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"34":{"tf":1.0}}}},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":1,"docs":{"25":{"tf":1.0}},"e":{"_":{"df":0,"docs":{},"s":{"df":2,"docs":{"25":{"tf":2.0},"26":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"46":{"tf":1.0}}},"l":{"df":4,"docs":{"41":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"48":{"tf":1.7320508075688772},"49":{"tf":2.449489742783178},"51":{"tf":2.0},"52":{"tf":1.4142135623730951},"53":{"tf":2.0}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":4,"docs":{"48":{"tf":1.7320508075688772},"49":{"tf":1.0},"51":{"tf":2.449489742783178},"53":{"tf":1.7320508075688772}}}}}}}}}},"df":0,"docs":{}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"r":{"d":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"1":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"42":{"tf":1.0}}}}},"df":1,"docs":{"7":{"tf":1.0}},"e":{"a":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}}},"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"13":{"tf":1.7320508075688772}}}}}},"df":3,"docs":{"13":{"tf":1.7320508075688772},"41":{"tf":1.0},"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.7320508075688772},"33":{"tf":1.0},"48":{"tf":2.23606797749979},"49":{"tf":1.0},"50":{"tf":1.0},"7":{"tf":2.23606797749979},"8":{"tf":1.0},"9":{"tf":1.0}}}},"p":{"df":2,"docs":{"4":{"tf":1.0},"41":{"tf":1.0}}}},"r":{"df":0,"docs":{},"e":{"df":7,"docs":{"27":{"tf":1.4142135623730951},"37":{"tf":1.0},"41":{"tf":1.0},"47":{"tf":1.0},"48":{"tf":1.0},"5":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":2,"docs":{"23":{"tf":1.0},"7":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"28":{"tf":1.0},"37":{"tf":1.0},"6":{"tf":1.0}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"1":{"tf":1.0},"27":{"tf":1.0},"46":{"tf":1.4142135623730951}}}}},"o":{"c":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}},"df":0,"docs":{},"l":{"d":{"df":2,"docs":{"31":{"tf":1.0},"34":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}},"o":{"d":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":1,"docs":{"10":{"tf":1.7320508075688772}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}}}},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"36":{"tf":1.0}}},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"5":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"i":{".":{"df":1,"docs":{"20":{"tf":1.0}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}}}},"d":{"=":{"\\"":{"1":{"3":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}},"3":{"7":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":3,"docs":{"26":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"i":{"df":2,"docs":{"0":{"tf":1.0},"5":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"g":{"df":6,"docs":{"2":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"43":{"tf":1.0},"53":{"tf":1.7320508075688772},"6":{"tf":1.0}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":3,"docs":{"48":{"tf":1.4142135623730951},"51":{"tf":2.0},"53":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":11,"docs":{"0":{"tf":1.0},"18":{"tf":1.0},"28":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"46":{"tf":1.0},"48":{"tf":1.4142135623730951},"49":{"tf":1.7320508075688772},"51":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"7":{"tf":1.0}}}}}}},"n":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"d":{"df":8,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"3":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.0},"50":{"tf":1.0},"52":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}}}},"x":{"(":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":3,"docs":{"17":{"tf":1.0},"18":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"48":{"tf":1.4142135623730951},"51":{"tf":1.4142135623730951},"53":{"tf":1.0}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":4,"docs":{"18":{"tf":1.4142135623730951},"3":{"tf":1.0},"30":{"tf":1.0},"7":{"tf":1.0}}}}}},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"48":{"tf":1.0},"51":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951}},"i":{"df":15,"docs":{"12":{"tf":1.4142135623730951},"14":{"tf":1.4142135623730951},"18":{"tf":1.0},"26":{"tf":1.0},"30":{"tf":1.4142135623730951},"37":{"tf":1.0},"41":{"tf":1.0},"42":{"tf":1.4142135623730951},"46":{"tf":1.0},"49":{"tf":1.0},"51":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"54":{"tf":1.0},"55":{"tf":1.0},"6":{"tf":1.4142135623730951}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"28":{"tf":1.0},"36":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}},"i":{"d":{"df":2,"docs":{"2":{"tf":1.7320508075688772},"4":{"tf":1.0}}},"df":0,"docs":{}},"t":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"2":{"tf":1.0}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"21":{"tf":1.0},"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":3,"docs":{"1":{"tf":1.0},"41":{"tf":1.0},"53":{"tf":1.0}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"34":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},"r":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"46":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{".":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"v":{"df":1,"docs":{"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"(":{"1":{"2":{"3":{")":{".":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":2,"docs":{"38":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":1,"docs":{"38":{"tf":1.0}}}},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"37":{"tf":1.0},"38":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"37":{"tf":1.0},"38":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"38":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"a":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"38":{"tf":1.0}}}},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":3,"docs":{"37":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":12,"docs":{"25":{"tf":1.0},"28":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":3,"docs":{"28":{"tf":1.0},"37":{"tf":1.0},"52":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.0}}}}}}}}}},"f":{"a":{"c":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":4,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.7320508075688772},"38":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":3,"docs":{"28":{"tf":1.0},"34":{"tf":2.8284271247461903},"36":{"tf":2.23606797749979}}}}}}}},"o":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"a":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"46":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"u":{"c":{"df":2,"docs":{"0":{"tf":1.0},"38":{"tf":1.0}},"t":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"o":{"c":{"df":3,"docs":{"15":{"tf":1.0},"18":{"tf":1.4142135623730951},"3":{"tf":1.0}}},"df":0,"docs":{},"k":{"df":3,"docs":{"15":{"tf":1.0},"18":{"tf":1.0},"38":{"tf":1.0}}}}}},"p":{"c":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{"7":{":":{"2":{"0":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":5,"docs":{"37":{"tf":1.0},"38":{"tf":3.4641016151377544},"43":{"tf":1.0},"51":{"tf":2.449489742783178},"52":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"q":{"_":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"46":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"c":{"a":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"q":{"_":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":1,"docs":{"46":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"46":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"46":{"tf":1.0}}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"c":{"a":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"34":{"tf":1.7320508075688772}}}}}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":3,"docs":{"34":{"tf":2.0},"35":{"tf":1.0},"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"n":{"\'":{"df":0,"docs":{},"t":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"17":{"tf":1.0},"18":{"tf":1.0},"29":{"tf":1.0}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"53":{"tf":1.0},"6":{"tf":1.0}}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":2,"docs":{"31":{"tf":1.0},"42":{"tf":1.0}}}},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"\'":{"df":1,"docs":{"15":{"tf":1.0}}},"df":18,"docs":{"15":{"tf":3.4641016151377544},"16":{"tf":2.449489742783178},"17":{"tf":1.0},"18":{"tf":1.7320508075688772},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"29":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.0},"34":{"tf":1.0},"38":{"tf":2.23606797749979},"42":{"tf":1.0},"6":{"tf":2.449489742783178}}}}}}},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}}},"l":{"a":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"38":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"38":{"tf":1.0}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"41":{"tf":1.0}}}}},"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":8,"docs":{"0":{"tf":1.0},"37":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.7320508075688772},"48":{"tf":1.0},"50":{"tf":1.7320508075688772},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":4,"docs":{"18":{"tf":1.4142135623730951},"29":{"tf":1.0},"30":{"tf":1.0},"35":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}}},"df":2,"docs":{"17":{"tf":1.0},"42":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"20":{"tf":1.0},"30":{"tf":1.0}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}}}},"v":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{},"g":{"a":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"38":{"tf":2.0},"55":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"34":{"tf":1.0}}}},"t":{"\'":{"df":4,"docs":{"25":{"tf":1.0},"26":{"tf":1.0},"38":{"tf":1.0},"54":{"tf":1.0}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"(":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":1,"docs":{"14":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}}},"df":0,"docs":{}}}}}}}},"df":9,"docs":{"23":{"tf":1.4142135623730951},"28":{"tf":1.0},"3":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"5":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951}}},"r":{"a":{"df":0,"docs":{},"g":{"df":3,"docs":{"18":{"tf":1.0},"41":{"tf":1.0},"54":{"tf":1.0}}}},"df":0,"docs":{}}}}},"i":{"b":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"\'":{"df":1,"docs":{"51":{"tf":1.0}}},"df":2,"docs":{"48":{"tf":1.0},"51":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"37":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{"df":2,"docs":{"3":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}}}}}}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":1,"docs":{"53":{"tf":1.0}}},"k":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":3,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"48":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"26":{"tf":1.0},"6":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":1,"docs":{"31":{"tf":1.0}}}}},"o":{"a":{"d":{"df":1,"docs":{"6":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"41":{"tf":1.0}}},"t":{"df":4,"docs":{"15":{"tf":1.4142135623730951},"23":{"tf":1.0},"3":{"tf":1.0},"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":3,"docs":{"1":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.0}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"14":{"tf":2.0}}}}}},"o":{"df":0,"docs":{},"p":{"df":5,"docs":{"28":{"tf":1.0},"36":{"tf":1.7320508075688772},"41":{"tf":1.0},"46":{"tf":1.0},"49":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"31":{"tf":1.0}}}},"w":{"df":4,"docs":{"37":{"tf":1.0},"41":{"tf":1.4142135623730951},"6":{"tf":1.0},"7":{"tf":1.0}}}}},"m":{"a":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"15":{"tf":1.0},"38":{"tf":1.4142135623730951}}}}},"r":{"df":0,"docs":{},"o":{"\'":{"df":1,"docs":{"53":{"tf":1.0}}},"df":7,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"49":{"tf":1.0},"50":{"tf":1.0},"53":{"tf":1.0},"55":{"tf":1.7320508075688772},"7":{"tf":1.0}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{"_":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},".":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":1,"docs":{"49":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"18":{"tf":1.0}}}}},"df":0,"docs":{}}}},"k":{"df":0,"docs":{},"e":{"df":11,"docs":{"15":{"tf":1.0},"2":{"tf":1.7320508075688772},"23":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":1.4142135623730951},"48":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}}}},"n":{"a":{"df":0,"docs":{},"g":{"df":4,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"34":{"tf":1.4142135623730951},"6":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"38":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"u":{"a":{"df":0,"docs":{},"l":{"df":11,"docs":{"0":{"tf":1.0},"15":{"tf":1.0},"16":{"tf":1.0},"18":{"tf":1.7320508075688772},"20":{"tf":1.0},"23":{"tf":1.0},"30":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.0},"47":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}},"p":{"(":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{":":{":":{"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{":":{":":{"c":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"d":{">":{":":{":":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"29":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"18":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":8,"docs":{"23":{"tf":1.4142135623730951},"27":{"tf":1.0},"28":{"tf":1.0},"33":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"46":{"tf":1.0},"53":{"tf":2.23606797749979},"6":{"tf":1.0}}},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"1":{"tf":1.4142135623730951}}}},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"20":{"tf":1.0}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"30":{"tf":1.0}}}}}},"x":{"_":{"b":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"(":{"df":0,"docs":{},"|":{"(":{"_":{"df":0,"docs":{},"i":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":11,"docs":{"15":{"tf":1.4142135623730951},"16":{"tf":3.605551275463989},"18":{"tf":1.0},"23":{"tf":1.4142135623730951},"30":{"tf":1.7320508075688772},"31":{"tf":1.0},"38":{"tf":1.0},"53":{"tf":3.3166247903554},"54":{"tf":1.7320508075688772},"55":{"tf":2.8284271247461903},"6":{"tf":1.4142135623730951}}},"y":{".":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{":":{"7":{":":{"2":{"8":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"!":{"(":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":1,"docs":{"55":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":1,"docs":{"53":{"tf":1.4142135623730951}}}}}}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":5,"docs":{"38":{"tf":3.1622776601683795},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.0},"52":{"tf":1.0}},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":3,"docs":{"38":{"tf":2.6457513110645907},"51":{"tf":1.7320508075688772},"53":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"t":{"a":{"d":{"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{"df":6,"docs":{"15":{"tf":1.0},"18":{"tf":1.7320508075688772},"34":{"tf":1.4142135623730951},"42":{"tf":2.23606797749979},"49":{"tf":1.4142135623730951},"51":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"h":{"df":1,"docs":{"49":{"tf":1.0}}}},"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"51":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"q":{"_":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"51":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"m":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":1,"docs":{"51":{"tf":1.4142135623730951}}}}}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"51":{"tf":1.0}}}}}}}},"p":{"df":0,"docs":{},"p":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"51":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":5,"docs":{"0":{"tf":2.449489742783178},"2":{"tf":1.0},"47":{"tf":2.23606797749979},"48":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772}}}}}}}},"d":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":2,"docs":{"14":{"tf":1.0},"41":{"tf":1.0}},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"22":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"20":{"tf":2.0}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"47":{"tf":1.4142135623730951}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"s":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"v":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"x":{"df":1,"docs":{"38":{"tf":1.0}}}},"k":{"/":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":7,"docs":{"28":{"tf":1.4142135623730951},"30":{"tf":1.4142135623730951},"33":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.0}}}}},"o":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"1":{"tf":1.0}},"i":{"df":7,"docs":{"23":{"tf":1.7320508075688772},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"15":{"tf":1.0},"28":{"tf":1.0},"5":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":8,"docs":{"18":{"tf":2.0},"30":{"tf":1.0},"34":{"tf":1.0},"37":{"tf":1.7320508075688772},"41":{"tf":1.7320508075688772},"52":{"tf":1.0},"53":{"tf":1.0},"6":{"tf":1.0}}}}},"r":{"=":{"\\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"a":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"b":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"g":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":2,"docs":{"38":{"tf":1.0},"52":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"38":{"tf":1.0},"52":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":2,"docs":{"38":{"tf":1.0},"51":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"38":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"u":{"c":{"df":0,"docs":{},"h":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"18":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"18":{"tf":1.0},"38":{"tf":1.0}}}}}}},"t":{"df":8,"docs":{"18":{"tf":1.0},"25":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0},"33":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"55":{"tf":1.0}}}}},"n":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"=":{"\\"":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"a":{"df":1,"docs":{"53":{"tf":1.0}}},"b":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":3,"docs":{"12":{"tf":1.0},"16":{"tf":1.0},"53":{"tf":1.4142135623730951}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":8,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":1.0},"48":{"tf":1.0},"5":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0}}}}}},"df":1,"docs":{"55":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"41":{"tf":1.0}}}},"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":3,"docs":{"1":{"tf":1.0},"18":{"tf":1.0},"22":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"d":{"df":4,"docs":{"18":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"42":{"tf":1.0}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}},"w":{"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"27":{"tf":1.0}},"e":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":3,"docs":{"18":{"tf":2.23606797749979},"20":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}}}},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"30":{"tf":1.0},"32":{"tf":1.0}}}}},"o":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"48":{"tf":1.0},"7":{"tf":1.4142135623730951}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"53":{"tf":1.0}}}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"t":{"d":{"df":2,"docs":{"48":{"tf":1.0},"7":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"d":{"df":0,"docs":{},"e":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"18":{"tf":1.0}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":1,"docs":{"20":{"tf":1.0}},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"<":{"[":{"df":0,"docs":{},"u":{"8":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}}},"_":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"18":{"tf":1.0},"30":{"tf":1.4142135623730951},"4":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"df":8,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.0},"23":{"tf":1.0},"24":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"51":{"tf":1.0}}},"i":{"c":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{},"f":{"df":8,"docs":{"18":{"tf":2.23606797749979},"19":{"tf":1.0},"20":{"tf":2.23606797749979},"34":{"tf":2.0},"35":{"tf":1.0},"36":{"tf":1.0},"37":{"tf":1.0},"38":{"tf":1.0}},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"\'":{"df":1,"docs":{"20":{"tf":1.4142135623730951}}},"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"18":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":2,"docs":{"18":{"tf":1.7320508075688772},"20":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":3,"docs":{"49":{"tf":1.0},"51":{"tf":1.4142135623730951},"52":{"tf":1.0}},"e":{"d":{"(":{"&":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"w":{"df":8,"docs":{"18":{"tf":1.7320508075688772},"22":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"38":{"tf":1.0},"4":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"53":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"m":{"_":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"15":{"tf":1.0},"18":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"(":{"df":1,"docs":{"18":{"tf":1.0}}},"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":18,"docs":{"15":{"tf":3.1622776601683795},"16":{"tf":1.7320508075688772},"17":{"tf":1.0},"18":{"tf":4.358898943540674},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":2.23606797749979},"24":{"tf":1.4142135623730951},"29":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"32":{"tf":1.0},"35":{"tf":1.0},"38":{"tf":1.4142135623730951},"42":{"tf":2.449489742783178},"6":{"tf":1.4142135623730951}},"s":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"4":{":":{"2":{"2":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"7":{":":{"2":{"7":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{":":{"3":{"3":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"2":{":":{"4":{"2":{"df":1,"docs":{"17":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{":":{"4":{"3":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"5":{":":{"4":{"7":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{"3":{":":{"6":{"3":{"df":1,"docs":{"20":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"1":{"tf":1.0},"26":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"46":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"c":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.0}}}}}}},"k":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":1,"docs":{"51":{"tf":1.0}}},"n":{"c":{"df":1,"docs":{"42":{"tf":1.0}}},"df":9,"docs":{"14":{"tf":1.0},"18":{"tf":1.0},"25":{"tf":1.0},"3":{"tf":1.0},"31":{"tf":1.0},"38":{"tf":1.4142135623730951},"41":{"tf":1.0},"5":{"tf":1.0},"55":{"tf":1.0}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":2,"docs":{"4":{"tf":1.0},"41":{"tf":1.0}}},"r":{"df":3,"docs":{"15":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"53":{"tf":1.0}}},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"52":{"tf":1.0}}}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":1,"docs":{"20":{"tf":1.0}}},"s":{"df":1,"docs":{"7":{"tf":1.0}}},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"38":{"tf":1.0},"41":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"15":{"tf":1.0},"18":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"16":{"tf":1.0},"28":{"tf":1.0},"36":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":4,"docs":{"28":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.0},"52":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"11":{"tf":1.0},"12":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"21":{"tf":1.4142135623730951}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"47":{"tf":1.0},"6":{"tf":1.0}}}}}}}}},"w":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"t":{"c":{"b":{"df":1,"docs":{"46":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":2,"docs":{"16":{"tf":2.8284271247461903},"42":{"tf":2.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"a":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":2,"docs":{"25":{"tf":1.0},"26":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},":":{"#":{"df":0,"docs":{},"x":{"df":1,"docs":{"25":{"tf":1.0}}}},"df":0,"docs":{}},"df":3,"docs":{"25":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{".":{"c":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"26":{"tf":1.0}}}}}}},"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}},"df":5,"docs":{"23":{"tf":1.7320508075688772},"25":{"tf":1.0},"26":{"tf":2.0},"38":{"tf":1.0},"5":{"tf":1.4142135623730951}},"p":{"df":0,"docs":{},"l":{"a":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"d":{"df":1,"docs":{"25":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"(":{"#":{"[":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"(":{"d":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"[":{"0":{"df":0,"docs":{},"x":{"df":0,"docs":{},"e":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"i":{"c":{"\'":{"df":1,"docs":{"10":{"tf":1.0}}},"df":4,"docs":{"10":{"tf":1.4142135623730951},"49":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}},"k":{"df":1,"docs":{"41":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"r":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":0,"docs":{},"h":{"df":2,"docs":{"18":{"tf":1.0},"30":{"tf":1.0}}}}},"df":0,"docs":{}}},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":9,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.0},"20":{"tf":1.0},"27":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"50":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}}}},"df":0,"docs":{},"t":{"df":7,"docs":{"0":{"tf":1.7320508075688772},"41":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":1.0},"47":{"tf":1.7320508075688772},"5":{"tf":1.4142135623730951},"6":{"tf":1.7320508075688772}},"i":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":5,"docs":{"15":{"tf":1.0},"30":{"tf":1.4142135623730951},"34":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"s":{"df":5,"docs":{"17":{"tf":1.0},"34":{"tf":1.0},"38":{"tf":1.7320508075688772},"43":{"tf":1.0},"6":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"1":{"tf":1.7320508075688772},"53":{"tf":1.0}}}},"df":0,"docs":{},"h":{"=":{"\\"":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"51":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":1,"docs":{"53":{"tf":1.0}}}}}}}},"d":{"=":{"\\"":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"/":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"4":{":":{"3":{"6":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"3":{"1":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"9":{":":{"1":{"8":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"2":{":":{"3":{"9":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{":":{"4":{"6":{"df":1,"docs":{"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"36":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"21":{"tf":1.0},"27":{"tf":1.0}}}}},"s":{"=":{"\\"":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.4142135623730951}},"w":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"h":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"30":{"tf":1.0}}}},"df":7,"docs":{"15":{"tf":1.0},"23":{"tf":1.4142135623730951},"28":{"tf":1.0},"30":{"tf":1.7320508075688772},"31":{"tf":1.4142135623730951},"32":{"tf":1.0},"42":{"tf":1.0}}},"df":0,"docs":{}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"1":{"tf":1.0}}}},"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"41":{"tf":1.0}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"15":{"tf":1.4142135623730951},"18":{"tf":1.7320508075688772},"3":{"tf":1.0},"38":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":5,"docs":{"15":{"tf":1.0},"33":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"38":{"tf":1.0}}}}},"s":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"23":{"tf":1.0},"49":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"c":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"p":{"=":{"\\"":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":1,"docs":{"18":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":4,"docs":{"1":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.0},"5":{"tf":1.0}}}}},"s":{"df":1,"docs":{"7":{"tf":1.0}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"12":{"tf":1.0},"7":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"18":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"37":{"tf":1.0},"38":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"32":{"tf":1.0}}}},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"10":{"tf":1.0},"16":{"tf":1.0},"33":{"tf":1.0}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"=":{"\\"":{"1":{"0":{"0":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"0":{"0":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":2,"docs":{"34":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}}}}},"o":{"c":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"42":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":2,"docs":{"18":{"tf":1.0},"41":{"tf":1.0}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"\'":{"df":1,"docs":{"7":{"tf":1.0}}},"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"51":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}}},"df":10,"docs":{"2":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"25":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":1.0},"43":{"tf":1.0},"53":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"31":{"tf":1.0}}}}}}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":5,"docs":{"0":{"tf":1.0},"3":{"tf":1.0},"41":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":7,"docs":{"0":{"tf":1.4142135623730951},"48":{"tf":1.0},"49":{"tf":1.7320508075688772},"51":{"tf":2.0},"52":{"tf":1.4142135623730951},"53":{"tf":2.449489742783178},"55":{"tf":1.0}},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":5,"docs":{"48":{"tf":1.4142135623730951},"49":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":2.449489742783178},"53":{"tf":2.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"v":{"df":0,"docs":{},"i":{"d":{"df":9,"docs":{"18":{"tf":1.0},"20":{"tf":1.0},"23":{"tf":1.4142135623730951},"4":{"tf":1.0},"41":{"tf":1.0},"53":{"tf":1.0},"55":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"r":{":":{":":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"!":{"(":{"_":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"26":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"a":{")":{".":{"c":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{":":{":":{"<":{"df":0,"docs":{},"u":{"8":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"54":{"tf":1.0}}}},"u":{"b":{"df":1,"docs":{"54":{"tf":2.0}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"48":{"tf":1.0}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":2,"docs":{"27":{"tf":1.0},"30":{"tf":1.4142135623730951}}}}}},"t":{"df":2,"docs":{"53":{"tf":1.0},"55":{"tf":1.0}}}}},"q":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":1,"docs":{"7":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":3,"docs":{"18":{"tf":1.7320508075688772},"29":{"tf":1.0},"52":{"tf":1.0}},"e":{"<":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"42":{"tf":1.0}}}},"d":{"df":4,"docs":{"18":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0},"6":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"47":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":2,"docs":{"34":{"tf":1.0},"38":{"tf":2.23606797749979}},"e":{"df":0,"docs":{},"r":{"\'":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}}}}},"k":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"42":{"tf":1.0}},"l":{"df":0,"docs":{},"y":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"a":{"df":0,"docs":{},"t":{"(":{")":{"\'":{"df":1,"docs":{"42":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"v":{"df":1,"docs":{"38":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":10,"docs":{"15":{"tf":2.0},"16":{"tf":1.0},"18":{"tf":2.23606797749979},"20":{"tf":1.0},"23":{"tf":1.0},"3":{"tf":1.4142135623730951},"30":{"tf":1.0},"38":{"tf":1.4142135623730951},"40":{"tf":1.0},"6":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"n":{"c":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}}}}}},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"\'":{"df":1,"docs":{"55":{"tf":1.0}}},"_":{"a":{":":{"#":{"df":0,"docs":{},"x":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"54":{"tf":1.4142135623730951}}},"v":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"53":{"tf":2.6457513110645907},"54":{"tf":1.0}}},"b":{":":{"#":{"df":0,"docs":{},"x":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":2,"docs":{"53":{"tf":2.449489742783178},"54":{"tf":1.0}}},"df":0,"docs":{}},"b":{"df":1,"docs":{"54":{"tf":1.4142135623730951}}},"df":8,"docs":{"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.7320508075688772},"31":{"tf":1.0},"53":{"tf":1.7320508075688772},"54":{"tf":1.4142135623730951},"55":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"df":7,"docs":{"28":{"tf":1.4142135623730951},"30":{"tf":1.0},"33":{"tf":1.4142135623730951},"38":{"tf":1.7320508075688772},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0}}}}}},"l":{"_":{"a":{".":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"_":{"(":{"&":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"_":{"b":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"31":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"31":{"tf":1.0}}},"b":{"df":1,"docs":{"31":{"tf":1.0}}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"t":{"df":2,"docs":{"37":{"tf":1.0},"6":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":2,"docs":{"18":{"tf":1.0},"3":{"tf":1.0}}}}},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"z":{"df":0,"docs":{},"v":{"df":1,"docs":{"38":{"tf":1.0}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}},"y":{"_":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"38":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"1":{"tf":1.0},"4":{"tf":1.4142135623730951}}},"y":{"\'":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"r":{"(":{"c":{"df":2,"docs":{"25":{"tf":1.0},"54":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":3,"docs":{"15":{"tf":1.0},"23":{"tf":1.4142135623730951},"34":{"tf":1.0}}}}}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":7,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"7":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"v":{"df":2,"docs":{"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951}}}},"t":{"df":1,"docs":{"31":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"c":{"df":3,"docs":{"0":{"tf":1.0},"16":{"tf":1.0},"47":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"p":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"16":{"tf":1.0}}}}}},"t":{"df":1,"docs":{"2":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"16":{"tf":1.0},"21":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}}},"df":2,"docs":{"13":{"tf":1.0},"51":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"17":{"tf":1.0}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":3,"docs":{"16":{"tf":1.4142135623730951},"20":{"tf":1.7320508075688772},"55":{"tf":1.4142135623730951}}}}}},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"18":{"tf":1.0}}}}},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":5,"docs":{"15":{"tf":1.0},"20":{"tf":1.4142135623730951},"22":{"tf":1.0},"27":{"tf":1.4142135623730951},"41":{"tf":1.0}}}}}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"(":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"s":{"df":2,"docs":{"12":{"tf":1.0},"13":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":4,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"50":{"tf":1.0},"7":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"df":20,"docs":{"0":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.4142135623730951},"17":{"tf":1.0},"18":{"tf":2.449489742783178},"20":{"tf":1.4142135623730951},"23":{"tf":2.23606797749979},"25":{"tf":1.4142135623730951},"26":{"tf":2.23606797749979},"27":{"tf":1.0},"28":{"tf":1.7320508075688772},"33":{"tf":1.4142135623730951},"34":{"tf":1.4142135623730951},"41":{"tf":2.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951},"6":{"tf":3.0},"7":{"tf":2.0}}}},"u":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"n":{"df":11,"docs":{"15":{"tf":1.0},"2":{"tf":1.4142135623730951},"22":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":2.0},"4":{"tf":1.4142135623730951},"48":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":11,"docs":{"0":{"tf":2.0},"13":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":2.449489742783178},"48":{"tf":1.0},"49":{"tf":1.0},"50":{"tf":1.7320508075688772},"53":{"tf":1.0},"55":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772}}}}}},"s":{"df":0,"docs":{},"t":{"\'":{"df":1,"docs":{"18":{"tf":1.0}}},"c":{"df":3,"docs":{"0":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.4142135623730951}}},"d":{"df":0,"docs":{},"o":{"c":{"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":2,"docs":{"18":{"tf":1.0},"20":{"tf":1.0}}}}}}},"df":3,"docs":{"5":{"tf":3.0},"50":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":17,"docs":{"0":{"tf":2.6457513110645907},"1":{"tf":1.7320508075688772},"3":{"tf":1.4142135623730951},"34":{"tf":1.0},"37":{"tf":1.4142135623730951},"38":{"tf":1.7320508075688772},"4":{"tf":2.0},"40":{"tf":1.0},"41":{"tf":2.0},"48":{"tf":1.4142135623730951},"5":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772},"54":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.7320508075688772}}}}}},"s":{"a":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":1,"docs":{"55":{"tf":1.0}}}},"k":{"df":0,"docs":{},"e":{"df":1,"docs":{"5":{"tf":1.0}}}},"m":{"df":0,"docs":{},"e":{"df":4,"docs":{"41":{"tf":1.0},"42":{"tf":1.0},"46":{"tf":1.0},"50":{"tf":1.4142135623730951}}},"p":{"df":0,"docs":{},"l":{"df":1,"docs":{"16":{"tf":1.0}}}}},"w":{"df":1,"docs":{"41":{"tf":1.0}}}},"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"38":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"18":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"6":{"tf":1.4142135623730951}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"14":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}},"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":2,"docs":{"37":{"tf":2.23606797749979},"38":{"tf":1.0}}},"y":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"(":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":1,"docs":{"38":{"tf":1.0}}}},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"n":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":3,"docs":{"37":{"tf":1.0},"38":{"tf":1.0},"40":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":1,"docs":{"18":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},"df":0,"docs":{},"e":{"df":7,"docs":{"15":{"tf":1.0},"18":{"tf":1.0},"23":{"tf":1.0},"3":{"tf":1.0},"30":{"tf":1.0},"40":{"tf":1.0},"55":{"tf":1.0}},"k":{"df":1,"docs":{"24":{"tf":1.0}}},"n":{"df":1,"docs":{"41":{"tf":1.0}}}},"l":{"4":{"/":{"c":{"a":{"df":0,"docs":{},"p":{"/":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"#":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"d":{".":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{":":{":":{"c":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{":":{":":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"20":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{".":{"df":0,"docs":{},"h":{"df":2,"docs":{"37":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},":":{":":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"18":{"tf":1.7320508075688772},"20":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":3,"docs":{"17":{"tf":1.0},"26":{"tf":1.0},"29":{"tf":1.0}},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}}}}}},"c":{"a":{"df":0,"docs":{},"p":{":":{":":{"c":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"38":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":3,"docs":{"24":{"tf":1.0},"32":{"tf":1.0},"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"q":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"q":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":1,"docs":{"34":{"tf":1.0}}}}}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":2,"docs":{"34":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"r":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"q":{"_":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":2,"docs":{"34":{"tf":1.0},"35":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":4,"docs":{"18":{"tf":1.0},"37":{"tf":1.4142135623730951},"38":{"tf":1.0},"46":{"tf":1.4142135623730951}},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":1,"docs":{"19":{"tf":1.0}}}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"19":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"c":{"b":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"m":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":4,"docs":{"17":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0}},"e":{"d":{":":{":":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"18":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{":":{":":{"c":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"15":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"24":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"t":{"df":1,"docs":{"15":{"tf":1.0}}}},"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":2,"docs":{"23":{"tf":1.0},"32":{"tf":1.0}},"e":{":":{":":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"24":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"t":{"c":{"b":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"23":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"15":{"tf":1.0}},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{":":{":":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"20":{"tf":1.0},"21":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"21":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"_":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":2,"docs":{"15":{"tf":1.0},"23":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"s":{"df":1,"docs":{"24":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}}},"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"14":{"tf":1.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":{"7":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"37":{"tf":1.4142135623730951},"38":{"tf":1.4142135623730951}}}},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"a":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"16":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"16":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{".":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"25":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{":":{":":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{":":{":":{"c":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"31":{"tf":1.7320508075688772}},"e":{".":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"q":{"_":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{".":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"34":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"v":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"e":{".":{"c":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"<":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{":":{":":{"c":{"a":{"df":0,"docs":{},"p":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{":":{":":{"df":0,"docs":{},"g":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":1,"docs":{"26":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":2,"docs":{"20":{"tf":1.0},"31":{"tf":1.4142135623730951}}}}},"u":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{":":{":":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"31":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"18":{"tf":1.0},"24":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"40":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"d":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":1,"docs":{"30":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"27":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"c":{"_":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":3,"docs":{"38":{"tf":1.0},"39":{"tf":1.0},"51":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":3,"docs":{"38":{"tf":1.0},"39":{"tf":1.0},"51":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"_":{"a":{"b":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":1,"docs":{"55":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"27":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"18":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"_":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{":":{":":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"53":{"tf":1.0}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"q":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"34":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"_":{"a":{"c":{"df":0,"docs":{},"k":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}},"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"34":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":1,"docs":{"34":{"tf":1.0}}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"l":{"df":0,"docs":{},"i":{"b":{"df":2,"docs":{"37":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"g":{"df":1,"docs":{"14":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"i":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{":":{":":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":1,"docs":{"49":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"y":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"55":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":1,"docs":{"51":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}}}},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"c":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"50":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"50":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"v":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"53":{"tf":1.0},"55":{"tf":1.0}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"s":{"df":0,"docs":{},"{":{",":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"52":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"{":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"p":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"n":{"df":1,"docs":{"48":{"tf":1.0}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":3,"docs":{"48":{"tf":1.0},"50":{"tf":1.0},"51":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"34":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"s":{"df":1,"docs":{"12":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{":":{":":{"c":{"a":{"df":0,"docs":{},"t":{"c":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"10":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"13":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"34":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":21,"docs":{"0":{"tf":3.605551275463989},"1":{"tf":1.0},"14":{"tf":1.0},"15":{"tf":2.23606797749979},"16":{"tf":1.0},"18":{"tf":1.7320508075688772},"2":{"tf":1.4142135623730951},"20":{"tf":1.0},"23":{"tf":2.23606797749979},"3":{"tf":1.0},"30":{"tf":1.4142135623730951},"37":{"tf":1.7320508075688772},"38":{"tf":1.4142135623730951},"4":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":2.8284271247461903},"47":{"tf":2.0},"5":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"6":{"tf":3.0},"7":{"tf":1.7320508075688772}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"s":{"/":{"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":{},"h":{"df":1,"docs":{"41":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{".":{"df":0,"docs":{},"h":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"18":{"tf":1.0},"4":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"f":{":":{":":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"51":{"tf":1.4142135623730951},"53":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"51":{"tf":1.4142135623730951},"53":{"tf":1.0}}}},"n":{"d":{"df":4,"docs":{"38":{"tf":2.0},"39":{"tf":1.0},"41":{"tf":1.0},"52":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"\'":{"df":1,"docs":{"38":{"tf":1.4142135623730951}}},"df":1,"docs":{"38":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"p":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"4":{"tf":1.0}}}},"df":0,"docs":{}},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":2,"docs":{"36":{"tf":1.0},"46":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}}},"r":{"d":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"c":{"df":2,"docs":{"33":{"tf":1.0},"36":{"tf":1.0}},"e":{".":{"c":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"r":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"36":{"tf":1.0}}}}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"33":{"tf":1.0}}}}}},"p":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"_":{"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"(":{"*":{"c":{"df":1,"docs":{"33":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"_":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"c":{"a":{"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"_":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"(":{")":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"32":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":3,"docs":{"32":{"tf":1.0},"33":{"tf":1.0},"46":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"q":{"df":4,"docs":{"28":{"tf":1.0},"34":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.4142135623730951}}}}},"m":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"_":{"df":0,"docs":{},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":5,"docs":{"28":{"tf":1.0},"30":{"tf":1.4142135623730951},"31":{"tf":1.7320508075688772},"32":{"tf":1.4142135623730951},"45":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"33":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":15,"docs":{"28":{"tf":3.0},"29":{"tf":1.0},"30":{"tf":1.7320508075688772},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.7320508075688772},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.7320508075688772},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":2.23606797749979},"52":{"tf":1.0}}}},"df":1,"docs":{"1":{"tf":1.0}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"\'":{"df":1,"docs":{"52":{"tf":1.0}}},".":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"f":{"df":2,"docs":{"51":{"tf":1.0},"53":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"p":{"_":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"52":{"tf":1.0}},"l":{"(":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{":":{":":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"a":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"53":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":4,"docs":{"4":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":1.0},"54":{"tf":1.0}}}},"i":{"c":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}}},"t":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"r":{"df":1,"docs":{"51":{"tf":1.0}}}}},"df":6,"docs":{"10":{"tf":1.4142135623730951},"23":{"tf":1.0},"28":{"tf":1.0},"41":{"tf":1.0},"46":{"tf":1.0},"5":{"tf":1.0}},"u":{"df":0,"docs":{},"p":{"df":5,"docs":{"1":{"tf":1.7320508075688772},"2":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0}}}},"v":{"a":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"v":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"=":{"\\"":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"a":{"_":{"df":0,"docs":{},"v":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"_":{"df":0,"docs":{},"v":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"h":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"1":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":1,"docs":{"18":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"e":{"df":4,"docs":{"23":{"tf":1.0},"53":{"tf":3.1622776601683795},"54":{"tf":1.7320508075688772},"55":{"tf":2.23606797749979}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"2":{"tf":1.4142135623730951}}}}},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"0":{"tf":1.0}}}}}},"w":{"df":1,"docs":{"41":{"tf":1.0}}}}},"i":{"d":{"df":0,"docs":{},"e":{"b":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}},"df":1,"docs":{"38":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":2,"docs":{"19":{"tf":1.0},"20":{"tf":1.7320508075688772}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":2,"docs":{"49":{"tf":1.0},"7":{"tf":1.0}}}}}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"r":{"df":2,"docs":{"42":{"tf":1.0},"46":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":2,"docs":{"41":{"tf":1.0},"46":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"l":{"df":2,"docs":{"14":{"tf":1.0},"28":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"49":{"tf":1.0}}}}},"i":{"df":1,"docs":{"44":{"tf":1.0}},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"3":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"l":{"df":9,"docs":{"15":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":1.0},"48":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0},"7":{"tf":1.0}},"t":{"a":{"df":0,"docs":{},"n":{"df":1,"docs":{"18":{"tf":1.0}}}},"df":0,"docs":{}}}}},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"18":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}},"z":{"df":0,"docs":{},"e":{"=":{"\\"":{"0":{"df":0,"docs":{},"x":{"1":{"_":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"18":{"tf":1.4142135623730951},"31":{"tf":1.7320508075688772}}}}},"df":0,"docs":{}},"df":8,"docs":{"12":{"tf":1.7320508075688772},"13":{"tf":1.0},"16":{"tf":3.0},"18":{"tf":1.7320508075688772},"20":{"tf":1.4142135623730951},"23":{"tf":1.0},"25":{"tf":1.0},"38":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"55":{"tf":1.0}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"t":{"<":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"df":5,"docs":{"15":{"tf":1.7320508075688772},"18":{"tf":3.0},"20":{"tf":1.7320508075688772},"26":{"tf":1.0},"31":{"tf":1.4142135623730951}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"<":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"17":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}}}}}}}},"m":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"32":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"23":{"tf":1.0}}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":1,"docs":{"38":{"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":2,"docs":{"24":{"tf":1.0},"29":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"33":{"tf":1.0},"52":{"tf":1.0}}}},"w":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.0}}}}}}}},"r":{"df":0,"docs":{},"t":{"df":1,"docs":{"41":{"tf":1.0}}}},"u":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"48":{"tf":1.0},"7":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"5":{":":{"2":{"0":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"6":{":":{"4":{"9":{"df":1,"docs":{"25":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"1":{":":{"5":{"4":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"3":{":":{"8":{"4":{"df":1,"docs":{"26":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":12,"docs":{"15":{"tf":1.4142135623730951},"23":{"tf":3.3166247903554},"24":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"27":{"tf":1.0},"28":{"tf":1.0},"33":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"46":{"tf":1.0},"53":{"tf":1.0},"6":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":12,"docs":{"34":{"tf":1.0},"37":{"tf":2.449489742783178},"38":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":3.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"6":{"tf":1.0}}}}},"df":0,"docs":{},"e":{"c":{"df":1,"docs":{"3":{"tf":1.0}},"i":{"a":{"df":0,"docs":{},"l":{"df":3,"docs":{"34":{"tf":1.0},"38":{"tf":1.0},"55":{"tf":1.0}}}},"df":0,"docs":{},"f":{"df":4,"docs":{"0":{"tf":1.0},"23":{"tf":1.0},"3":{"tf":1.7320508075688772},"34":{"tf":1.0}},"i":{"df":5,"docs":{"18":{"tf":1.4142135623730951},"20":{"tf":1.0},"38":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.4142135623730951}}}}}},"df":0,"docs":{}}},"r":{"c":{"_":{"df":1,"docs":{"18":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"t":{"a":{"c":{"df":0,"docs":{},"k":{"_":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":2,"docs":{"12":{"tf":1.0},"13":{"tf":1.0}}}}}},"df":4,"docs":{"11":{"tf":1.0},"12":{"tf":2.0},"37":{"tf":1.0},"41":{"tf":1.0}}}},"df":0,"docs":{},"n":{"d":{"a":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"41":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"t":{"df":8,"docs":{"1":{"tf":1.4142135623730951},"15":{"tf":1.0},"2":{"tf":1.0},"23":{"tf":1.0},"28":{"tf":1.0},"37":{"tf":1.0},"41":{"tf":1.4142135623730951},"54":{"tf":1.0}}}},"t":{"df":0,"docs":{},"e":{"df":3,"docs":{"20":{"tf":1.4142135623730951},"42":{"tf":1.0},"53":{"tf":1.0}}},"i":{"c":{"df":4,"docs":{"14":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"47":{"tf":1.0}}},"df":0,"docs":{}}}},"d":{"df":1,"docs":{"7":{"tf":1.7320508075688772}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"\'":{"df":1,"docs":{"55":{"tf":1.0}}},"df":39,"docs":{"1":{"tf":2.6457513110645907},"10":{"tf":1.4142135623730951},"11":{"tf":1.4142135623730951},"12":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.7320508075688772},"16":{"tf":1.4142135623730951},"17":{"tf":1.4142135623730951},"18":{"tf":1.7320508075688772},"19":{"tf":1.4142135623730951},"20":{"tf":1.4142135623730951},"21":{"tf":1.4142135623730951},"22":{"tf":1.4142135623730951},"24":{"tf":1.4142135623730951},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"27":{"tf":1.4142135623730951},"29":{"tf":1.4142135623730951},"30":{"tf":1.7320508075688772},"31":{"tf":1.4142135623730951},"32":{"tf":1.4142135623730951},"33":{"tf":2.23606797749979},"34":{"tf":1.4142135623730951},"35":{"tf":1.4142135623730951},"36":{"tf":1.4142135623730951},"38":{"tf":1.7320508075688772},"39":{"tf":1.4142135623730951},"40":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"42":{"tf":2.23606797749979},"43":{"tf":2.0},"44":{"tf":2.23606797749979},"45":{"tf":1.7320508075688772},"46":{"tf":2.6457513110645907},"52":{"tf":1.4142135623730951},"54":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951},"8":{"tf":1.4142135623730951},"9":{"tf":1.4142135623730951}}}},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"41":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":1,"docs":{"53":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"u":{"c":{"df":0,"docs":{},"t":{"df":6,"docs":{"23":{"tf":1.0},"25":{"tf":1.0},"48":{"tf":1.0},"51":{"tf":1.4142135623730951},"53":{"tf":1.0},"54":{"tf":1.0}},"u":{"df":0,"docs":{},"r":{"df":3,"docs":{"23":{"tf":1.7320508075688772},"25":{"tf":1.0},"7":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"b":{"df":1,"docs":{"6":{"tf":1.0}}},"d":{"df":0,"docs":{},"i":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}}},"u":{"b":{"df":1,"docs":{"46":{"tf":1.4142135623730951}},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"42":{"tf":1.0}}}}}}},"c":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"32":{"tf":1.0}}}},"df":0,"docs":{},"h":{"df":7,"docs":{"14":{"tf":1.0},"16":{"tf":1.0},"37":{"tf":1.4142135623730951},"47":{"tf":1.0},"53":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":1,"docs":{"55":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"m":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"18":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"t":{"df":3,"docs":{"0":{"tf":1.0},"50":{"tf":1.0},"7":{"tf":1.0}}}},"s":{"df":1,"docs":{"54":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}}}}},"y":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":3,"docs":{"53":{"tf":2.449489742783178},"54":{"tf":1.0},"55":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}},"s":{"c":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"40":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"\'":{"df":1,"docs":{"16":{"tf":1.0}}},"df":6,"docs":{"15":{"tf":1.0},"47":{"tf":1.0},"51":{"tf":1.7320508075688772},"53":{"tf":1.7320508075688772},"54":{"tf":1.0},"6":{"tf":1.0}}}}}}}},"t":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"15":{"tf":1.0},"23":{"tf":1.0}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":4,"docs":{"31":{"tf":1.0},"38":{"tf":1.4142135623730951},"43":{"tf":1.0},"50":{"tf":1.0}}}},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":5,"docs":{"0":{"tf":1.0},"18":{"tf":1.7320508075688772},"3":{"tf":1.7320508075688772},"31":{"tf":1.0},"7":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"k":{"\'":{"df":14,"docs":{"12":{"tf":1.4142135623730951},"13":{"tf":1.0},"16":{"tf":1.0},"20":{"tf":1.0},"23":{"tf":1.7320508075688772},"25":{"tf":1.4142135623730951},"26":{"tf":1.7320508075688772},"27":{"tf":1.0},"28":{"tf":1.4142135623730951},"33":{"tf":1.4142135623730951},"43":{"tf":1.4142135623730951},"46":{"tf":1.4142135623730951},"6":{"tf":1.4142135623730951},"7":{"tf":1.0}}},".":{"df":0,"docs":{},"m":{"df":0,"docs":{},"k":{":":{"3":{"1":{":":{"3":{"6":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"/":{".":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"3":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":3,"docs":{"23":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":5,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":2.0},"20":{"tf":1.0}}}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"28":{"tf":1.7320508075688772},"29":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"32":{"tf":1.0},"33":{"tf":1.0}}}}},"p":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":5,"docs":{"37":{"tf":1.7320508075688772},"38":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0}}}}},"df":0,"docs":{}},"r":{"c":{"/":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"d":{"_":{"df":0,"docs":{},"v":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"43":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"_":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{".":{"df":0,"docs":{},"r":{"df":1,"docs":{"42":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":19,"docs":{"0":{"tf":1.4142135623730951},"14":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"20":{"tf":1.0},"23":{"tf":1.0},"26":{"tf":1.4142135623730951},"28":{"tf":1.0},"3":{"tf":1.0},"34":{"tf":1.4142135623730951},"41":{"tf":4.242640687119285},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.4142135623730951},"45":{"tf":1.4142135623730951},"46":{"tf":2.449489742783178},"6":{"tf":2.6457513110645907},"7":{"tf":1.7320508075688772}}}}},"df":4,"docs":{"15":{"tf":1.7320508075688772},"18":{"tf":1.0},"49":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951}},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":2,"docs":{"18":{"tf":1.0},"34":{"tf":1.0}}}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"31":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}},"r":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}},"s":{"df":0,"docs":{},"t":{"_":{"df":0,"docs":{},"p":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"51":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":2,"docs":{"1":{"tf":1.4142135623730951},"41":{"tf":1.0}}}},"x":{"df":0,"docs":{},"t":{"df":7,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"2":{"tf":1.0},"38":{"tf":1.0},"47":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"v":{"df":1,"docs":{"1":{"tf":1.0}}}}}}}},"i":{"df":0,"docs":{},"n":{"df":2,"docs":{"51":{"tf":1.0},"55":{"tf":1.0}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":2,"docs":{"1":{"tf":1.4142135623730951},"41":{"tf":1.0}}}},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":1,"docs":{"37":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"d":{"\'":{"df":3,"docs":{"12":{"tf":1.4142135623730951},"15":{"tf":1.0},"18":{"tf":2.449489742783178}}},"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"7":{"5":{":":{"7":{"9":{"df":2,"docs":{"37":{"tf":1.0},"38":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"1":{":":{"8":{"5":{"df":1,"docs":{"37":{"tf":1.0}}},"7":{"df":1,"docs":{"38":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":8,"docs":{"15":{"tf":1.7320508075688772},"23":{"tf":1.0},"37":{"tf":3.3166247903554},"38":{"tf":2.0},"39":{"tf":1.0},"40":{"tf":1.0},"41":{"tf":1.4142135623730951},"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":2,"docs":{"47":{"tf":1.0},"7":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"h":{"df":3,"docs":{"37":{"tf":1.0},"42":{"tf":1.0},"47":{"tf":1.0}}}}}}},"u":{"df":1,"docs":{"15":{"tf":1.0}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":6,"docs":{"13":{"tf":1.0},"16":{"tf":1.0},"2":{"tf":1.0},"53":{"tf":1.0},"54":{"tf":1.0},"6":{"tf":1.7320508075688772}}}}},"l":{"df":2,"docs":{"37":{"tf":1.0},"41":{"tf":1.0}}},"o":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"51":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":2,"docs":{"38":{"tf":1.0},"55":{"tf":1.0}}}}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"15":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":2,"docs":{"2":{"tf":1.0},"53":{"tf":1.4142135623730951}}}},"p":{"df":4,"docs":{"14":{"tf":1.0},"23":{"tf":1.0},"3":{"tf":1.0},"5":{"tf":1.0}}},"w":{"a":{"df":0,"docs":{},"r":{"d":{"df":2,"docs":{"18":{"tf":1.0},"41":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"r":{"a":{"c":{"df":0,"docs":{},"k":{"df":2,"docs":{"18":{"tf":1.0},"42":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":2,"docs":{"24":{"tf":1.0},"49":{"tf":1.0}}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"t":{"df":3,"docs":{"15":{"tf":1.4142135623730951},"23":{"tf":1.4142135623730951},"25":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"23":{"tf":1.0}}}},"i":{"df":3,"docs":{"26":{"tf":1.0},"33":{"tf":1.0},"46":{"tf":1.4142135623730951}},"m":{"_":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"31":{"tf":1.7320508075688772}}}}}}}},"df":0,"docs":{}},"v":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"16":{"tf":2.6457513110645907}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":3,"docs":{"17":{"tf":1.0},"20":{"tf":1.0},"54":{"tf":1.0}}}},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":5,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":2.0},"18":{"tf":1.0},"47":{"tf":1.0},"6":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"o":{"df":12,"docs":{"1":{"tf":1.0},"18":{"tf":1.0},"23":{"tf":1.0},"3":{"tf":1.7320508075688772},"30":{"tf":1.0},"31":{"tf":1.4142135623730951},"37":{"tf":1.0},"38":{"tf":1.7320508075688772},"41":{"tf":1.0},"5":{"tf":1.4142135623730951},"51":{"tf":1.0},"53":{"tf":1.4142135623730951}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"\'":{"df":1,"docs":{"18":{"tf":1.0}}},"df":17,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"15":{"tf":2.8284271247461903},"16":{"tf":1.0},"18":{"tf":2.449489742783178},"20":{"tf":1.0},"23":{"tf":2.0},"30":{"tf":1.0},"38":{"tf":1.4142135623730951},"42":{"tf":1.0},"44":{"tf":1.4142135623730951},"48":{"tf":1.0},"51":{"tf":2.449489742783178},"52":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951},"54":{"tf":1.7320508075688772},"55":{"tf":2.0}}},"i":{"c":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}}}},"u":{"1":{"6":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"6":{"4":{"df":1,"docs":{"54":{"tf":1.0}}},"df":0,"docs":{}},"8":{"df":3,"docs":{"25":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0}}},"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":2,"docs":{"38":{"tf":1.0},"51":{"tf":1.0}},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"55":{"tf":1.0}}}},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"n":{"d":{"df":1,"docs":{"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":1,"docs":{"15":{"tf":1.0}}}}}},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":1,"docs":{"6":{"tf":1.0}}}}},"m":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"s":{"a":{"df":0,"docs":{},"f":{"df":4,"docs":{"26":{"tf":1.0},"33":{"tf":1.0},"54":{"tf":1.4142135623730951},"55":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":3,"docs":{"31":{"tf":1.0},"38":{"tf":1.0},"42":{"tf":1.0}}}},"y":{"df":0,"docs":{},"p":{"df":6,"docs":{"16":{"tf":2.0},"17":{"tf":1.0},"18":{"tf":2.23606797749979},"30":{"tf":2.449489742783178},"31":{"tf":2.0},"42":{"tf":2.449489742783178}},"e":{"d":{"\'":{"df":2,"docs":{"30":{"tf":1.0},"31":{"tf":1.0}}},"_":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"18":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"w":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"p":{"df":4,"docs":{"17":{"tf":1.0},"18":{"tf":1.0},"29":{"tf":1.0},"31":{"tf":1.0}}}},"df":0,"docs":{}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":1,"docs":{"18":{"tf":1.0}}}}}},"p":{"d":{"a":{"df":0,"docs":{},"t":{"df":1,"docs":{"20":{"tf":1.0}}}},"df":0,"docs":{}},"df":7,"docs":{"15":{"tf":1.0},"18":{"tf":1.0},"28":{"tf":1.0},"38":{"tf":1.0},"41":{"tf":1.0},"46":{"tf":1.0},"54":{"tf":1.0}}},"s":{"df":46,"docs":{"0":{"tf":1.7320508075688772},"1":{"tf":1.4142135623730951},"13":{"tf":1.4142135623730951},"14":{"tf":1.0},"15":{"tf":1.4142135623730951},"16":{"tf":1.4142135623730951},"18":{"tf":1.7320508075688772},"19":{"tf":1.0},"20":{"tf":2.449489742783178},"21":{"tf":1.0},"22":{"tf":1.0},"23":{"tf":1.4142135623730951},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.7320508075688772},"27":{"tf":1.4142135623730951},"28":{"tf":1.7320508075688772},"29":{"tf":1.4142135623730951},"30":{"tf":2.0},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.4142135623730951},"34":{"tf":2.0},"35":{"tf":1.4142135623730951},"36":{"tf":2.23606797749979},"37":{"tf":2.23606797749979},"38":{"tf":2.23606797749979},"39":{"tf":1.0},"4":{"tf":1.4142135623730951},"41":{"tf":1.4142135623730951},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"46":{"tf":2.0},"47":{"tf":1.0},"48":{"tf":1.0},"49":{"tf":1.0},"5":{"tf":1.0},"51":{"tf":1.0},"52":{"tf":2.449489742783178},"53":{"tf":1.0},"54":{"tf":1.4142135623730951},"55":{"tf":1.0},"6":{"tf":2.23606797749979},"7":{"tf":1.0},"9":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"_":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"_":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"26":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"26":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":1,"docs":{"15":{"tf":1.4142135623730951}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":6,"docs":{"0":{"tf":2.0},"15":{"tf":1.0},"16":{"tf":1.0},"34":{"tf":1.4142135623730951},"41":{"tf":1.0},"6":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"i":{"df":0,"docs":{},"z":{"df":9,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":2.0},"28":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"53":{"tf":2.449489742783178},"54":{"tf":1.0},"55":{"tf":1.0}}}}},"t":{".":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"d":{"_":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"y":{"df":0,"docs":{},"p":{"df":1,"docs":{"31":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"_":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"c":{"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"_":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"16":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":1,"docs":{"16":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":2,"docs":{"17":{"tf":1.0},"29":{"tf":1.0}}}},"p":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"31":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":1,"docs":{"31":{"tf":1.0}},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"14":{"tf":1.0}}}}}},"v":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"=":{"\\"":{"0":{"df":0,"docs":{},"x":{"2":{"_":{"0":{"0":{"0":{"_":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"0":{"0":{"_":{"0":{"0":{"0":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}},"u":{"df":8,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"20":{"tf":2.0},"24":{"tf":1.0},"28":{"tf":1.0},"38":{"tf":1.0},"53":{"tf":1.4142135623730951},"55":{"tf":1.0}}}},"r":{"!":{"(":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"_":{"a":{"_":{"df":0,"docs":{},"v":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"b":{"_":{"df":0,"docs":{},"v":{"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}},"df":2,"docs":{"53":{"tf":1.0},"54":{"tf":1.0}},"i":{"a":{"b":{"df":0,"docs":{},"l":{"df":2,"docs":{"3":{"tf":1.4142135623730951},"53":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":1,"docs":{"37":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"a":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}}}},"i":{"a":{"df":3,"docs":{"15":{"tf":1.0},"34":{"tf":1.0},"38":{"tf":1.0}}},"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"52":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":2,"docs":{"38":{"tf":1.0},"52":{"tf":1.0}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"l":{"df":10,"docs":{"15":{"tf":1.4142135623730951},"23":{"tf":2.449489742783178},"25":{"tf":1.0},"26":{"tf":1.0},"33":{"tf":1.4142135623730951},"46":{"tf":1.0},"53":{"tf":1.4142135623730951},"54":{"tf":1.0},"55":{"tf":1.0},"6":{"tf":1.0}}}},"df":0,"docs":{}}}}},"s":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"4":{"tf":2.449489742783178}}}},"df":0,"docs":{}}},"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":3,"docs":{"23":{"tf":2.23606797749979},"26":{"tf":1.4142135623730951},"27":{"tf":1.4142135623730951}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"w":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":3,"docs":{"19":{"tf":1.0},"20":{"tf":1.4142135623730951},"36":{"tf":1.0}}}},"n":{"df":0,"docs":{},"t":{"df":2,"docs":{"4":{"tf":1.0},"53":{"tf":1.0}}}},"t":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"21":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":3,"docs":{"18":{"tf":1.4142135623730951},"31":{"tf":1.7320508075688772},"42":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"y":{"df":6,"docs":{"14":{"tf":1.0},"18":{"tf":2.0},"38":{"tf":1.0},"46":{"tf":1.0},"55":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"\'":{"df":0,"docs":{},"v":{"df":3,"docs":{"31":{"tf":1.0},"37":{"tf":1.0},"49":{"tf":1.0}}}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"15":{"tf":1.0}}}}},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":2,"docs":{"16":{"tf":1.0},"3":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"16":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":7,"docs":{"12":{"tf":1.0},"13":{"tf":1.0},"18":{"tf":1.0},"28":{"tf":1.4142135623730951},"30":{"tf":1.0},"42":{"tf":1.0},"6":{"tf":1.0}}}}}},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"38":{"tf":1.0}},"r":{"df":1,"docs":{"52":{"tf":1.0}}}}},"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":1,"docs":{"20":{"tf":1.0}}},"h":{"df":1,"docs":{"18":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"_":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}},"e":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":1,"docs":{"51":{"tf":1.0}},"s":{"_":{"df":0,"docs":{},"m":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"51":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":3,"docs":{"15":{"tf":1.0},"18":{"tf":1.0},"5":{"tf":1.0}}}},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":2,"docs":{"42":{"tf":1.0},"55":{"tf":1.0}}}}}}}},"o":{"df":0,"docs":{},"n":{"\'":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}},"r":{"d":{"df":3,"docs":{"15":{"tf":1.0},"20":{"tf":1.4142135623730951},"38":{"tf":1.4142135623730951}}},"df":0,"docs":{},"k":{"df":9,"docs":{"1":{"tf":1.0},"18":{"tf":1.0},"2":{"tf":1.0},"27":{"tf":1.4142135623730951},"37":{"tf":1.0},"4":{"tf":1.0},"46":{"tf":1.0},"47":{"tf":1.0},"6":{"tf":1.0}},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":3,"docs":{"3":{"tf":2.0},"4":{"tf":1.7320508075688772},"5":{"tf":1.7320508075688772}},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"/":{".":{"c":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{".":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"3":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"48":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"p":{"c":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"53":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":1,"docs":{"3":{"tf":1.0}}}}}}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":20,"docs":{"15":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":2.0},"20":{"tf":1.0},"23":{"tf":1.0},"25":{"tf":1.4142135623730951},"26":{"tf":1.4142135623730951},"28":{"tf":1.7320508075688772},"29":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"31":{"tf":1.4142135623730951},"32":{"tf":1.0},"33":{"tf":1.0},"37":{"tf":1.7320508075688772},"38":{"tf":1.4142135623730951},"41":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"7":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"d":{"!":{"\\\\":{"df":0,"docs":{},"n":{"df":1,"docs":{"33":{"tf":1.0}}}},"df":0,"docs":{}},"/":{"df":0,"docs":{},"p":{"d":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"7":{":":{"2":{"2":{"df":1,"docs":{"48":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"s":{"df":0,"docs":{},"r":{"c":{"/":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{":":{"1":{"7":{":":{"2":{"0":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"1":{"df":1,"docs":{"14":{"tf":1.0}}},"df":0,"docs":{}},"7":{":":{"1":{"7":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":12,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"33":{"tf":1.0},"48":{"tf":2.449489742783178},"49":{"tf":1.0},"50":{"tf":1.0},"7":{"tf":2.449489742783178},"8":{"tf":1.0},"9":{"tf":1.0}}},"df":0,"docs":{}},"s":{"df":1,"docs":{"42":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"p":{"df":1,"docs":{"15":{"tf":1.0}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":3,"docs":{"15":{"tf":1.0},"51":{"tf":1.0},"55":{"tf":1.0}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"(":{"df":0,"docs":{},"|":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":3,"docs":{"1":{"tf":1.0},"36":{"tf":1.4142135623730951},"6":{"tf":1.0}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"24":{"tf":1.0},"48":{"tf":1.0},"51":{"tf":1.0},"53":{"tf":1.0}}}}}}}}},"x":{"df":1,"docs":{"7":{"tf":1.0}},"m":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"\'":{"df":0,"docs":{},"r":{"df":1,"docs":{"37":{"tf":1.0}}}},"df":0,"docs":{}}}},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"i":{"df":1,"docs":{"52":{"tf":1.0}}},"y":{":":{":":{"df":0,"docs":{},"{":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"b":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"54":{"tf":1.0}}}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":2,"docs":{"18":{"tf":1.0},"20":{"tf":1.0}}}}}}}},"title":{"root":{"1":{"0":{".":{"a":{"df":1,"docs":{"52":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{".":{"a":{"df":1,"docs":{"54":{"tf":1.0}}},"b":{"df":1,"docs":{"55":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{".":{"a":{"df":1,"docs":{"8":{"tf":1.0}}},"b":{"df":1,"docs":{"9":{"tf":1.0}}},"c":{"df":1,"docs":{"10":{"tf":1.0}}},"d":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"12":{"tf":1.0}}},"f":{"df":1,"docs":{"13":{"tf":1.0}}},"g":{"df":1,"docs":{"14":{"tf":1.0}}}},"df":0,"docs":{}},"3":{".":{"a":{"df":1,"docs":{"16":{"tf":1.0}}},"b":{"df":1,"docs":{"17":{"tf":1.0}}},"c":{"df":1,"docs":{"18":{"tf":1.0}}},"d":{"df":1,"docs":{"19":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"20":{"tf":1.0}}},"f":{"df":1,"docs":{"21":{"tf":1.0}}},"g":{"df":1,"docs":{"22":{"tf":1.0}}}},"df":0,"docs":{}},"4":{".":{"a":{"df":1,"docs":{"24":{"tf":1.0}}},"b":{"df":1,"docs":{"25":{"tf":1.0}}},"c":{"df":1,"docs":{"26":{"tf":1.0}}},"d":{"df":1,"docs":{"27":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{".":{"a":{"df":1,"docs":{"29":{"tf":1.0}}},"b":{"df":1,"docs":{"30":{"tf":1.0}}},"c":{"df":1,"docs":{"31":{"tf":1.0}}},"d":{"df":1,"docs":{"32":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"33":{"tf":1.0}}},"f":{"df":1,"docs":{"34":{"tf":1.0}}},"g":{"df":1,"docs":{"35":{"tf":1.0}}},"h":{"df":1,"docs":{"36":{"tf":1.0}}}},"df":0,"docs":{}},"6":{".":{"a":{"df":1,"docs":{"38":{"tf":1.0}}},"b":{"df":1,"docs":{"39":{"tf":1.0}}},"c":{"df":1,"docs":{"40":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{".":{"a":{"df":1,"docs":{"42":{"tf":1.0}}},"b":{"df":1,"docs":{"43":{"tf":1.0}}},"c":{"df":1,"docs":{"44":{"tf":1.0}}},"d":{"df":1,"docs":{"45":{"tf":1.0}}},"df":0,"docs":{},"e":{"df":1,"docs":{"46":{"tf":1.0}}}},"df":0,"docs":{}},"a":{"d":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"s":{"df":1,"docs":{"23":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"15":{"tf":1.0}}},"df":0,"docs":{}}}}},"c":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":2,"docs":{"41":{"tf":1.0},"46":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"4":{"tf":1.0}},"i":{"c":{"df":1,"docs":{"28":{"tf":1.0}}},"df":0,"docs":{}}}},"o":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"2":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"49":{"tf":1.0}}}}}},"x":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":20,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"27":{"tf":1.0},"30":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"52":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}},"df":0,"docs":{}}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"49":{"tf":1.0}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":2,"docs":{"48":{"tf":1.0},"7":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"p":{"c":{"df":1,"docs":{"51":{"tf":1.0}}},"df":0,"docs":{}}},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":1,"docs":{"15":{"tf":1.0}}}}}}}},"l":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"50":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"53":{"tf":1.0}}}}}}},"i":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"47":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"o":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"23":{"tf":1.0}}}}}},"df":0,"docs":{}}},"o":{"b":{"df":0,"docs":{},"j":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"15":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"6":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"50":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"t":{"d":{"df":0,"docs":{},"o":{"c":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}}},"df":1,"docs":{"0":{"tf":1.0}}}}}},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"4":{"df":2,"docs":{"0":{"tf":1.0},"47":{"tf":1.0}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"l":{"df":1,"docs":{"28":{"tf":1.0}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":1,"docs":{"1":{"tf":1.0}}}}}},"h":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":1,"docs":{"53":{"tf":1.0}}}}},"df":0,"docs":{}},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"23":{"tf":1.0}}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":2,"docs":{"37":{"tf":1.0},"41":{"tf":1.0}}}}},"df":0,"docs":{}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":37,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"12":{"tf":1.0},"13":{"tf":1.0},"14":{"tf":1.0},"16":{"tf":1.0},"17":{"tf":1.0},"18":{"tf":1.0},"19":{"tf":1.0},"20":{"tf":1.0},"21":{"tf":1.0},"22":{"tf":1.0},"24":{"tf":1.0},"25":{"tf":1.0},"26":{"tf":1.0},"27":{"tf":1.0},"29":{"tf":1.0},"30":{"tf":1.0},"31":{"tf":1.0},"32":{"tf":1.0},"33":{"tf":1.0},"34":{"tf":1.0},"35":{"tf":1.0},"36":{"tf":1.0},"38":{"tf":1.0},"39":{"tf":1.0},"40":{"tf":1.0},"42":{"tf":1.0},"43":{"tf":1.0},"44":{"tf":1.0},"45":{"tf":1.0},"46":{"tf":1.0},"52":{"tf":1.0},"54":{"tf":1.0},"55":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":2,"docs":{"41":{"tf":1.0},"6":{"tf":1.0}}}}},"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"d":{"df":1,"docs":{"37":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"0":{"tf":1.0}}}}}}},"w":{"df":0,"docs":{},"o":{"df":1,"docs":{"3":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"s":{"df":2,"docs":{"0":{"tf":1.0},"28":{"tf":1.0}},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"0":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"v":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"4":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"w":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"df":0,"docs":{},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"l":{"d":{"df":2,"docs":{"48":{"tf":1.0},"7":{"tf":1.0}}},"df":0,"docs":{}}}}}}}},"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/projects/rust/tutorial/setup.html b/projects/rust/tutorial/setup.html new file mode 100644 index 00000000000..c92358a8c8d --- /dev/null +++ b/projects/rust/tutorial/setup.html @@ -0,0 +1,290 @@ + + + + + + Setup - Using Rust in seL4 Userspace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+ +

Setup

+

This tutorial is presented as a linear series of patches to https://github.com/seL4/seL4-rust-tutorial-code, starting at commit 8ca0e1939dc1, and ending with commit 5253edc1ed12. +Each patch, or step, as we shall call them, is an instructive modification to a code example. +You are encouraged (but by no means required) to attempt those marked as exercises in this text on your own. +Note that while most step patches include tests, the reader is not expected to write tests for exercises themselves.

+

Clone the repository and checkout the starting commit:

+
git clone https://github.com/seL4/seL4-rust-tutorial-code
+cd seL4-rust-tutorial-code
+git checkout 8ca0e1939dc1
+
+

Observe the steps ahead:

+
git log 8ca0e1939dc1..5253edc1ed12
+
+

Each step header contains two icons. +Clicking the clipboard copies the commit hash corresponding to the step to the clipboard. +The GitHub icon is a link to the commit on GitHub.

+

Use any Git workflow that works for you. +For example, you could cherry-pick the steps that are not marked as exercises after examining and understanding them, and then attempt the exercises on your own, using those step commits as hints when necessary.

+

Docker

+

We will work inside of a Docker container built with docker/Dockerfile. +This Dockerfile installs some build-time dependencies, and then builds seL4, seL4 Microkit, and some additional programs and tools.

+

Build the image:

+
make -C docker build
+
+

Run a container in the background:

+
make -C docker run
+
+

Start a shell inside the container:

+
make -C docker exec
+
+

The rest of this text assumes that you are in a shell inside the container.

+

Two Workspaces

+

To simplify our Cargo invocations, this repository's Rust code has been divided between two distinct workspaces: workspaces/root-task and workspaces/microkit. +Both are subject to the top-level .cargo/config.toml, whereas workspaces/root-task/.cargo/config.toml and workspaces/microkit/.cargo/config.toml each apply to only one. +These workspace-specific config.toml files demonstrate all that is required to configure the crates in the rust-sel4 project:

+ +

VSCode + Dev Containers

+

If you want help from rust-analyzer, the Rust Language Server, you can use VSCode with the Dev Containers extension. +This will enable you to run VSCode inside of the container you just built, which contains the seL4 build artifacts that rust-analyzer will require to analyzer your code.

+

This repository provides a separate Dev Container configuration for each workspace:

+ +

To work in a particular workspace, open this repository in VSCode, run > Dev Containers: Reopen in Container, and select the corresponding configuration. +You should now be able to use the rust-analyzer VSCode extension normally for the code in the selected workspace.

+

Rustdoc

+

Rustdoc for the rust-sel4 project is hosted here:

+

https://sel4.github.io/rust-sel4/

+

However, for the sake of consistency, rustdoc for the particular configurations studied in this text are hosted here too. +There is one set of rustdoc for each of the two workspace configurations mentioned in Two Workspaces. +Rustdoc does not generate an index page, but you can navigate across crates within a workspace configuration using the sidebar present on top-level rustdoc page for any module.

+ + +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/projects/rust/tutorial/toc.html b/projects/rust/tutorial/toc.html new file mode 100644 index 00000000000..7c417bd8be1 --- /dev/null +++ b/projects/rust/tutorial/toc.html @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + +
  1. Introduction
  2. Setup
  3. Part I: The Root Task
  4. Overview
  5. Hello, World!
  6. Allocating Kernel Objects
  7. Modifying the Address Space
  8. Using a Serial Device
  9. Spawning a Thread
  10. Spawning a Task (Challenge)
  11. Part II: Microkit
  12. Overview
  13. Hello, World!
  14. IPC
  15. Shared Memory
+ + diff --git a/projects/rust/tutorial/toc.js b/projects/rust/tutorial/toc.js new file mode 100644 index 00000000000..abd87abf9e1 --- /dev/null +++ b/projects/rust/tutorial/toc.js @@ -0,0 +1,70 @@ +// Populate the sidebar +// +// This is a script, and not included directly in the page, to control the total size of the book. +// The TOC contains an entry for each page, so if each page includes a copy of the TOC, +// the total size of the page becomes O(n**2). +class MDBookSidebarScrollbox extends HTMLElement { + constructor() { + super(); + } + connectedCallback() { + this.innerHTML = '
  1. Introduction
  2. Setup
  3. Part I: The Root Task
  4. Overview
  5. Hello, World!
  6. Allocating Kernel Objects
  7. Modifying the Address Space
  8. Using a Serial Device
  9. Spawning a Thread
  10. Spawning a Task (Challenge)
  11. Part II: Microkit
  12. Overview
  13. Hello, World!
  14. IPC
  15. Shared Memory
  16. Back to seL4 docsite
'; + // Set the current, active page, and reveal it if it's hidden + let current_page = document.location.href.toString().split("#")[0].split("?")[0]; + if (current_page.endsWith("/")) { + current_page += "index.html"; + } + var links = Array.prototype.slice.call(this.querySelectorAll("a")); + var l = links.length; + for (var i = 0; i < l; ++i) { + var link = links[i]; + var href = link.getAttribute("href"); + if (href && !href.startsWith("#") && !/^(?:[a-z+]+:)?\/\//.test(href)) { + link.href = path_to_root + href; + } + // The "index" page is supposed to alias the first chapter in the book. + if (link.href === current_page || (i === 0 && path_to_root === "" && current_page.endsWith("/index.html"))) { + link.classList.add("active"); + var parent = link.parentElement; + if (parent && parent.classList.contains("chapter-item")) { + parent.classList.add("expanded"); + } + while (parent) { + if (parent.tagName === "LI" && parent.previousElementSibling) { + if (parent.previousElementSibling.classList.contains("chapter-item")) { + parent.previousElementSibling.classList.add("expanded"); + } + } + parent = parent.parentElement; + } + } + } + // Track and set sidebar scroll position + this.addEventListener('click', function(e) { + if (e.target.tagName === 'A') { + sessionStorage.setItem('sidebar-scroll', this.scrollTop); + } + }, { passive: true }); + var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll'); + sessionStorage.removeItem('sidebar-scroll'); + if (sidebarScrollTop) { + // preserve sidebar scroll position when navigating via links within sidebar + this.scrollTop = sidebarScrollTop; + } else { + // scroll sidebar to current active section when navigating via "next/previous chapter" buttons + var activeSection = document.querySelector('#sidebar .active'); + if (activeSection) { + activeSection.scrollIntoView({ block: 'center' }); + } + } + // Toggle buttons + var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); + function toggleSection(ev) { + ev.currentTarget.parentElement.classList.toggle('expanded'); + } + Array.from(sidebarAnchorToggles).forEach(function (el) { + el.addEventListener('click', toggleSection); + }); + } +} +window.customElements.define("mdbook-sidebar-scrollbox", MDBookSidebarScrollbox); diff --git a/projects/rust/tutorial/toc.js.bak b/projects/rust/tutorial/toc.js.bak new file mode 100644 index 00000000000..065a426af2d --- /dev/null +++ b/projects/rust/tutorial/toc.js.bak @@ -0,0 +1,70 @@ +// Populate the sidebar +// +// This is a script, and not included directly in the page, to control the total size of the book. +// The TOC contains an entry for each page, so if each page includes a copy of the TOC, +// the total size of the page becomes O(n**2). +class MDBookSidebarScrollbox extends HTMLElement { + constructor() { + super(); + } + connectedCallback() { + this.innerHTML = '
  1. Introduction
  2. Setup
  3. Part I: The Root Task
  4. Overview
  5. Hello, World!
  6. Allocating Kernel Objects
  7. Modifying the Address Space
  8. Using a Serial Device
  9. Spawning a Thread
  10. Spawning a Task (Challenge)
  11. Part II: Microkit
  12. Overview
  13. Hello, World!
  14. IPC
  15. Shared Memory
'; + // Set the current, active page, and reveal it if it's hidden + let current_page = document.location.href.toString().split("#")[0].split("?")[0]; + if (current_page.endsWith("/")) { + current_page += "index.html"; + } + var links = Array.prototype.slice.call(this.querySelectorAll("a")); + var l = links.length; + for (var i = 0; i < l; ++i) { + var link = links[i]; + var href = link.getAttribute("href"); + if (href && !href.startsWith("#") && !/^(?:[a-z+]+:)?\/\//.test(href)) { + link.href = path_to_root + href; + } + // The "index" page is supposed to alias the first chapter in the book. + if (link.href === current_page || (i === 0 && path_to_root === "" && current_page.endsWith("/index.html"))) { + link.classList.add("active"); + var parent = link.parentElement; + if (parent && parent.classList.contains("chapter-item")) { + parent.classList.add("expanded"); + } + while (parent) { + if (parent.tagName === "LI" && parent.previousElementSibling) { + if (parent.previousElementSibling.classList.contains("chapter-item")) { + parent.previousElementSibling.classList.add("expanded"); + } + } + parent = parent.parentElement; + } + } + } + // Track and set sidebar scroll position + this.addEventListener('click', function(e) { + if (e.target.tagName === 'A') { + sessionStorage.setItem('sidebar-scroll', this.scrollTop); + } + }, { passive: true }); + var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll'); + sessionStorage.removeItem('sidebar-scroll'); + if (sidebarScrollTop) { + // preserve sidebar scroll position when navigating via links within sidebar + this.scrollTop = sidebarScrollTop; + } else { + // scroll sidebar to current active section when navigating via "next/previous chapter" buttons + var activeSection = document.querySelector('#sidebar .active'); + if (activeSection) { + activeSection.scrollIntoView({ block: 'center' }); + } + } + // Toggle buttons + var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); + function toggleSection(ev) { + ev.currentTarget.parentElement.classList.toggle('expanded'); + } + Array.from(sidebarAnchorToggles).forEach(function (el) { + el.addEventListener('click', toggleSection); + }); + } +} +window.customElements.define("mdbook-sidebar-scrollbox", MDBookSidebarScrollbox); diff --git a/projects/rust/tutorial/tomorrow-night.css b/projects/rust/tutorial/tomorrow-night.css new file mode 100644 index 00000000000..11752b8a8c7 --- /dev/null +++ b/projects/rust/tutorial/tomorrow-night.css @@ -0,0 +1,104 @@ +/* Tomorrow Night Theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-attr, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #cc6666; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #de935f; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rule .hljs-attribute { + color: #f0c674; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.hljs-name, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #b5bd68; +} + +/* Tomorrow Aqua */ +.hljs-title, +.hljs-section, +.css .hljs-hexcolor { + color: #8abeb7; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #81a2be; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #b294bb; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1d1f21; + color: #c5c8c6; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} + +.hljs-addition { + color: #718c00; +} + +.hljs-deletion { + color: #c82829; +} diff --git a/projects/sel4-tutorials.html b/projects/sel4-tutorials.html new file mode 100644 index 00000000000..28b548c6290 --- /dev/null +++ b/projects/sel4-tutorials.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/sel4-tutorials/benchmarking-guide.html b/projects/sel4-tutorials/benchmarking-guide.html new file mode 100644 index 00000000000..60a03335daf --- /dev/null +++ b/projects/sel4-tutorials/benchmarking-guide.html @@ -0,0 +1,896 @@ + + + + + + + Benchmarking Tools | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/sel4-tutorials/benchmarking-guide.md b/projects/sel4-tutorials/benchmarking-guide.md deleted file mode 100644 index 49b05c12fae..00000000000 --- a/projects/sel4-tutorials/benchmarking-guide.md +++ /dev/null @@ -1,306 +0,0 @@ ---- -redirect_from: - - /BenchmarkingGuide -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Benchmarking Tools - -The [sel4bench-manifest](https://github.com/seL4/sel4bench-manifest) repository -collection provides a set of tools which can be used to analyse kernel and -workload performance. The use the kernel benchmarking extensions that can be -enabled via kernel build configuration option. - -## CPU Utilisation - -Threads, including the idle thread, and the overall system time can be tracked -by enabling the "track CPU utilisation feature". This feature can be enabled by -setting the CMake configuration option `KernelConfiguration` to -`track_utilisation`. - -By enabling CPU utilisation tracking, the kernel is instrumented with variables -and functions to log the utilisation time for each thread in cycles. - -This means TCB kernel objects gain additional fields and TCB size may increase -in benchmarking configurations in general and for `track_utlisation` in -particular. During each context switch, the kernel adds how long the current -thread has run before being switched, and resets the start time for the next -thread. The in-kernel buffer is not used for CPU utilisation tracking. - -### How to use - -After enabling this feature, new system calls can be used to start, stop, and -retrieve data. - -#### `seL4_BenchmarkResetLog()` - -This system call resets global counters as well as idle thread counters since -the previous call to the same function, and (re)starts CPU utilisation tracking. -It does not reset counters for individual threads. - -#### `seL4_BenchmarkResetThreadUtilisation(seL4_CPtr thread_cptr)` - -Resets the utilisation counters for the requested thread. It is the responsibility -of the user to reset the thread's counters using this system call before calling -`seL4_BenchmarkResetLog()`, especially if `seL4_BenchmarkResetLog()` is called -multiple times to track the same set of threads. - -#### `seL4_BenchmarkFinalizeLog()` - -Stops the CPU tracking feature but does not reset the counters. Performing this -system call without a previous `seL4_BenchmarkResetLog()` call has no effect. - -#### `seL4_BenchmarkGetThreadUtilisation(seL4_CPtr thread_cptr)` - -Gets the utilisation time of the thread that `thread_cptr` capability points to -between calls to `seL4_BenchmarkResetLog()` and `seL4_BenchmarkFinalizeLog()`. -The utilisation time is written to the first 64-bit word of IPC buffer of the -calling thread. The idle thread and overall CPU utilisation times are written to -the subsequent 64-bit words in the IPCBuffer. - -Example code of using this feature: - -```c -#include - -uint64_t *ipcbuffer = (uint64_t*) &(seL4_GetIPCBuffer()->msg[0]); - -seL4_BenchmarkResetThreadUtilisation(seL4_CapInitThreadTCB); - -seL4_BenchmarkResetLog(); -... -seL4_BenchmarkFinalizeLog(); - -seL4_BenchmarkGetThreadUtilisation(seL4_CapInitThreadTCB); -printf("Init thread utilisation = %llun", ipcbuffer[BENCHMARK_TCB_UTILISATION]); -printf("Idle thread utilisation = %llun", ipcbuffer[BENCHMARK_IDLE_UTILISATION]); -printf("Overall utilisation = %llun", ipcbuffer[BENCHMARK_TOTAL_UTILISATION]); -``` - -## In-kernel log buffer - -An in-kernel log buffer can be provided by the user when the `KernelBenchmarks` -CMake config option is set to `track_kernel_entries` or `tracepoints` with the -system call `seL4_BenchmarkSetLogBuffer`. Users must provide a capability to a -large frame for the kernel to use as a log buffer. The frame will be mapped -write-through to avoid impacting the caches. The kernel only writes to the log -buffer and does not read from it during benchmarking. Once a benchmark is -complete, data can be read out at user level. - -The trace-points and kernel-entry tracking features of the `sel4bench` suite use -the in-kernel log buffer. - -## Tracepoints - -These allow the user to specify tracepoints in the kernel to track the time -between points. - -### How to use - -Set the `KernelBenchmarks` CMake config option to `tracepoints`. Then set the -`KernelMaxNumTracePoints` CMake config option to a non-zero value. - -Wrap the regions you wish to time with `TRACE_POINT_START(i)` and -`TRACE_POINT_STOP(i)` where `i` is an integer from 0 to less than the value of -"Maximum number of tracepoints". - -The number of cycles consumed between a `TRACE_POINT_START` and -`TRACE_POINT_STOP` will be stored in an in-kernel log. Entries of this -log consist of a key (the argument to `TRACE_POINT_START` and -`TRACE_POINT_STOP`) and a value (the number of cycles counted between -`TRACE_POINT_START` and `TRACE_POINT_STOP`). - -Functionality for extracting and processing entries from this buffer is provided -in `libsel4bench` located in -[seL4/seL4_libs](https://github.com/seL4/seL4_libs). - -An example of this feature in use can be found in the IRQ path benchmark -in [sel4bench](https://github.com/seL4/sel4bench/blob/master/apps/irq/src/main.c). - -### Tracepoint Overhead - -#### Measuring Overhead - -Using tracepoints adds a small amount of overhead to the kernel. To measure -this overhead, use a pair of nested tracepoints: - -```c -TRACE_POINT_START(0); -TRACE_POINT_START(1); -TRACE_POINT_STOP(1); -TRACE_POINT_STOP(0); -``` - -The outer tracepoints will measure the time taken to start and stop the inner -tracepoints. The cycle count recorded by the outer tracepoints will be slightly -skewed, as starting and stopping itself (the outer tracepoints) takes some -number of cycles. To determine how many, we look to the inner tracepoints. Since -this pair is empty, it will record the number of cycles added to a result by the -tracepoint instrumentation. Thus, to compute the total overhead of starting and -stopping a tracepoint, subtract the values measured by the inner tracepoints -from those measured by the outer tracepoints. - -#### Results - -All results are in cycles. Results were obtained using the method described -above. The total overhead is the number of cycles added to execution per -tracepoint start/stop pair (inner pair result subtracted from outer pair -result). The effective overhead is the number of cycles added to a measurement -by the tracepoint instrumentation (inner pair result). - -##### **Total Overhead** - -
-|Machine |# Samples |Min|Max|Mean|Std Dev|Std Dev %| -|-|-|-|-|-|-|-|-| -|Sabre|740|18|18|18|0|0%| -|Haswell2|740|532|852|550.33|17.19|3%| - -
- -##### **Effective overhead** - -
-|Machine |# Samples |Min|Max|Mean|Std Dev|Std Dev %| -|-|-|-|-|-|-|-|-| -|Sabre|740|4|4|4|0|0 | -|Haswell2|740|208|212|208.69|1.66|1% | - -
- -### Advanced Use - -#### Conditional Logging - -A log is stored when `TRACE_POINT_STOP(i)` is called, only if a corresponding -`TRACE_POINT_START(i)` was called since the last call to `TRACE_POINT_STOP(i)` -or system boot. This allows for counting cycles of a particular path through -some region of code. Here are some examples: - -The cycles consumed by functions `f` and `g` are logged with the key 0, only -when the condition `c` is true: - -```c -TRACE_POINT_START(0); -f(); -if (c) { - g(); - TRACE_POINT_STOP(0); -} -``` - -The cycles consumed by functions `f` and `g` are -logged with the key 1, only when the condition `c` is true: - -```c -if (c) { - f(); - TRACE_POINT_START(1); -} -g(); -TRACE_POINT_STOP(1); -``` - -These two techniques can be combined to record cycle counts only when a -particular path between 2 points is followed. In the following example, cycles -consumed by functions `f`, `g` and `h` are logged, only when the condition `c` -is true. Cycle counts are stored with 2 keys (2 and 3) which can be combined -after extracting the data to user level. - -```c -TRACE_POINT_START(2); -f(); -if (c) { - h(); - TRACE_POINT_STOP(2); - TRACE_POINT_START(3); -} -g(); -TRACE_POINT_STOP(3); -``` - -#### Interleaving/Nesting - -It's possible to interleave tracepoints: - -```c -TRACE_POINT_START(0); -... -TRACE_POINT_START(1); -... -TRACE_POINT_STOP(0); -... -TRACE_POINT_STOP(1); -``` - -and to nest tracepoints: - -```c -TRACE_POINT_START(0); -... -TRACE_POINT_START(1); -... -TRACE_POINT_STOP(1); -... -TRACE_POINT_STOP(0); -``` - -When interleaving or nesting tracepoints, be sure to account for the overhead -that will be introduced. - -## Kernel entry tracking - -Kernel entries can be tracked, registering info about interrupts, syscall, -timestamp, invocations and capability types. The number of kernel entries is -restricted by the log buffer size. The kernel provides a reserved area within -its address space to map the log buffer. It is the responsibility of the user to -allocate a user-level log buffer (currently can be only of seL4_LargePageBits -size) and pass it to the kernel to use before doing any operations that involve -the log buffer, otherwise an error will be triggered. To enable this feature, -set the `KernelBenchmarks` CMake config option to `track_kernel_entries`. - -An example how to create a user-level log buffer (using the seL4 libraries) and -tell the kernel about it is as follows: - -```c -#ifdef CONFIG_BENCHMARK_TRACK_KERNEL_ENTRIES - -#include - - /* Create large page to use for benchmarking and give to kernel */ - void* log_buffer = vspace_new_pages(&env.vspace, seL4_AllRights, 1, seL4_LargePageBits); - if (log_buffer == NULL) { - ZF_LOGF("Could not map log_buffer page"); - } - seL4_CPtr buffer_cap = vspace_get_cap(&env.vspace, log_buffer); - if (buffer_cap == NULL) { - ZF_LOGF("Could not get cap for log buffer"); - } - int res_buf = seL4_BenchmarkSetLogBuffer(buffer_cap); - if (res_buf) { - ZF_LOGF("Could not set log buffer"); - } - -#endif CONFIG_BENCHMARK_TRACK_KERNEL_ENTRIES -``` - -`seL4_BenchmarkResetLog()` can be used to reset the log buffer index and start -tracking. To stop tracking, call `seL4_BenchmarkFinalizeLog()` which returns the -log buffer index. Note that, if the buffer is full/saturated, it will return the -last entry index of the log buffer. Finally, the log buffer can be analysed to -extract desired info. For reference, there are utility functions to extract such -information in -[sel4utils/benchmark_track.h](https://github.com/seL4/seL4_libs/blob/master/libsel4utils/include/sel4utils/benchmark_track.h). - -### Hints - -If you want only entry or exit times instead of function call durations, modify -[line -63](https://github.com/seL4/seL4/blob/b63043c41a5db1f64253ea98b104eab54c256c56/include/benchmark/benchmark.h#L63) -of `include/benchmark.h` in function `trace_point_stop` in the kernel. This -might be useful if you wish to time hardware events. For example, should you -wish to time how long it takes for hardware to generate a fault to the kernel, -perhaps record the cycle counter before causing the fault in userspace, then -store the `ksEntry` as soon as you enter somewhere relevant in the kernel, and -then compare the difference of these two once you return to userspace. diff --git a/projects/sel4-tutorials/debugging-guide.html b/projects/sel4-tutorials/debugging-guide.html new file mode 100644 index 00000000000..358ccb51c77 --- /dev/null +++ b/projects/sel4-tutorials/debugging-guide.html @@ -0,0 +1,822 @@ + + + + + + + Debugging guide | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/sel4-tutorials/debugging-guide.md b/projects/sel4-tutorials/debugging-guide.md deleted file mode 100644 index 874242334a4..00000000000 --- a/projects/sel4-tutorials/debugging-guide.md +++ /dev/null @@ -1,291 +0,0 @@ ---- -redirect_from: - - /DebuggingGuide -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Debugging guide - -This guide is for debugging the seL4 kernel itself, for instance during -development of new features. See [Debugging user -space](debugging-userspace.html) for how to debug user-level code on top of -seL4. - -## Compiler Settings - -Ensure that the build directory you are building in is not a release build. To -do so, check you build directory `CMakeCache.txt` file for the following lines: - -- `CMAKE_BUILD_TYPE:STRING=Debug` -- `KernelDebugBuild:BOOL=ON` - -Debug builds enable helpful features for debugging including: - -- `printf` + a serial driver, -- `-g` is passed to the compiler, -- compile- and run-time asserts, -- the kernel will print out error messages when invocations fail. - -## QEMU - -[QEMU](http://www.qemu.org/) is a simulator that provides software emulation of -a hardware platform. It is useful for developing and debugging embedded software -when you do not have access to the target platform. Even if you do have the -target hardware, QEMU can shorten your edit-compile-debug cycle. Be aware that -it is not cycle-accurate and cannot emulate every device, so sometimes you have -no alternative than to debug on real hardware. - -For the seL4 tutorials, a `simulate` script is always generated for use in the -build directory of a project. In most other projects, this script can be -generated by passing the flag `-DSIMULATION=1` to the `../init-build.sh` -invocation. - -```bash -mkdir build_dir -cd build_dir -../init-build.sh -DSIMULATION=1 -./simulate -``` - -If the platform does not support QEMU, the script will output - -```bash - Unsupported platform or architecture for simulation -``` - -When simulating an seL4 system in QEMU, you should see output that is -directed to the (emulated) UART device on your terminal: - -```log -ELF-loader started on CPU: ARM Ltd. ARMv6 Part: 0xb36 r1p3 - paddr=[82000000..8225001f] -ELF-loading image 'kernel' - paddr=[80000000..80033fff] - vaddr=[f0000000..f0033fff] - virt_entry=f0000000 -ELF-loading image 'sel4test-driver' - paddr=[80034000..8036efff] - vaddr=[10000..34afff] - virt_entry=1c880 -Enabling MMU and paging -Jumping to kernel-image entry point... - -Bootstrapping kernel -Switching to a safer, bigger stack... -seL4 Test -========= -... -``` - -To exit from QEMU, type the sequence Ctrl+"a", then "x". Note that you -can exit at any point; you do not need to wait for the system to finish -or reach some stable state. If you exit QEMU while a system is running, -it will simply be terminated. - -QEMU has some powerful debugging features built in. You can type -Ctrl+"a", then "c" to switch to the QEMU monitor. From here you can -inspect CPU or device state, read and write memory, and single-step -execution. More information about this functionality is available in the -[QEMU documentation](https://qemu-project.gitlab.io/qemu/system/monitor.html). - -When debugging an seL4 project, the QEMU debugger is inherently limited. -It has no understanding of your source code, so it is difficult to -relate what you are seeing back to the C code you compiled. It is -possible to get a richer debugging environment by connecting GDB to -QEMU. - -### Using GDB with QEMU - -[GDB](https://www.gnu.org/s/gdb/) is a debugger commonly used -in C application development. Though not as seamless as debugging a -native Linux application, it is possible to use GDB to debug within -QEMU's emulated environment. - -Start QEMU with the extra options "-S" (pause execution on start) and -"-s" (start a GDB server on TCP port 1234): - -```bash -./simulate --extra-qemu-args="-S -s" -``` - -In a separate terminal window, start your target platform's version of -GDB. You should either pass a binary of the seL4 kernel if you intend on -debugging seL4 itself or the user-space application if you intend on -debugging an application on seL4. - -In this example we're going -to debug the seL4 kernel that has been built in debug mode: - -```bash -${CROSS_COMPILER_PREFIX}gdb kernel/kernel.elf -``` - -Where `CROSS_COMPILER_PREFIX` is the prefix used for the toolchain for the -architecture you are debugging. For x86 this is blank, for other architectures -you can check the `CMakeCache.txt` file in the build directory for the variable -`CROSS_COMPILER_PREFIX`. In the following example, the prefix is -`arm-none-eabi-`: - -```bash -CROSS_COMPILER_PREFIX:UNINITIALIZED=arm-none-eabi- -``` - -At the GDB prompt, enter "target remote :1234" to connect to the server -QEMU is hosting: - -```gdb -Reading symbols from kernel/kernel.elf...done. -(gdb) target remote :1234 -Remote debugging using :1234 -0x82000000 in ?? () -(gdb) -``` - -Suppose we want to halt when `kprintf` is called. Enter `break kprintf` at -the GDB prompt: - -```gdb -(gdb) break kprintf -Breakpoint 1 at 0xf0011248: file kernel/src/machine/io.c, line 269. -``` - -We can now start QEMU running and wait until we hit the breakpoint. To -do this, type "cont" at the GDB prompt: - -```gdb -(gdb) cont -Continuing. - -Breakpoint 1, kprintf (format=0xf0428000 "") at kernel/src/machine/io.c:269 -269 { -``` - -Note that some output has appeared in the other terminal window running -QEMU as it has partially executed. It may be surprising to see that some -printing somehow happened without our breakpoint triggering. The reason -for this is that output we're seeing is from the ELF loader that runs -prior to the kernel. GDB does not know the address of its print function -(as we only gave GDB the kernel's symbol table) and it is not looking to -break on its address. The breakpoint we have just hit is the first time -the ''kernel'' tried to print. Similarly, the breakpoint we have -configured will have no effect on user-space calls to `printf`. - -Now that we are stopped at a breakpoint, all the standard GDB operations -are possible (inspect registers or the stack, single-step, continue -until function exit, ...). More information is available in the -[GDB manual](http://www.gnu.org/software/gdb/documentation/). - -Be warned that if you are debugging the kernel's early boot steps, -something that may not be immediately obvious is that debugging across a -context in which page mappings change (e.g. switching page directories -or turning the MMU on/off) will confuse GDB and you may find breakpoints -triggering unexpectedly or being missed. - -The process we have described is similar for x86, though if you are on -an x86 or x86_64 host you can simply use your platform's native GDB, -gdb. - -#### User space debugging - -The steps for debugging a user-space application on seL4 are identical to -the ones we have just seen, except that we pass GDB a symbol table for -user-space rather than the kernel. For example, using the same `sel4test` -environment we start QEMU in the same way but start GDB with the `sel4test` -binary: - -```bash -${CROSS_COMPILER_PREFIX}gdb projects/sel4test/apps/sel4test-driver/sel4test-driver -``` - -After connecting to QEMU, we can instruct GDB to break on the user space -`printf` function: - -```gdb -Reading symbols from projects/sel4test/apps/sel4test-driver/sel4test-driver.bin...done. -(gdb) target remote :1234 -Remote debugging using :1234 0x82000000 in ?? () -(gdb) break printf -Breakpoint 1 at 0x30870: file libs/libmuslc/src/stdio/printf.c, line 9. -(gdb) -``` - -Note that GDB has correctly identified the printf function in Musl C. We -now continue as before: - -```gdb -(gdb) cont -Continuing. - -Breakpoint 1, printf (fmt=0x363e8 "%s") at libs/libmuslc/src/stdio/printf.c:9 -9 ret = vfprintf(stdout, fmt, ap); -(gdb) -``` - -If you examine the terminal window running QEMU at this point, you will -note that we see an extra bit of output from the kernel. The kernel's -print functionality is unaffected, but GDB has stopped execution the -first time user space called `printf`. - -From here, the experience is essentially identical to debugging the -kernel. One small complication to be aware of is that debugging across a -context switch may be confusing. If you are single-stepping in GDB and -find execution suddenly diverted to an address where code is unknown, -check the address itself. It is usually easy to identify from the -address alone when execution is in kernel code or the exception vector -table. Unfortunately there is no easy way to continue until you're back -in user space, particularly if the kernel schedules a different thread -than the one you were debugging. Depending on the scenario you are -debugging, it may be simpler to modify your system setup to ensure only -one thread is running. - -## Objdump - -The `objdump` tool can be used to disassemble an ELF file, be it a kernel or an -application. This can be used to lookup the instruction where a fault occurred. -Make sure `-g` is passed to the compiler so that debug information is included -in the image. - -Like gdb, the appropriate `objdump` from the toolchain must be called by -using `CROSS_COMPILER_PREFIX`. - -For ARM, supposing that **arm-none-eabi-** is used as the -cross-compiler prefix. - -```bash -arm-none-eabi-objdump -D binary_file_name > dump.s -``` - -For x86, on an x86 host: - -```bash -objdump -D binary_file_name > dump.s -``` - -The file `dump.s` has the human-readable assembly instructions. - -If you have symbols and want (C) source information in your disassembly -(and who doesn't!) then use the -S flag. for example: - -```bash -${CROSS_COMPILER_PREFIX}objdump -DS binary_file_name -``` - -## Hardware debugging - -For some platforms, seL4 supports hardware debugging. -See [Hardware debugging of user-space threads](debugging-userspace.html). - -## In kernel debugging - -seL4 does not currently have a kernel debugger. As a result, most of our -debugging is done with: - -- `objdump` as described above, -- `printf`, -- `__builtin_return_address` (to figure out stack traces). - -In the kernel, we provide `debug_printKernelEntryReason` found in -[debug.h](https://github.com/seL4/seL4/blob/master/include/api/debug.h) -which can be used at any point in the kernel to output the current -operation that the kernel is doing. diff --git a/projects/sel4-tutorials/debugging-userspace.html b/projects/sel4-tutorials/debugging-userspace.html new file mode 100644 index 00000000000..605f7e87b93 --- /dev/null +++ b/projects/sel4-tutorials/debugging-userspace.html @@ -0,0 +1,628 @@ + + + + + + + Hardware debugging of user-space threads | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/sel4-tutorials/debugging-userspace.md b/projects/sel4-tutorials/debugging-userspace.md deleted file mode 100644 index f169ac921dd..00000000000 --- a/projects/sel4-tutorials/debugging-userspace.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -redirect_from: - - /DebuggingUserspace -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Hardware debugging of user-space threads - -This guide is for debugging user-level code on top of seL4. See the [kernel -debugging guide](debugging-guide.html) for how to debug the kernel itself. - -## Overview - -The seL4 microkernel leverages the hardware debugging capabilities of modern -processors, and exports hardware breakpoint, watchpoint, and single-stepping to -user threads via conditionally compiled-in APIs. These kernel-level APIs can be -used as the backend for implementing a full-featured debugger, or porting an -existing one such as the GNU Debugger. - -## Enabling this feature - -You can enable and disable the hardware debugging API by going through the -kernel's configuration system by passing `-DHardwareDebugAPI=1`. - -Not all platforms support this feature for two main reasons: - -- The feature is gated behind certain hardware signals, such as `#DBGEN`, being - active. If the hardware isn't asserting these signals, the kernel will be - unable to use them. -- Your processor supports only the "Baseline" set of Coprocessor 14 registers, - and doesn't reliably expose the debug features through the debug coprocessor. - -{% include note.html kind="Caution" %} -If you compile the kernel with support for the debug API, and your ARM platform -doesn't support it, **your kernel will abort at boot**. -{% include endnote.html %} - -## Summary of the invocations - -The invocations are documented in detail in the seL4 manual. This article will -cover how to practically call them and use them in a prospective debugger. - -To view a current version of the seL4 manuals, please download the kernel source -code and then `cd manual` and execute `make`. - -Additionally, there is available source code that demonstrates how the -invocations can be used practically: the seL4-Test repository holds code tests -the debug APIs, and shows how to use them to set breakpoints, watchpoints and -single-stepping, on both x86 and ARM: - -- -- - -The invocations take capabilities to TCBs, and perform operations on the TCB -register context to virtualise the hardware debug feature for each thread. - -- `seL4_TCB_SetBreakpoint`: Takes a capability to a TCB, and a hardware - breakpoint register ID, and sets a breakpoint on a specified virtual address, - for a range of addresses, for a certain access type (Read, Write, or both). -- `seL4_TCB_UnsetBreakpoint`: Takes a capability to a TCB, and both disables and - clears the specific hardware breakpoint for that thread. -- `seL4_TCB_GetBreakpoint`: Takes a capability to a TCB, and returns information - on whether or not the hardware breakpoint is enabled, and if enabled, what - virtual address it will trigger on, and what types of accesses will trigger - it. -- `seL4_TCB_ConfigureSingleStepping`: Takes a capability to a TCB, and - configures a hardware debugging register to break on every instruction (or - every Nth instruction), and send a message on the thread's fault endpoint - everytime it faults. You may reply to the fault endpoint to resume the - thread's execution. - - diff --git a/projects/sel4-tutorials/index.html b/projects/sel4-tutorials/index.html new file mode 100644 index 00000000000..28b548c6290 --- /dev/null +++ b/projects/sel4-tutorials/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/sel4/api-doc.html b/projects/sel4/api-doc.html new file mode 100644 index 00000000000..d6e47129b8e --- /dev/null +++ b/projects/sel4/api-doc.html @@ -0,0 +1,10038 @@ + + + + + + + seL4 API Reference | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/sel4/api-doc.md b/projects/sel4/api-doc.md deleted file mode 100644 index 0ba91c684cb..00000000000 --- a/projects/sel4/api-doc.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -layout: api -toc: true -redirect_from: - - /ApiDoc -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# seL4 API Reference - -This is the C API reference for the seL4 kernel, available in the library -`libsel4`. - -## General System Calls - -{% include_absolute _repos/sel4/sel4/manual/generated_markdown/GeneralSystemCalls.md %} - -## Debugging System Calls - -{% include_absolute _repos/sel4/sel4/manual/generated_markdown/DebuggingSystemCalls.md %} - -## Benchmarking System Calls - -{% include_absolute _repos/sel4/sel4/manual/generated_markdown/BenchmarkingSystemCalls.md %} - -## X86 System Calls - -{% include_absolute _repos/sel4/sel4/manual/generated_markdown/X86SystemCalls.md %} - -## Architecture-Independent Object Methods - -{% include_absolute _repos/sel4/sel4/manual/generated_markdown/ObjectApi.md %} - -## General x86 Object Methods - -{% include_absolute _repos/sel4/sel4/manual/generated_markdown/ObjectApiX86.md %} - -## IA32-Specific Object Methods - -{% include_absolute _repos/sel4/sel4/manual/generated_markdown/ObjectApiIa32.md %} - -## x86_64-Specific Object Methods - -{% include_absolute _repos/sel4/sel4/manual/generated_markdown/ObjectApiX64.md %} - -## General ARM Object Methods - -{% include_absolute _repos/sel4/sel4/manual/generated_markdown/ObjectApiArm.md %} - -## Aarch32-Specific Object Methods - -{% include_absolute _repos/sel4/sel4/manual/generated_markdown/ObjectApiAarch32.md %} - -## Aarch64-Specific Object Methods - -{% include_absolute _repos/sel4/sel4/manual/generated_markdown/ObjectApiAarch64.md %} - -## RISCV-Specific Object Methods - -{% include_absolute _repos/sel4/sel4/manual/generated_markdown/ObjectApiRISCV.md %} diff --git a/projects/sel4/bfgen.html b/projects/sel4/bfgen.html new file mode 100644 index 00000000000..8785676a17e --- /dev/null +++ b/projects/sel4/bfgen.html @@ -0,0 +1,1525 @@ + + + + + + + The seL4 Bitfield Generator | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/sel4/bfgen.md b/projects/sel4/bfgen.md deleted file mode 100644 index 027b2833e7d..00000000000 --- a/projects/sel4/bfgen.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -repo: seL4/seL4 -include_file: tools/bitfield_gen.md -toc: true -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# The seL4 Bitfield Generator - -The seL4 kernel code and the libsel4 library use the so-called bitfield -generator to automatically produce code and formal proofs for tagged unions and -structs of bitfields from a higher-level specification. - -The code for this tool is available in the [seL4 repository] in the [tools] -directory. This page contains the manual of the bitfield generator. The manual -sources are also available for the [tools] directory. - -{% include include_github_repo_markdown.md indent_headings=1 %} - -[seL4 repository]: https://github.com/seL4/seL4/ -[tools]: https://github.com/seL4/seL4/blob/master/tools/ diff --git a/projects/sel4/configurations.html b/projects/sel4/configurations.html new file mode 100644 index 00000000000..6f592100dcf --- /dev/null +++ b/projects/sel4/configurations.html @@ -0,0 +1,2067 @@ + + + + + + + seL4 Configurations | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/sel4/configurations.md b/projects/sel4/configurations.md deleted file mode 100644 index 58576f95fe2..00000000000 --- a/projects/sel4/configurations.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -project: sel4 -wide: true -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 Proofcraft Pty Ltd ---- - -# seL4 Configurations - -seL4 has several different options available for configuring seL4 to execute in different -scenarios. Many of these options are only expected to used during application or kernel -development and may not be suitable for a final release deployment that wants to leverage -seL4's full capabilities. - -*Due to the experimental nature of many of the options, there may be undocumented incompatibilities -when trying to configure several options together. seL4test, seL4bench or other user level examples -can be used to test a baseline level of configuration correctness.* - -## Generic configuration options - -{% include config_list.md project='sel4' type='generic' %} - -## Scheduling configuration options - -{% include config_list.md project='sel4' type='scheduling' %} - -## Debug configuration options - -{% include config_list.md project='sel4' type='debug' %} - -## Performance analysis and profiling configuration options - -{% include config_list.md project='sel4' type='profiling' %} - -## Target hardware architecture/platform options - -{% include config_list.md project='sel4' type='platform' %} - -### Arm - -{% include config_list.md project='sel4' type='platform-arm' %} - -### x86 - -{% include config_list.md project='sel4' type='platform-x86' %} diff --git a/projects/sel4/documentation.html b/projects/sel4/documentation.html new file mode 100644 index 00000000000..4cb920b6a39 --- /dev/null +++ b/projects/sel4/documentation.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/sel4/documentation.md b/projects/sel4/documentation.md deleted file mode 100644 index d74fd312e0f..00000000000 --- a/projects/sel4/documentation.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. -redirect_to: https://sel4.systems/Learn/ ---- diff --git a/projects/sel4/frequently-asked-questions.html b/projects/sel4/frequently-asked-questions.html new file mode 100644 index 00000000000..723cbe5c347 --- /dev/null +++ b/projects/sel4/frequently-asked-questions.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/sel4/frequently-asked-questions.md b/projects/sel4/frequently-asked-questions.md deleted file mode 100644 index e79c182829d..00000000000 --- a/projects/sel4/frequently-asked-questions.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. -redirect_to: https://sel4.systems/About/FAQ.html ---- diff --git a/projects/sel4/index.html b/projects/sel4/index.html new file mode 100644 index 00000000000..1138250b0ad --- /dev/null +++ b/projects/sel4/index.html @@ -0,0 +1,774 @@ + + + + + + + The seL4 microkernel | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/sel4/index.md b/projects/sel4/index.md deleted file mode 100644 index f95ed448182..00000000000 --- a/projects/sel4/index.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 Proofcraft Pty Ltd ---- - -# The seL4 microkernel - -The seL4 kernel itself is the core software program, running in privilege mode, -providing applications with a minimal abstraction layer above the -hardware. Applications can be built directly on top of seL4, or, for an easier -entry point, using frameworks like [Microkit] or [CAmkES]. - -General information about the [seL4 microkernel][about], including details about -its [formal verification][verification] are found on the [seL4 main -site][sel4.systems], which also contains other sources of learning, such as -[publications], [courses], and a [white paper], as well as an extensive [FAQ]. - -We welcome contributions to seL4. Please see [how to contribute][contribute]. - -The seL4 kernel itself is open source and [licensed][license] under the GPL, -version 2. Application code, operating system components, and drivers can have -any license, proprietary or open source. The GPL propagation clause of the -kernel license stops at the kernel/user code boundary. - - -
- - {% include card.html - icon="arrow-right-end-on-rectangle" - title="Tutorial" - body="Learn about the base API mechanisms provided by the seL4 kernel - through short exercises and basic examples." - link="/Tutorials/setting-up.html" - %} - - {% include card.html - icon="book-open" - title="Manual" - body="The seL4 kernel reference manual." - link="/projects/sel4/manual.html" - %} - - {% include card.html - icon="document-magnifying-glass" - title="API" - body="The C API reference for the seL4 kernel." - link="/projects/sel4/api-doc.html" - %} - - {% include card.html - icon="other/github" - title="Sources" - body="The source code of seL4 microkernel." - link="https://github.com/seL4/seL4" - %} - - {% include card.html - icon="cpu-chip" - title="Supported Platforms" - body="The table of all hardware and platforms supported by seL4." - link="/Hardware/" - %} - {% include card.html - icon="check-circle" - title="Verified Configurations" - body="Description of the architecture/platform/configuration combinations - for which seL4 has verified properties." - link="/projects/sel4/verified-configurations.html" - %} - -
- - -To build the seL4 kernel, please follow the [set up instructions][build]. - -If you believe you have found a security vulnerability in seL4 or related -software, we ask you to follow our [vulnerability disclosure policy][VDP]. - - - -[about]: https://sel4.systems/About/ -[verification]: https://sel4.systems/Verification/ -[sel4.systems]: https://sel4.systems/ - -[license]: https://sel4.systems/Legal/license.html - -[Microkit]: /projects/microkit/ -[CAmkES]: /projects/camkes/ - -[contribute]: /projects/sel4/kernel-contribution.html - -[learn]: https://sel4.systems/Learn/ -[white paper]: https://sel4.systems/About/whitepaper.html -[publications]: https://sel4.systems/Research/publications.html -[courses]: https://sel4.systems/Research/courses.html -[FAQ]: https://sel4.systems/About/FAQ.html - - -[build]: /projects/buildsystem/host-dependencies.html -[VDP]: https://github.com/seL4/seL4/blob/master/SECURITY.md diff --git a/projects/sel4/kernel-contribution.html b/projects/sel4/kernel-contribution.html new file mode 100644 index 00000000000..7bad4619909 --- /dev/null +++ b/projects/sel4/kernel-contribution.html @@ -0,0 +1,742 @@ + + + + + + + Contributing to kernel code | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/sel4/kernel-contribution.md b/projects/sel4/kernel-contribution.md deleted file mode 100644 index 229ea8af2d6..00000000000 --- a/projects/sel4/kernel-contribution.md +++ /dev/null @@ -1,199 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Contributing to kernel code - -If the platform, architecture, feature that you are after is not listed on the -[Supported Platforms page](../../Hardware/), and if, from your available -[options](../../Hardware/index.html#not-in-the-lists-above), you choose to contribute -the port or feature yourself, here are the guidelines for it. - -There four classes of kernel contributions: - -1. Board Support Package (BSP) ports, also known as platform ports. -2. Architecture features -3. Architecture ports -4. Kernel features - -For any kernel contributions it is important to note that a modified kernel will -*not* be formally verified until the proofs themselves are also appropriately -modified, or until it can be shown that the modifications do not affect the -proofs. - -## Platform/BSP ports - -*Platform ports*, also known as *Board Support Package (BSP) ports* are the -simplest, and require the least modifications, discussion and approval. This -assumes that you are porting the kernel to a new board on an existing -architecture. - -You will need to: - -* follow the [platform porting guide](porting.html); -* follow the guidelines to [become a platform - owner](https://sel4.systems/Contribute/platform-ports.html). - -Questions, discussion, and sharing of work in progress during this stage are -welcome. - -If you run into problems please ask questions -- many of us may have run into -the same problems before and can provide information on how to fix them and -save hours to weeks of frustration. Please us one of our -[communication channels][contact] for this. - -Make sure to write appropriate tests and include them in seL4test as -part of the port. Consider (and discuss) a plan for how to support -this port (e.g. with regression testing) so that it continues to be -updated and work as seL4 evolves. - -Once the code is ready for submission follow the [Contribution Guidelines] to -submit the changes. - -## Architecture features - -In some cases a kernel port requires more than just a platform/BSP port. If the -port is on a supported architecture, but you wish to make use of architecture -features that the kernel does not yet support, then these will be *architecture -feature contributions*. This will typically require moderate modifications to -kernel design and implementation. - -We do not have specific guidelines or how-tos for adding architecture features. -Each such feature is different and the design decisions and implementations will -vary. - -Before starting on design and implementation of architecture features please -start an initial discussion on one of our [communication channels][contact] -to check if such a feature is not already being worked on, if it is considered -appropriate to include in the kernel, etc. - -Then start a [Request For Comment (RFC)][RFC] describing your design and plans, -and engage in discussion with others about this. The goal is to get feedback -into specific design decisions, as well as to get agreement on the general -direction and design, considering the fit with the overall philosophy and -architecture of the kernel, performance impacts, verification impacts, etc. - -Once there is agreement on how to design and implement such a feature, the next -step is to implement it. Discussion, revisions of design, and sharing of code -(intermediate, proof of concept, prototype, etc) during this stage is -encouraged. - -Evaluate any performance and security impacts of the implementation, and if -there are significant impacts, discuss these and consider how to redesign or -re-implement to avoid them. - -If the feature implementation affects the proofs in any way, then the -modifications will also have to be evaluated and approved by proof engineers to -ensure that the existing proofs are not invalidated -- ideally already during -the design phase. Note that this is even the case if the architecture feature -implementation itself is not verified. - -Consider whether you want to have the architecture feature implementation -verified, and the plans for achieving that. - -As with a platform/BSP port make sure to write appropriate tests and include -them in seL4test as part of the work. Consider (and discuss) a plan for how to -support this port (e.g. with regression testing) so that it continues to be -updated and work as seL4 evolves. - -Once the implementation is complete follow the [Contribution Guidelines] for -submitting changes. - -## Architecture Ports - -If you wish to port seL4 to a new hardware architecture that seL4 does not yet -support, then this will be a new *architecture port*. This will require -extensive kernel design and implementation modifications. - -We feel that seL4 currently supports the most important hardware architectures -(ARM, x86, RISC-V), however, there may be reasons to port to other (new or -existing) architectures. - -Some architectures will be similar enough to currently supported architectures -that a port will be relatively straight forward. Other architectures may be -radically different and require extensive kernel modifications or additions. -Such changes may render the kernel for that architecture incompatible with much -of the existing user-level code. - -Architecture ports also have significant impact on verification. - -For these reasons, it is critical to first engage in discussion before -commencing on such a port. - -Start an initial discussion on one of our [communication channels][contact] to -check if such a port is already being worked on, whether there are known -challenges with such a port, etc. After initial discussion, start a [Request -For Comment (RFC)][RFC] describing your design and plans. - -Once there is agreement on the general suitability of and design of the port, -then go on to implementing it. Discussion, revisions of design, sharing -intermediate, proof of concept, and prototype code during this stage is -required. - -Evaluate the performance and security properties of the port, and if there are -significant impacts, discuss these and consider how to redesign or re-implement -to avoid them. - -Consider whether you want to have the port verified, and the plans for achieving -that. Verifying an architecture port is a significant undertaking. - -As with a platform/BSP port, make sure to write appropriate tests and include -them in seL4test as part of the port. Consider (and discuss) a plan for how to -support this port (e.g. with regression testing) so that it continues to be -updated and work as seL4 evolves. - -Once the implementation is complete follow the [Contribution Guidelines] for -submitting changes. - -## Kernel Features - -If you wish to add new features to the kernel that are architecture independent -(i.e. they span different architectures) then these are called *kernel feature -contributions*. These will require the most extensive kernel design and -implementation modifications. - -As with architecture feature contributions, we do not have specific guidelines -or how-tos for adding kernel features. Each such feature is different and the -design decisions and implementations will vary. - -Such features are not to be considered lightly, and will often be the result of -significant research, e.g. a PhD project. Smaller tweaks are possible, of -course. - -Before starting on design and implementation of new kernel features please -start an initial discussion on one of our [communication channels][contact] to -check if such a feature is not already being worked on, if it is considered -appropriate to include in the kernel, known issues and challenges with such -features, etc. - -Then start a [Request For Comment (RFC)][RFC] describing your design and plans, -and engage in discussion with others about this. The goal is to get feedback -into specific design decisions, as well as to get agreement on the general -direction and design, considering the fit with the overall philosophy and -architecture of the kernel, performance impacts, verification impacts, etc. - -It is particularly important to consider how such a kernel feature will affect, -and be affected on, all the kernel ports, how it will affect user-level -components and systems, and how it will impact key properties such as security. - -Once there is agreement on how to design and implement such a feature, the next -step is to implement it. Discussion, revisions of design, and sharing of code -(intermediate, proof of concept, prototype, etc) during this stage is required. - -As with any kernel modification, make sure to write appropriate tests and -include them in seL4test. Consider (and discuss) a plan for how to support this -port (e.g. with regression testing) so that it continues to be updated and work -as seL4 evolves. - -This is particularly important for features that span all the kernel ports and -need to be tested on all the supported platforms. It is not sufficient to -implement a kernel feature on a single platform, with no plans of how to ensure -that it works on all supported platforms. - -Once the implementation is complete follow the [Contribution Guidelines] for -submitting changes. - -[contact]: https://sel4.systems/support.html -[RFC]: https://sel4.systems/Contribute/rfc-process.html -[Contribution Guidelines]: https://sel4.systems/Contribute/ diff --git a/projects/sel4/manual-api-generation.html b/projects/sel4/manual-api-generation.html new file mode 100644 index 00000000000..8c00ab7d988 --- /dev/null +++ b/projects/sel4/manual-api-generation.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/sel4/manual-api-generation.md b/projects/sel4/manual-api-generation.md deleted file mode 100644 index a9fc71e1a44..00000000000 --- a/projects/sel4/manual-api-generation.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -redirect_from: - - /seL4ManualAPIGeneration -redirect_to: https://github.com/seL4/seL4/blob/master/manual/README.md -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- diff --git a/projects/sel4/manual.html b/projects/sel4/manual.html new file mode 100644 index 00000000000..bfac7dab842 --- /dev/null +++ b/projects/sel4/manual.html @@ -0,0 +1,587 @@ + + + + + + + seL4 Manual | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/sel4/manual.md b/projects/sel4/manual.md deleted file mode 100644 index 0c82e31288d..00000000000 --- a/projects/sel4/manual.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 Proofcraft Pty Ltd ---- - -# seL4 Manual - - -* [Latest version of the seL4 Manual (PDF)](https://sel4.systems/Info/Docs/seL4-manual-latest.pdf) - - -* Previous versions of the seL4 Manual: - * Version [13.0.0](https://sel4.systems/Info/Docs/seL4-manual-13.0.0.pdf) - * Version [12.1.0](https://sel4.systems/Info/Docs/seL4-manual-12.1.0.pdf) - * Version [12.0.0](https://sel4.systems/Info/Docs/seL4-manual-12.0.0.pdf) - * Version [11.0.0](https://sel4.systems/Info/Docs/seL4-manual-11.0.0.pdf) - * Version [10.1.1](https://sel4.systems/Info/Docs/seL4-manual-10.1.1.pdf) - * Version [10.1.1-mcs](https://sel4.systems/Info/Docs/seL4-manual-10.1.1-mcs.pdf) - * Version [10.1.0](https://sel4.systems/Info/Docs/seL4-manual-10.1.0.pdf) - * Version [10.0.0](https://sel4.systems/Info/Docs/seL4-manual-10.0.0.pdf) - * Version [9.0.1](https://sel4.systems/Info/Docs/seL4-manual-9.0.1.pdf) - * Version [9.0.0](https://sel4.systems/Info/Docs/seL4-manual-9.0.0.pdf) - * Version [9.0.0-mcs](https://sel4.systems/Info/Docs/seL4-manual-9.0.0-mcs.pdf) - * Version [8.0.0](https://sel4.systems/Info/Docs/seL4-manual-8.0.0.pdf) - * Version [7.0.0](https://sel4.systems/Info/Docs/seL4-manual-7.0.0.pdf) - * Version [6.0.0](https://sel4.systems/Info/Docs/seL4-manual-6.0.0.pdf) - * Version [5.2.0](https://sel4.systems/Info/Docs/seL4-manual-5.2.0.pdf) - * Version [5.2.0-mcs](https://sel4.systems/Info/Docs/seL4-manual-5.2.0-mcs.pdf) - * Version [5.1.0](https://sel4.systems/Info/Docs/seL4-manual-5.1.0.pdf) - * Version [5.0.0](https://sel4.systems/Info/Docs/seL4-manual-5.0.0.pdf) - * Version [4.0.0](https://sel4.systems/Info/Docs/seL4-manual-4.0.0.pdf) - * Version [3.2.0](https://sel4.systems/Info/Docs/seL4-manual-3.2.0.pdf) - * Version [3.1.0](https://sel4.systems/Info/Docs/seL4-manual-3.1.0.pdf) - * Version [3.0.1](https://sel4.systems/Info/Docs/seL4-manual-3.0.1.pdf) - * Version [3.0.0](https://sel4.systems/Info/Docs/seL4-manual-3.0.0.pdf) - * Version [2.1.0](https://sel4.systems/Info/Docs/seL4-manual-2.1.0.pdf) - * Version [2.0.0](https://sel4.systems/Info/Docs/seL4-manual-2.0.0.pdf) - * Version [1.0.4](https://sel4.systems/Info/Docs/seL4-manual-1.0.4.pdf) - * Version [1.0.0-rt-dev](https://sel4.systems/Info/Docs/seL4-manual-1.0.0-rt-dev.pdf) - * Version [0.0.1-rt-dev](https://sel4.systems/Info/Docs/seL4-manual-0.0.1-rt-dev.pdf) \ No newline at end of file diff --git a/projects/sel4/platf-owner.html b/projects/sel4/platf-owner.html new file mode 100644 index 00000000000..b7129a5e845 --- /dev/null +++ b/projects/sel4/platf-owner.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/sel4/platf-owner.md b/projects/sel4/platf-owner.md deleted file mode 100644 index ea41fe3ee30..00000000000 --- a/projects/sel4/platf-owner.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 seL4 Project a Series of LF Projects, LLC. -redirect_to: https://sel4.systems/Contribute/platform-ports.html ---- diff --git a/projects/sel4/porting.html b/projects/sel4/porting.html new file mode 100644 index 00000000000..571693a2a4e --- /dev/null +++ b/projects/sel4/porting.html @@ -0,0 +1,772 @@ + + + + + + + Porting seL4 to a new platform | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/sel4/porting.md b/projects/sel4/porting.md deleted file mode 100644 index e5bc9292653..00000000000 --- a/projects/sel4/porting.md +++ /dev/null @@ -1,232 +0,0 @@ ---- -redirect_from: - - /PortingSeL4 -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Porting seL4 to a new platform - -This section covers porting seL4 to a new ARM or RISC-V platform if it is not -already covered in the list of [supported seL4 platforms](../../Hardware/). - -## Setup - -In order to load the seL4 image (via some means) it is important to have a working bootloader. -We tend to use [U-Boot](https://www.denx.de/wiki/U-Boot) as it is open source, reliable and supports many different architectures. - -There are a variety of ways of loading an seL4 image from U-Boot such as eMMC, TFTP, and USB. - -### TFTP setup - -For setting up a TFTP server to transfer images over the network, you can follow the -[UNSW Advanced Operating Systems course guide](https://www.cse.unsw.edu.au/~cs9242/19/project/linux.shtml). - -Once you get U-Boot up and running it is a good idea (if the platform is supported) to flash a -Linux image onto the board. This way you can find the correct address to load the image into memory. -This is also useful for debugging, as you can use the FDT file system to dump addresses from a running system. - -Once you have found the correct address to load, declare the boot command (where address 0x20000000 as an example): - -```sh -bootcmd="tftpboot 0x20000000 /path/to/image && go 0x20000000" -saveenv -``` - -For TFTP, you will also need to set some U-Boot environment variables: - -```sh -setenv ipaddr -setenv serverip -saveenv -``` - -The easiest way to find the proper load address is to query the `kernel_addr_r` variable. That's the environment variable specifying the expected address at which the kernel's binary will be found. - -### eMMC/SD card setup - -We can load an image with the following command (using `0x20000000` as an example): - -```sh -fatload mmc 0 0x20000000 /path/to/image -``` - -You can find more details in the [U-Boot documentation](https://docs.u-boot.org/en/latest/usage/cmd/fatload.html). - -## seL4 - -In order to have a successful port of seL4 to your target ARM or RISC-V platform you will need to go through the following steps. - -### Device Tree - -Device Trees are used by ARM and RISC-V platforms to describe the hardware platform. -seL4 makes use of Device Trees at build time, which is why acquiring a Device Tree Source (DTS) -for your platform is one of the first steps. - -seL4 relies on the DTS for the location and size of main memory as well as information -about certain devices used by the kernel such as the timer. In debug mode, seL4 also -makes use of the default serial device for debug output. - -Often the Device Tree Source will be included in the -[Linux kernel source](https://github.com/torvalds/linux), from there you can decompile -the device tree blob (DTB) from building the Linux kernel to get the Device Tree that -Linux uses. - -You can compile the Linux Device Tree Sources into a final Device Tree Blob with: - -```sh -make ARCH= CROSS_COMPILE= defconfig -make ARCH= CROSS_COMPILE= dtbs -``` - -The DTBs can be found in `arch//boots/dts/`. - -The following command allows you to decompile the DTB: - -```sh -dtc -I dtb -O dts /path/to/dtb -o linux.dts -``` - -It should be noted that you may need to add device nodes depending on what Linux uses -and what is required by seL4. For example, some platforms do not include a node for -main memory in the Linux Device Tree. This is because Linux can get -this information at run-time from a previous bootloader. This is not the case for seL4 -as it consumes the Device Tree at build-time. - -In the seL4 source, each platform has an overlay DTS that is responsible for dealing -with seL4-specific device nodes. Below is an example -(from the [ROCKPro64](https://github.com/seL4/seL4/blob/master/src/plat/rockpro64/overlay-rockpro64.dts)): - -```dts -/ { - chosen { - seL4,elfloader-devices = - "serial2", - &{/psci}, - &{/timer}; - seL4,kernel-devices = - "serial2", - &{/interrupt-controller@fee00000}, - &{/timer}; - }; -}; -``` - -These overlay files give a good idea of what nodes seL4 requires in the DTS other than -main memory. - -You will need to create a similar overlay DTS in `src/plat//overlay-.dts` -as part of the platform port. - -### Hardware generation script - -Depending on your platform and the way the DTS is defined you may need to modify the -`seL4/tools/hardware_gen.py` script. - -From the above example the ROCKPro64 needed a memory node so that this script could -define working memory. Other gotchas could include interrupt cells, interrupt numbers being -mapped wrongly, or incorrect addresses. - -The kernel also expects drivers for: - -* the timer device. -* the serial device. -* the interrupt controller. -* the IOMMU if the kernel is being built with IOMMU support. - -You can check all the supported drivers in `seL4/tools/hardware.yml`. - -If the platform has devices that do not already have corresponding drivers, you can add -them in `seL4/src/drivers/` and `seL4/include/drivers/`. - -### Kernel - -You will need to add `seL4/libsel4/sel4_plat_include//sel4/plat/api/constants.h`. -Depending on your platform, this is either empty or requires defining the value for `seL4_UserTop`. -Look in the other platform files for examples similar to your platform. - -You will need to add a CMake configuration file for the platform at `kernel/src/plat//config.cmake`. -It is best to base the contents of this file off of other platforms of the same architecture. - -## Testing your seL4 port - -When you contribute your port to seL4, sel4test must execute successfully and so the next -step to check that your port works would be to get -[the seL4test project](../sel4test/) working. - -### ELF-loader - -Before we can run sel4test, we need to have seL4 booting first. - -Although we use U-Boot as a bootloader, there are additional steps needed to initialise the -hardware and setup system images before we can boot seL4. This is the purpose of the -[ELF-loader](../elfloader/). - -The code for the ELF-loader can be found in the `elfloader-tool` directory at the root of -the [seL4_tools](https://github.com/seL4/seL4_tools) repository. - -Depending on your platform, you may have to make changes to the ELF-loader, which is -responsible for loading the kernel and any user-programs. The ELF-loader outputs to the -serial, so needs to be able to access the UART. - -On RISC-V, outputting to UART is done via a call to the SBI layer so no changes are necessary. - -On ARM, there are a variety of existing UART drivers in `tools/elfloader-tool/src/drivers/uart/`. -If the default serial is not supported by any of these drivers, you will have to -provide a simple putchar implementation. - -If the system image that is produced by the ELF-loader build system needs be a particular file -format (e.g binary or EFI) or needs to start at a particular physical address, you can -configure the default platform options in `seL4_tools/cmake-tool/helpers/application_settings.cmake`. - -### seL4test - -seL4test needs user level serial and timer drivers to run. Add these drivers and the following -files to [libplatsupport](https://github.com/seL4/util_libs/tree/master/libplatsupport) -in order to get the test suite running. The directory structure and -files will look something like the following. Some of these files may not have anything in -them but include them anyway to keep the build system happy. - -Use the other platforms as examples; generally you will have to configure the timer driver by -reading the manual, it may have its own unique programming sequence and can sometimes be a bit tricky. - -If the technical reference manual does not contain enough detail, you may be able to gain more -information by looking at the respective Linux driver for the device. This can be done by searching -for the value of the 'compatible' field that is on each device node in a DTS in the Linux source code. - -You can find the physical addresses and interrupt numbers for each device in its platform reference -manual and copy them into the right places. - -`util_libs/libplatsupport/plat_include//` - -* `clock.h` -* `gpio.h` -* `i2c.h` -* `mux.h` -* `serial.h` -* `timer.h` - -`util_libs/libplatsupport/src/plat//` - -* `chardev.c` -* `ltimer.c` -* `serial.c` -* `timer.c` - -### sel4test configurations - -The default configuration of seL4 in sel4test is non-MCS, single-core, with no hypervisor mode. - -After confirming that the default configuration successfully runs (in both debug and release mode), -it is a good idea to test the more complex configurations with your port as well. - -### Gotchas - -Incorrect address alignment and incorrect memory regions can cause instruction faults. One way to debug this, is -to shorten memory regions in DTS memory nodes to check you are touching the correct area. - -## Contributing - -Once you have a working port that passes seL4test, see the guides for -[contributing in general](https://sel4.systems/Contribute/) -and [contributing kernel changes](kernel-contribution.html). diff --git a/projects/sel4/releases.md b/projects/sel4/releases.md deleted file mode 100644 index 64b5dd001e9..00000000000 --- a/projects/sel4/releases.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -permalink: /releases/seL4.html -redirect_from: - - /sel4_release -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# seL4 releases - -This page documents tagged releases of the seL4 kernel and proofs. - -## Landmark releases - -This section documents the version at which specific features were introduced to -seL4. For future features, see the [roadmap](https://sel4.systems/roadmap.html) -on the main seL4 website. For other previous features, see the release notes -below. - -For the verification status of all platforms, see [Verified -Configurations](../projects/sel4/verified-configurations.html). - -| Feature | Hardware | Available From | -| - | - | - | -| AARCH64 RPI3 | [RPI3](../Hardware/Rpi3.html) | [10.1.0](sel4/10.1.0.html) | -| TX2 support (Aarch64 only) | [TX2](../Hardware/JetsonTX2.html) | [10.1.0](sel4/10.1.0.html) | -| Support for more than 1 VM | ARM | [10.1.0](sel4/10.1.0.html) | -| 32-bit RISC-V architecture support | RISC-V (Spike simulation target) | [10.0.0](sel4/10.0.0.html) | -| 64-bit RISC-V architecture support | RISC-V (Spike simulation target) | [9.0.1](sel4/9.0.1.html) | -| Meltdown mitigation | x86 | [9.0.0](sel4/9.0.0.html) | -| Spectre mitigation | x86 | [9.0.0](sel4/9.0.0.html) | -| Zynq UltraScale+ MPSoC | Xilinx ZCU102, ARMv8a, Cortex A53 | [8.0.0](sel4/8.0.0.html) | -| Multiboot2 support | x86 | [8.0.0](sel4/8.0.0.html) | -| CMake based build system | all | [7.0.0](sel4/7.0.0.html) | -| ARM 32-bit SMP | [Sabre](../Hardware/sabreLite.html) | [6.0.0](sel4/6.0.0.html) | -| ARMv7 32-bit FPU support | ARM | [6.0.0](sel4/6.0.0.html) | -| ARM 64-bit support | Aarch64 | [5.0.0](sel4/5.0.0.html) | -| 64-bit x86 support | x86\_64 | [4.0.0](sel4/4.0.0.html) | -| Raspberry Pi 3 support | [RPI3](../Hardware/Rpi3.html) | [4.0.0](sel4/4.0.0.html) | -| ARM Hypervisor initial support | ARM | [3.2.0](sel4/3.2.0.html) | -| First ARMv8 support | [HiKey](../Hardware/HiKey/) | [3.1.0](sel4/3.1.0.html) | -| NVIDIA Tegra K1 support | [TK1](../Hardware/jetsontk1.html) | [3.0.1](sel4/3.0.1.html) | -| Notification binding | all | [2.0.0](sel4/2.0.0.html) | - -## Main releases - -{% assign coll = site['releases'] | where: "project", "sel4" %} -{% comment %} -Sort sorts by string sorting so a version of 2.3.0 is higher than 10.0.0. -Because of this we need to split the list into two before sorting. -{% endcomment %} -{% assign releases_1 = coll | where_exp:"item", "item.version_digits != 2" | sort: "version" %} -{% assign releases_2 = coll | where_exp:"item", "item.version_digits == 2" | sort: "version" %} -{% assign releases = releases_1 | concat: releases_2 %} - -{% for release in releases reversed %} -{% if release.variant != "mcs" %} -- seL4 Release [{{ release.title }}]({{ release.url | relative_url }}), - with [PDF manual](http://sel4.systems/Info/Docs/seL4-manual-{{ release.version }}.pdf) {% if forloop.first %}(latest){% endif %} -{% endif %} -{% endfor %} - -### Older Mixed Criticality Support (MCS) / Realtime releases - -As of seL4 version 11.0.0, the MCS features are included in the main kernel release, via the build option `KernelIsMCS`. Set `KernelIsMCS` to `ON` to switch the scheduler implementation to MCS and enable the MCS API. - -{% for release in releases reversed %} -{% if release.variant == "mcs" %} -- seL4 Release [{{ release.title }}]({{ release.url | relative_url }}), - corresponding [PDF manual](http://sel4.systems/Info/Docs/seL4-manual-{{ release.version }}.pdf) -{% endif %} -{% endfor %} diff --git a/projects/sel4/status.html b/projects/sel4/status.html new file mode 100644 index 00000000000..d6834212ad0 --- /dev/null +++ b/projects/sel4/status.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/sel4/verified-configurations.html b/projects/sel4/verified-configurations.html new file mode 100644 index 00000000000..2b7ed834995 --- /dev/null +++ b/projects/sel4/verified-configurations.html @@ -0,0 +1,781 @@ + + + + + + + Verified Configurations | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/sel4/verified-configurations.md b/projects/sel4/verified-configurations.md deleted file mode 100644 index e0d38f1c56b..00000000000 --- a/projects/sel4/verified-configurations.md +++ /dev/null @@ -1,229 +0,0 @@ ---- -redirect_from: - - /VerifiedConfigurations -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# Verified Configurations - -This page describes which architecture/platform/configuration combinations of -seL4 have verified properties, which configurations possess which properties, -and how to obtain an seL4 version for a specified configuration. For an overview -of these properties and their explanations, please see the [verification page on -the seL4 website](https://sel4.systems/Verification/). The [Frequently Asked -Questions](https://sel4.systems/About/FAQ.html#verification) also as a section -on the formal verification of seL4. - -The formal proofs for seL4 are hosted at . They -are written in the [Isabelle/HOL](https://isabelle.in.tum.de) theorem prover. See -the [README](https://github.com/seL4/l4v/) file in the l4v repository for build -and setup instructions if you want to run and check the proofs against a -specific version and configuration of seL4. - -## Examining and Building Verified Configurations - -Current verified configurations can be found in seL4 sources in the -`configs` folder: - -```sh -cd configs/ -ls *_verified.cmake -# AARCH64_bcm2711_verified.cmake ARM_exynos5410_verified.cmake -# AARCH64_hikey_verified.cmake ARM_exynos5422_verified.cmake -# AARCH64_imx8mm_verified.cmake ARM_hikey_verified.cmake -# AARCH64_imx8mq_verified.cmake ARM_HYP_exynos5_verified.cmake -# AARCH64_imx93_verified.cmake ARM_HYP_exynos5410_verified.cmake -# AARCH64_maaxboard_verified.cmake ARM_HYP_verified.cmake -# AARCH64_odroidc2_verified.cmake ARM_imx8mm_verified.cmake -# AARCH64_odroidc4_verified.cmake ARM_MCS_verified.cmake -# AARCH64_rockpro64_verified.cmake ARM_omap3_verified.cmake -# AARCH64_tqma_verified.cmake ARM_tk1_verified.cmake -# AARCH64_tx1_verified.cmake ARM_verified.cmake -# AARCH64_ultra96v2_verified.cmake ARM_zynq7000_verified.cmake -# AARCH64_verified.cmake ARM_zynqmp_verified.cmake -# AARCH64_zynqmp_verified.cmake RISCV64_MCS_verified.cmake -# ARM_am335x_verified.cmake RISCV64_verified.cmake -# ARM_bcm2837_verified.cmake X64_verified.cmake -# ARM_exynos4_verified.cmake -``` - -To obtain specific source code and build for a given configuration (e.g. -ARM) in a build directory: - -```sh -mkdir build -cd build -cmake -P ../config/ARM_verified.cmake -``` - -Notably ``kernel.elf`` is the kernel binary, and ``kernel_all_pp.c`` is -the kernel source code after preprocessing, which is used as the basis -for verification efforts. - -Also see [standalone seL4 builds](../buildsystem/standalone.md) for -general guidelines on generating an seL4 binary and build system information -from an existing configuration. - -## Available Verified Configurations - -### Unverified Features - -At present, none of our verified configurations take into account -address translation for devices (System MMU or IOMMU), debug/profiling/printing -interfaces, or the kernel startup at boot. - -The proofs for RISCV64\_MCS/ARM\_MCS (mixed-criticality extensions to real-time -seL4 features), as well as confidentiality proofs for AARCH64 are in progress. -Refer to the [roadmap](https://sel4.systems/roadmap.html) for status and -upcoming features. - -### Arm Aarch32 (`ARM`) {#ARM} - -Configurations that start with `ARM` are verified configurations for the -AArch23 architecture. Those with `MCS` in the name indicate configurations for -the ongoing MCS verification. Proofs for all other `ARM_*` configurations are -completed. - -The following features are supported by verification in AArch32 configurations: - -- Architecture: ARMv7-A 32-bit, kernel running in EL1 -- Floating point support: No -- Hypervisor mode: No ([see separate AArch32/Hypervisor configurations](#ARM_HYP)) - -The following properties are verified: - -- C-level functional correctness, including fast path -- integrity and availability (access control) -- confidentiality (information flow) -- binary correctness, covering C functions that have C-level verification -- model-level functional correctness of the capDL user-level system initialiser/root task - -The following seL4 AArch32 platforms are supported by verification: - -{%- assign sorted = site.pages | sort: 'platform' %} -{%- for plat in sorted %} -{%- if plat.arm_hardware and plat.Maintained -%} -{%- if plat.verification contains "ARM" %} -- [{{plat.platform}}]({{plat.url}}) -{%- endif %} -{%- endif %} -{%- endfor %} - - -### Arm Aarch32 in Hypervisor mode (`ARM_HYP`) {#ARM_HYP} - -Configurations that start with `ARM_HYP` are verified configurations for the -AArch32 architecture with hypervisor mode enabled. The seL4 kernel runs as -hypervisor in EL2. - -The following features are supported by verification in ARM_HYP configurations: - -- Architecture: ARMv7-A 32-bit, kernel running in EL2 -- Floating point support: No -- Hypervisor mode: Yes - -The following properties are verified: - -- C-level functional correctness, including fast path - -The following seL4 AArch32 platforms with hypervisor mode are supported by -verification: - -{%- assign sorted = site.pages | sort: 'platform' %} -{%- for plat in sorted %} -{%- if plat.arm_hardware and plat.Maintained -%} -{%- if plat.verification contains "ARM_HYP" %} -- [{{plat.platform}}]({{plat.url}}) -{%- endif %} -{%- endif %} -{%- endfor %} - - -### Arm AArch64 (`AARCH64`) {#AARCH64} - -Configurations that start with `AARCH64` are verified configurations for the -AArch64 architecture with hypervisor mode enabled. The seL4 kernel runs as -hypervisor in EL2. - -The following features are supported by verification in AARCH64 configurations: - -- Architecture: ARMv8-A 64-bit, kernel running in EL2 -- Floating point support: Yes -- Hypervisor mode: Yes - -The following properties are verified: - -- C-level functional correctness, including fast path -- integrity and availability (access control) - -Further properties are under development. See also the -[roadmap](https://sel4.systems/roadmap.html) for status and schedule. - -The following seL4 AArch64 platforms are supported by verification: - -{%- assign sorted = site.pages | sort: 'platform' %} -{%- for plat in sorted %} -{%- if plat.arm_hardware and plat.Maintained -%} -{%- if plat.verification contains "AARCH64" %} -- [{{plat.platform}}]({{plat.url}}) -{%- endif %} -{%- endif %} -{%- endfor %} - - -### RISC-V 64-bit (`RISCV64`) {#RISCV64} - -Configurations that start with `RISCV64` are verified configurations for the -RISC-V 64-bit architecture. Those with `MCS` in the name indicate configurations -for the ongoing MCS verification. - -The following features are supported by verification in RISCV64 configurations: - -- Architecture: RISC-V 64 bit -- Floating point support: No -- Hypervisor mode: No - -The following properties are verified: - -- C-level functional correctness, no fast path -- integrity and availability (access control) -- confidentiality (information flow) - -The following seL4 RISCV64 platforms are supported by verification: - -{%- assign sorted = site.pages | sort: 'platform' %} -{%- for plat in sorted %} -{%- if plat.riscv_hardware and plat.Maintained -%} -{%- if plat.verification contains "RISCV64" %} -- [{{plat.platform}}]({{plat.url}}) -{%- endif %} -{%- endif %} -{%- endfor %} - - -### Intel x64 (`X64`) {#X64} - -Configurations that start with `X64` are verified configurations for the -x86-64 architecture. - -The following features are supported by verification in X64 configurations: - -- Architecture: Intel x64 -- Floating point support: Yes -- Hypervisor/VT-x mode: No - -The following properties are verified: - -- C-level functional correctness, no fast path - -The following seL4 X64 platforms are supported by verification: - -{%- assign sorted = site.pages | sort: 'platform' %} -{%- for plat in sorted %} -{%- if plat.arch == "x64" and plat.Maintained -%} -{%- if plat.verification contains "X64" %} -- [{{plat.platform}}]({{plat.url}}) -{%- endif %} -{%- endif %} -{%- endfor %} diff --git a/projects/sel4_tools/index.html b/projects/sel4_tools/index.html new file mode 100644 index 00000000000..5214077825d --- /dev/null +++ b/projects/sel4_tools/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/sel4_tools/index.md b/projects/sel4_tools/index.md deleted file mode 100644 index f1a51b31893..00000000000 --- a/projects/sel4_tools/index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -redirect_to: https://github.com/seL4/seL4_tools/tree/master/misc -project: sel4_tools -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- diff --git a/projects/sel4bench/index.html b/projects/sel4bench/index.html new file mode 100644 index 00000000000..cc5e39c5c09 --- /dev/null +++ b/projects/sel4bench/index.html @@ -0,0 +1,1029 @@ + + + + + + + The sel4bench Suite | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/sel4bench/index.md b/projects/sel4bench/index.md deleted file mode 100644 index e6a61ec8e62..00000000000 --- a/projects/sel4bench/index.md +++ /dev/null @@ -1,136 +0,0 @@ ---- -project: sel4bench -toc: true -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# The sel4bench Suite - -_sel4bench_ is an application and support library for benchmarking the -performance of the seL4 kernel. - -A selection of benchmarking results are continually updated on the main [seL4 -website](https://sel4.systems/performance.html#perf-numbers). The page also -shows the build options used to obtain those results. - -Sources: - -- -- - -## Getting the code - -First make sure you have [set up your -machine](../buildsystem/host-dependencies.html). Then run the following. - -{%- assign manifest = "https://github.com/seL4/sel4bench-manifest.git" %} - -```bash -mkdir sel4bench -cd sel4bench -repo init -u {{manifest}} -repo sync -``` - -This clones the seL4 kernel, the benchmarking suite including libraries, and -tools used in the build process. By default, the current master branch of the -kernel is cloned. To clone a specific version of the kernel and compatible -libraries and tools, replace the line - -```bash -repo init {{manifest}} -``` - -above with e.g.: - -```bash -repo init -u {{manifest}} -b refs/tags/{{site.sel4}} -``` - -This example clones version {{site.sel4}} of the kernel. For more information on -version numbers, see the [release page](../../releases.html) and the list of -[seL4 releases](../../releases/seL4.html). - -## Building and running sel4bench - -### Configuration - -The CMake build environment supports a number of platforms. For information on -which ones these are and their corresponding CMake configuration arguments, see -the [Supported Platforms](../../Hardware) page. - -For the available meta configuration options, see [below](#configuration-options). - -For example, to enable the optional _Fault_ benchmark set and build for the -`sabre` platform, we would use the following invocation. - -```bash -# create build directory -mkdir build -cd build -# configure build directory -../init-build.sh -DPLATFORM=sabre -DFAULT=ON -``` - -### Building - -After you have configured the system, you can build it by running: - -```bash -ninja -``` - -### Running it - -The build step above will produce a bootable image file in the `images/` -directory. Please refer to the documentation of the respective build platform -for how to boot the specific board with such an image. - -## Available Benchmarks - -The following table lists the available benchmark sets. _Measured from user -space_ means that the benchmark is not instrumenting the kernel. This means it -measures unmodified kernel code, but may consequently have lower precision -than some of the other benchmarks. - -{% include config_list.md project='sel4bench' list='components' - type='sel4bench-application' code=false no_status=true %} - -## Configuration Options - -Kernel configuration settings can have a large effect on the end results -reported by the benchmarks. Some benchmarks will only work in certain -configurations. To make it easier to configure a build of seL4bench that has the -right configuration values set, use the meta-configuration options listed below. - -{% include config_list.md project='sel4bench' %} - -## Implementation - -### Benchmark runner - -seL4bench must be started directly by seL4 as the root-task in the system. This -is the `sel4bench` binary, which also serves as the main benchmark runner. It -runs the configured benchmarks and sets up a new environment for each benchmark -to run in. When a benchmark completes, it reports the results back to the runner -and the runner prints the results out as JSON once all the benchmarks have -completed. - -### Benchmarking environment - -Each benchmark runs in a separate process environment. Currently there is only a -single kind of environment that all benchmarking apps are expected to execute -in. This environment defines the set of system resources that each benchmark is -given to run with. It also provides the configuration options for each -benchmark. Each benchmark can provide an `init` function and a `parse_results` -function that will get called in the main `sel4bench` app. Otherwise all -benchmark functionality runs in the environment. - -The `libsel4benchsupport` library provides environment functions that the -benchmarks can call. - -### Adding a new benchmark - -For adding new benchmarks see the [sel4bench repository -README](https://github.com/sel4/sel4bench/). diff --git a/projects/sel4bench/status.html b/projects/sel4bench/status.html new file mode 100644 index 00000000000..3758aef08a2 --- /dev/null +++ b/projects/sel4bench/status.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/sel4runtime/index.html b/projects/sel4runtime/index.html new file mode 100644 index 00000000000..cfd6a89f961 --- /dev/null +++ b/projects/sel4runtime/index.html @@ -0,0 +1,674 @@ + + + + + + + The seL4 run-time | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/sel4runtime/index.md b/projects/sel4runtime/index.md deleted file mode 100644 index 41eff3efdb7..00000000000 --- a/projects/sel4runtime/index.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: The seL4 run-time -repo: 'sel4/sel4runtime' -include_file: README.md -project: sel4runtime -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -{% include include_github_repo_markdown.md %} - -{% include include_github_repo_markdown.md file= 'crt/README.md' indent_headings=true %} diff --git a/projects/sel4test/index.html b/projects/sel4test/index.html new file mode 100644 index 00000000000..25a9bf719de --- /dev/null +++ b/projects/sel4test/index.html @@ -0,0 +1,1099 @@ + + + + + + + seL4Test | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/sel4test/index.md b/projects/sel4test/index.md deleted file mode 100644 index 06df5c9cec9..00000000000 --- a/projects/sel4test/index.md +++ /dev/null @@ -1,228 +0,0 @@ ---- -redirect_from: - - /seL4Test -toc: true -project: sel4test -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# seL4Test - -seL4test is a test suite for seL4. It is useful for developing seL4 itself, for -making sure that your development environment is set up correctly, and for -validating properties that are not part of the formal verification of seL4. - -Sources: - -- -- - - -## Getting the Code - -First make sure you have [set up your -machine](../buildsystem/host-dependencies.html). Then run the following. - -{%- assign manifest = "https://github.com/seL4/sel4test-manifest.git" %} - -```bash -mkdir sel4test -cd sel4test -repo init -u {{manifest}} -repo sync -ls -# apps/ CMakeLists.txt init-build.sh kernel libs/ projects/ tools/ -``` - -This clones the seL4 kernel, the test suite, some libraries used by the -tests, and some tools used in the build process. By default, the current -master branch of the kernel is cloned. To clone a specific version of -the kernel and compatible libraries and tools, replace the line - -```bash -repo init {{manifest}} -``` - -above with e.g.: - -```bash -repo init -u {{manifest}} -b refs/tags/{{site.sel4}} -``` - -In this example we clone version {{site.sel4}} of the kernel. For more -information on version numbers, see the [release page](../../releases.html) and -the list of [seL4 releases](../../releases/seL4.html). - -## Building seL4test - -### Configuration - -The CMake build environment supports a number of platforms. For information on -which ones these are and their corresponding CMake configuration arguments, see -the [Supported Platforms](../../Hardware) page. - -To start a build with a specific configuration we can create a new subdirectory -from the project root and initialise it with `init-build`. In the example below -we are using `ia32` as the platform, building in release mode, and with -simulation support switched on. - -```bash -# create build directory -mkdir build -cd build -# configure build directory -../init-build.sh -DPLATFORM=ia32 -DRELEASE=TRUE -DSIMULATION=TRUE -``` - -The general more form of the last command is - -```sh -../init-build.sh -DPLATFORM= -DRELEASE=[TRUE|FALSE] -DSIMULATION=[TRUE|FALSE] -``` - -See below for the full list of [available options](#configuration-options). - -This configures your build directory with the necessary CMake configuration for -your chosen platform. - -You can look at and edit the CMake configuration options from your build -directory using - -```bash -ccmake . -``` - -It is also important to note that meta options such as `PLATFORM` and -`SIMULATION` will override various settings in the seL4test build system in -order to maintain the meta configuration. If you want to control these settings -yourself, this behaviour can be disabled by setting the -`Sel4testAllowSettingsOverride` variable. - - -### Building - -When you've configured the system, you can build it by running: - -```bash -ninja -``` - -## Running it - -### IA32 Example - -If you have followed the example instructions above, and `ninja` has completed -successfully, the build will have produced boot images in the `images/` -directory and a `simulate` script. It was produced, because we passed -`-DSIMULATION=TRUE` to CMake. The option is available for hardware platforms -that are marked as "Simulation target: yes" on their platform info page (e.g. -for [IA32](../../Hardware/IA32.md)). - -Executing the `simulate` script will run QEMU and point it towards the image we -just built: - -```bash -./simulate -``` - -It should produce output such as the following - -``` -... -ELF-loading userland images from boot modules: -size=0x1dd000 v_entry=0x806716f v_start=0x8048000 v_end=0x8225000 p_start=0x21f000 p_end=0x3fc000 -Moving loaded userland images to final location: from=0x21f000 to=0x12e000 size=0x1dd000 -Starting node #0 with APIC ID 0 -Booting all finished, dropped to user space -... -Starting test 18: BIND0001 -Running test BIND0001 (Test that a bound tcb waiting on a sync endpoint receives normal sync ipc and notification notifications.) -Test BIND0001 passed -Starting test 19: BIND0002 -Running test BIND0002 (Test that a bound tcb waiting on its bound notification recieves notifications) -Test BIND0002 passed -Starting test 20: BIND0003 -Running test BIND0003 (Test IPC ordering 1) bound tcb waits on bound notification 2, true) another tcb sends a message) -Test BIND0003 passed -... -``` - -To exit QEMU, press `Ctrl-a`, then `x`. In `DEBUG` configurations, there will be -error messages printed for negative tests. These are expected. The text `All is -well in the universe` at the end indicates a successful run. - -## Testing a Customised Kernel - -Suppose you've got seL4 checked out in `~/projects/seL4`, and `sel4test` in -`~/tests/sel4test`, and you have been making changes on a feature branch of seL4 -named `awesome-new-feature`. You want to test if your modified kernel still -passes all the tests in `sel4test`: - -```bash -cd ~/tests/sel4tests/kernel -git remote add feature ~/projects/seL4 -git fetch feature -git checkout feature/awesome-new-feature -cd .. -``` - -Now the kernel in `sel4test` has been changed to your custom kernel. -Now just build and run the test suite as above. - -## Running a subset of the tests - -You can use a regular expression to select a subset of the tests. This can be -configured by setting the CMake variable `LibSel4TestPrinterRegex`. We can -modify this variable by running `ccmake .` in our build directory. By default -the test suite runs all tests. - -## Configuration Options - -The set of tests that get run will be different for different kernel -configurations. Each test can specify config requirements that will prevent the -test from being run if a certain config option is incompatible. This means that -changing the build configuration can change which tests will be run. To make it -easier to configure a build of seL4test that enables the right coverage of -tests, seL4test provides a selection of meta-configuration options, listed -below. - -{% include config_list.md project='sel4test' %} - -For an overview of the CMake build system and further configuration options for -the kernel, including configuring for cross compilation (e.g., targeting Arm or -RISC-V on an x86 build machine), see the page on seL4's [CMake Build -System](../buildsystem/using.html). - -## Implementation - -This section gives a short overview of the implementation architecture of the -test suite. - -### Test runner - -seL4test must be started directly by seL4 as the root-task in the -system. This is the `sel4test-driver` binary, which also serves as the main -test runner. It runs the configured tests and sets up the required -environment for each test. It prints out test results over a serial connection. - -### Test environments - -Each test runs in a test environment. This environment provides the test with an -expected set of system resources required for it to run. There are currently two -test environments, listed below. It is possible to define more, for instance for -different system dependencies of the tests. - -{% include component_list.md project='sel4test' type='test-environment' no_status=true code=false %} - - -### Test declarations - -Tests can be declared in any library that can be linked with sel4test -applications. A test is defined by using a preprocessor macro defined by its -test environment. This will place the test into a named linker section that the -test runner will use to launch the test at runtime inside its requested -environment. - -See the [sel4test repository README](https://github.com/seL4/sel4test) for more -information on how to add new tests. diff --git a/projects/sel4test/status.html b/projects/sel4test/status.html new file mode 100644 index 00000000000..b38d9f0fec8 --- /dev/null +++ b/projects/sel4test/status.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/sel4webserver/index.html b/projects/sel4webserver/index.html new file mode 100644 index 00000000000..c237e37601b --- /dev/null +++ b/projects/sel4webserver/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/sel4webserver/index.md b/projects/sel4webserver/index.md deleted file mode 100644 index f149a2a1e64..00000000000 --- a/projects/sel4webserver/index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -archive: true -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. -redirect_to: https://github.com/seL4/sel4webserver/blob/master/README.md ---- diff --git a/projects/user_libs/index.html b/projects/user_libs/index.html new file mode 100644 index 00000000000..7b7820bd9a5 --- /dev/null +++ b/projects/user_libs/index.html @@ -0,0 +1,3084 @@ + + + + + + + User-level C libraries | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/user_libs/index.md b/projects/user_libs/index.md deleted file mode 100644 index 4d2d55dd914..00000000000 --- a/projects/user_libs/index.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -redirect_from: - - /SeL4Libraries -toc: true -wide: true -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# User-level C libraries - -The following collection of C libraries is useful for prototyping directly on -the seL4 API. They are meant for trying things out, not for production code. -They are not verified and come with no particular code assurance. They are -provided because they might be useful for experimentation. - -For production code we recommend the seL4 [Microkit], or [CAmkES] when the -Microkit is not applicable, and the [Rust] libraries for more dynamic systems. - -Microkit does not use these libraries and expects a separate development -environment for user-level code. Some CAmkES example applications do use the -libraries below. Most of the CAmkES applications and also the libraries above -use the seL4 port of [libmuslc](https://github.com/seL4/musllibc). - -The library collections maintained by the seL4 Foundation are -[util_libs](#util_libs), [projects_libs](#projects_libs), -[seL4_libs](#sel4_libs), [seL4_projects_libs](#sel4_projects_libs), -and [libplatsupport](#libplatsupport). - -## OS independent libraries - -OS independent low-level utilities in the repositories [util_libs] and -[projects_libs]. New libraries should go into `project_libs`. - -[util_libs]: https://github.com/seL4/util_libs -[projects_libs]: https://github.com/seL4/projects_libs - -### util_libs - -Sources: - -{% include component_list.md - project='user_libs' type='util_libs' filter='active' no_status=true %} - -### projects_libs - -Sources: - -{% include component_list.md - project='user_libs' type='projects_libs' filter='active' no_status=true %} - -## seL4-specific libraries - -Basic libraries with abstractions for interacting with seL4 from C. - -### seL4_libs - -Sources: - -{% include component_list.md - project='user_libs' type='seL4_libs' filter='active' no_status=true %} - -### seL4_projects_libs - -Sources: - -{% include component_list.md - project='user_libs' type='seL4_projects_libs' filter='active' no_status=true %} - - -## Platform support {#libplatsupport} - -Drivers for some of the devices on boards that seL4 supports. - -The categories below are [Serial](#serial), [Timer](#timer), [Clock](#clock), -[I2C](#i2c), [Pinmux](#pinmux), [Reset](#reset), [GPIO](#gpio), -[ltimer](#ltimer), [Ethernet](#ethernet), and [Other](#other). Not all drivers -are supported on all boards. Serial and Timer/ltimer drivers are necessary to -support the `sel4test` and `sel4bench` test suites and are supported on nearly -all boards. - -The seL4-independent parts of the `libpatsupport` libraries live in `util_libs`, -and the seL4-specific parts in `sel4_libs`. - -Sources: - -- -- - -### Serial - -{% include component_list.md project='user_libs' type='user-driver-serial' %} - -### Timer - -{% include component_list.md project='user_libs' type='user-driver-timer' %} - -### Clock - -{% include component_list.md project='user_libs' type='user-driver-clock' %} - -### I2C - -{% include component_list.md project='user_libs' type='user-driver-i2c' %} - -### Pinmux - -{% include component_list.md project='user_libs' type='user-driver-pinmux' %} - -### Reset - -{% include component_list.md project='user_libs' type='user-driver-reset' %} - -### GPIO - -{% include component_list.md project='user_libs' type='user-driver-gpio' %} - -### ltimer - -{% include component_list.md project='user_libs' type='user-driver-ltimer' %} - -### Ethernet - -{% include component_list.md project='user_libs' type='user-driver-ethernet' %} - -### Other - -{% include component_list.md project='user_libs' type='user-driver-other' %} - - - - -[Microkit]: {{ '/projects/microkit/' | relative_url }} -[CAmkES]: {{ '/projects/camkes/' | relative_url }} -[Rust]: {{ '/projects/rust/' | relative_url }} diff --git a/projects/user_libs/status.html b/projects/user_libs/status.html new file mode 100644 index 00000000000..8e9c58dd86f --- /dev/null +++ b/projects/user_libs/status.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/virtualization/docs/api/libsel4vm_arm_guest_vm.html b/projects/virtualization/docs/api/libsel4vm_arm_guest_vm.html new file mode 100644 index 00000000000..38fa67d1496 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vm_arm_guest_vm.html @@ -0,0 +1,656 @@ + + + + + + + libsel4vm_arm_guest_vm | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vm_boot.html b/projects/virtualization/docs/api/libsel4vm_boot.html new file mode 100644 index 00000000000..fdd0293e20e --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vm_boot.html @@ -0,0 +1,678 @@ + + + + + + + libsel4vm_boot | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vm_guest_arm_context.html b/projects/virtualization/docs/api/libsel4vm_guest_arm_context.html new file mode 100644 index 00000000000..da048e0b572 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vm_guest_arm_context.html @@ -0,0 +1,751 @@ + + + + + + + libsel4vm_guest_arm_context | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vm_guest_iospace.html b/projects/virtualization/docs/api/libsel4vm_guest_iospace.html new file mode 100644 index 00000000000..a8cc848e50f --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vm_guest_iospace.html @@ -0,0 +1,627 @@ + + + + + + + libsel4vm_guest_iospace | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vm_guest_irq_controller.html b/projects/virtualization/docs/api/libsel4vm_guest_irq_controller.html new file mode 100644 index 00000000000..2697f8a7716 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vm_guest_irq_controller.html @@ -0,0 +1,700 @@ + + + + + + + libsel4vm_guest_irq_controller | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vm_guest_memory.html b/projects/virtualization/docs/api/libsel4vm_guest_memory.html new file mode 100644 index 00000000000..a0b34579b58 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vm_guest_memory.html @@ -0,0 +1,816 @@ + + + + + + + libsel4vm_guest_memory | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vm_guest_memory_helpers.html b/projects/virtualization/docs/api/libsel4vm_guest_memory_helpers.html new file mode 100644 index 00000000000..ceb05b848f2 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vm_guest_memory_helpers.html @@ -0,0 +1,629 @@ + + + + + + + libsel4vm_guest_memory_helpers | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vm_guest_ram.html b/projects/virtualization/docs/api/libsel4vm_guest_ram.html new file mode 100644 index 00000000000..882c83961cc --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vm_guest_ram.html @@ -0,0 +1,830 @@ + + + + + + + libsel4vm_guest_ram | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vm_guest_vcpu_fault.html b/projects/virtualization/docs/api/libsel4vm_guest_vcpu_fault.html new file mode 100644 index 00000000000..9eb45777dbb --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vm_guest_vcpu_fault.html @@ -0,0 +1,831 @@ + + + + + + + libsel4vm_guest_vcpu_fault | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vm_guest_vm.html b/projects/virtualization/docs/api/libsel4vm_guest_vm.html new file mode 100644 index 00000000000..72158adbdb2 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vm_guest_vm.html @@ -0,0 +1,860 @@ + + + + + + + libsel4vm_guest_vm | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vm_guest_vm_util.html b/projects/virtualization/docs/api/libsel4vm_guest_vm_util.html new file mode 100644 index 00000000000..e9b06e16a1b --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vm_guest_vm_util.html @@ -0,0 +1,764 @@ + + + + + + + libsel4vm_guest_vm_util | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vm_guest_x86_context.html b/projects/virtualization/docs/api/libsel4vm_guest_x86_context.html new file mode 100644 index 00000000000..36d0e8f2254 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vm_guest_x86_context.html @@ -0,0 +1,751 @@ + + + + + + + libsel4vm_guest_x86_context | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vm_x86_guest_vm.html b/projects/virtualization/docs/api/libsel4vm_x86_guest_vm.html new file mode 100644 index 00000000000..e11fb698e96 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vm_x86_guest_vm.html @@ -0,0 +1,644 @@ + + + + + + + libsel4vm_x86_guest_vm | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vm_x86_ioports.html b/projects/virtualization/docs/api/libsel4vm_x86_ioports.html new file mode 100644 index 00000000000..c5b3393e94c --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vm_x86_ioports.html @@ -0,0 +1,677 @@ + + + + + + + libsel4vm_x86_ioports | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vm_x86_vmcall.html b/projects/virtualization/docs/api/libsel4vm_x86_vmcall.html new file mode 100644 index 00000000000..8fdb188f6ca --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vm_x86_vmcall.html @@ -0,0 +1,629 @@ + + + + + + + libsel4vm_x86_vmcall | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_ac_device.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_ac_device.html new file mode 100644 index 00000000000..86977849588 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_ac_device.html @@ -0,0 +1,640 @@ + + + + + + + libsel4vmmplatsupport_arm_ac_device | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_generic_forward_device.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_generic_forward_device.html new file mode 100644 index 00000000000..41cd1dc3e9f --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_generic_forward_device.html @@ -0,0 +1,658 @@ + + + + + + + libsel4vmmplatsupport_arm_generic_forward_device | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_guest_boot_init.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_guest_boot_init.html new file mode 100644 index 00000000000..ba9e8050dcc --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_guest_boot_init.html @@ -0,0 +1,653 @@ + + + + + + + libsel4vmmplatsupport_arm_guest_boot_init | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_guest_reboot.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_guest_reboot.html new file mode 100644 index 00000000000..b7870de2af4 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_guest_reboot.html @@ -0,0 +1,721 @@ + + + + + + + libsel4vmmplatsupport_arm_guest_reboot | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_guest_vcpu_fault.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_guest_vcpu_fault.html new file mode 100644 index 00000000000..a5abe79e76a --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_guest_vcpu_fault.html @@ -0,0 +1,651 @@ + + + + + + + libsel4vmmplatsupport_arm_guest_vcpu_fault | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_guest_vcpu_util.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_guest_vcpu_util.html new file mode 100644 index 00000000000..1ef0a944308 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_guest_vcpu_util.html @@ -0,0 +1,626 @@ + + + + + + + libsel4vmmplatsupport_arm_guest_vcpu_util | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_vpci.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_vpci.html new file mode 100644 index 00000000000..cd1cea6e418 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_vpci.html @@ -0,0 +1,654 @@ + + + + + + + libsel4vmmplatsupport_arm_vpci | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_vusb.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_vusb.html new file mode 100644 index 00000000000..ff8a97245c5 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_vusb.html @@ -0,0 +1,655 @@ + + + + + + + libsel4vmmplatsupport_arm_vusb | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_cross_vm_connection.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_cross_vm_connection.html new file mode 100644 index 00000000000..57ed33a4776 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_cross_vm_connection.html @@ -0,0 +1,706 @@ + + + + + + + libsel4vmmplatsupport_cross_vm_connection | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_device.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_device.html new file mode 100644 index 00000000000..42f2245a811 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_device.html @@ -0,0 +1,721 @@ + + + + + + + libsel4vmmplatsupport_device | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_device_utils.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_device_utils.html new file mode 100644 index 00000000000..3cbad858d13 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_device_utils.html @@ -0,0 +1,674 @@ + + + + + + + libsel4vmmplatsupport_device_utils | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_guest_image.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_guest_image.html new file mode 100644 index 00000000000..973b529227a --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_guest_image.html @@ -0,0 +1,703 @@ + + + + + + + libsel4vmmplatsupport_guest_image | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_guest_memory_util.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_guest_memory_util.html new file mode 100644 index 00000000000..b9d50c9d8e2 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_guest_memory_util.html @@ -0,0 +1,753 @@ + + + + + + + libsel4vmmplatsupport_guest_memory_util | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_guest_vcpu_util.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_guest_vcpu_util.html new file mode 100644 index 00000000000..b7d3a4cf0db --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_guest_vcpu_util.html @@ -0,0 +1,626 @@ + + + + + + + libsel4vmmplatsupport_guest_vcpu_util | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_ioports.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_ioports.html new file mode 100644 index 00000000000..e2dad68b03b --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_ioports.html @@ -0,0 +1,768 @@ + + + + + + + libsel4vmmplatsupport_ioports | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_pci.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_pci.html new file mode 100644 index 00000000000..9ea3309e047 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_pci.html @@ -0,0 +1,764 @@ + + + + + + + libsel4vmmplatsupport_pci | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_pci_helper.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_pci_helper.html new file mode 100644 index 00000000000..a21b6a07990 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_pci_helper.html @@ -0,0 +1,965 @@ + + + + + + + libsel4vmmplatsupport_pci_helper | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_virtio_con.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_virtio_con.html new file mode 100644 index 00000000000..dbc4bebcd25 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_virtio_con.html @@ -0,0 +1,664 @@ + + + + + + + libsel4vmmplatsupport_virtio_con | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_virtio_net.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_virtio_net.html new file mode 100644 index 00000000000..62ffd582b37 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_virtio_net.html @@ -0,0 +1,687 @@ + + + + + + + libsel4vmmplatsupport_virtio_net | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_x86_acpi.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_x86_acpi.html new file mode 100644 index 00000000000..862a1f99a89 --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_x86_acpi.html @@ -0,0 +1,625 @@ + + + + + + + libsel4vmmplatsupport_x86_acpi | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_x86_guest_boot_init.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_x86_guest_boot_init.html new file mode 100644 index 00000000000..b5991dfc97b --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_x86_guest_boot_init.html @@ -0,0 +1,656 @@ + + + + + + + libsel4vmmplatsupport_x86_guest_boot_init | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/api/libsel4vmmplatsupport_x86_vmm_pci_helper.html b/projects/virtualization/docs/api/libsel4vmmplatsupport_x86_vmm_pci_helper.html new file mode 100644 index 00000000000..59f1a1b921b --- /dev/null +++ b/projects/virtualization/docs/api/libsel4vmmplatsupport_x86_vmm_pci_helper.html @@ -0,0 +1,675 @@ + + + + + + + libsel4vmmplatsupport_x86_vmm_pci_helper | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + + + + +
+
+
+ + diff --git a/projects/virtualization/docs/libsel4vm.html b/projects/virtualization/docs/libsel4vm.html new file mode 100644 index 00000000000..e903d065ffb --- /dev/null +++ b/projects/virtualization/docs/libsel4vm.html @@ -0,0 +1,617 @@ + + + + + + + VM library (libsel4vm) | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/virtualization/docs/libsel4vm.md b/projects/virtualization/docs/libsel4vm.md deleted file mode 100644 index 3cc453e2b80..00000000000 --- a/projects/virtualization/docs/libsel4vm.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# VM library (libsel4vm) - -A guest hardware virtualisation library for IA32 and ARM (AArch32 & -AArch64) for use on seL4-based systems. The library as such is not specific to -CAmkES, but the main users of this library are the [CAmkES VMs] on x86 and Arm. - -This is a consolidated library composed of the now deprecated libraries -`libsel4vmm` (x86) and `libsel4arm-vmm` (Arm). - -Sources: - -[CAmkES VMs]: {{ '/projects/camkes-vm/' | relative_url }} - -## Features - -The library supports IRQ Controller emulation (GICv2 on AArch32 and AArch64, and -PIC & LAPIC on IA32), guest VM memory management, guest VCPU fault and context -management, as well as VM runtime management. - -The Arm library has SMP support for GICv2 platforms, the IA32 library provides -an IOPort fault registration handler and a VMCall handler registration interface. - -## API documentation - -See below for usage documentation on `libsel4vm`. - -### Common Interfaces - -* [sel4vm/boot.h](api/libsel4vm_boot.html): An interface for creating, initialising - and configuring VM instances -* [sel4vm/guest_irq_controller.h](api/libsel4vm_guest_irq_controller.html): - Abstractions around initialising a guest VM IRQ controller -* [sel4vm/guest_memory_helpers.h](api/libsel4vm_guest_memory_helpers.html): Helpers - for using the guest memory interface -* [sel4vm/guest_vcpu_fault.h](api/libsel4vm_guest_vcpu_fault.html): Useful methods to - query and configure vcpu objects that have faulted during execution -* [sel4vm/guest_vm.h](api/libsel4vm_guest_vm.html): Provides base definitions of the - guest vm datastructure and primitives to run the VM instance -* [sel4vm/guest_iospace.h](api/libsel4vm_guest_iospace.html): Enables the - registration and management of a guest VM's IO Space -* [sel4vm/guest_memory.h](api/libsel4vm_guest_memory.html): Useful abstractions to - manage your guest VM's physical address space -* [sel4vm/guest_ram.h](api/libsel4vm_guest_ram.html): A set of methods to manage, - register, allocate and copy to/from a guest VM's RAM -* [sel4vm/guest_vm_util.h](api/libsel4vm_guest_vm_util.html): A set of utilties to - query a guest vm instance - -### Architecture Specific Interfaces - -#### ARM - -* [sel4vm/arch/guest_arm_context.h](api/libsel4vm_guest_arm_context.html): Provides a - set of useful getters and setters on ARM vcpu thread contexts -* [sel4vm/arch/guest_vm_arch.h](api/libsel4vm_arm_guest_vm.html): Provide definitions - of the arm guest vm datastructures and primitives to configure the VM instance - -#### X86 - -* [sel4vm/arch/guest_x86_context.h](api/libsel4vm_guest_x86_context.html): Provides a - set of useful getters and setters on x86 vcpu thread contexts -* [sel4vm/arch/guest_vm_arch.h](api/libsel4vm_x86_guest_vm.html): Provide definitions - of the x86 guest vm datastructures and primitives to configure the VM instance -* [sel4vm/arch/vmcall.h](api/libsel4vm_x86_vmcall.html): Methods for registering and - managing vmcall instruction handlers -* [sel4vm/arch/ioports.h](api/libsel4vm_x86_ioports.html): Abstractions for - initialising, registering and handling ioport events diff --git a/projects/virtualization/docs/libsel4vmm.html b/projects/virtualization/docs/libsel4vmm.html new file mode 100644 index 00000000000..c7052842033 --- /dev/null +++ b/projects/virtualization/docs/libsel4vmm.html @@ -0,0 +1,650 @@ + + + + + + + VMM library (libsel4vmmplatsupport) | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/projects/virtualization/docs/libsel4vmm.md b/projects/virtualization/docs/libsel4vmm.md deleted file mode 100644 index 184eac07d63..00000000000 --- a/projects/virtualization/docs/libsel4vmm.md +++ /dev/null @@ -1,105 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- - -# VMM library (libsel4vmmplatsupport) - -A library containing various VMM utilities and drivers that can be used to -construct a Guest VM on a supported platform. This library makes use of -‘libsel4vm’ to implement VMM support. The main reference implementations using -this library are the [CAmkES VMs] on Arm and IA32. The sources are [available on -GitHub][sources]. - - -[sources]: https://github.com/seL4/seL4_projects_libs/blob/master/libsel4vmmplatsupport/README.md -[CAmkES VMs]: {{ '/projects/camkes-vm/' | relative_url }} -[libsel4vm]: {{ '/projects/virtualization/docs/libsel4vm.html' | relative_url }} - -## Main features - -The library contains Virtio support and Virtio drivers for PCI, Console, and -Net. It provides a cross-VM connection/communication driver, guest image loading -utilities (e.g. kernel, initramfs), [libsel4vm] memory helpers and utilities, -and an IOPorts management interface. - -On Arm, it further provides a VCPU fault handler module with HSR/Exception & SMC -decoding and dispatching, PSCI handlers through a VCPU fault (+SMC handler) -interface, guest reboot utilities, and guest OS boot interfaces for Linux VMs. -It defines generic virtual device interfaces for generic access controlled -devices (read/write privileges), and for generic forwarding devices via -dispatching faults to external handlers. It also provides a virtual USB driver. - -On IA32, the library supports ACPI table generation, PCI device passthrough -helpers, and guest OS Boot interfaces for Linux VMs that provide boot VCPU -initialisation, BIOS boot info structure generation, E820 map generation, and -VESA initialisation. - -## API documentation - -See below for usage documentation on `libsel4vmmplatsupport` interfaces. - -### Common Interfaces - -* [sel4vmmplatsupport/device.h](api/libsel4vmmplatsupport_device.html): Provides a - series of datastructures and helpers to manage VMM devices. -* [sel4vmmplatsupport/device_utils.h](api/libsel4vmmplatsupport_device_utils.html): - Provides various helpers to establish different types devices for a given VM - instance -* [sel4vmmplatsupport/guest_image.h](api/libsel4vmmplatsupport_guest_image.html): - Provides general utilites to load guest vm images (e.g. kernel, initrd, - modules) -* [sel4vmmplatsupport/guest_memory_util.h](api/libsel4vmmplatsupport_guest_memory_util.html): - Provides various utilities and helpers for using the libsel4vm guest memory - interface -* [sel4vmmplatsupport/guest_vcpu_util.h](api/libsel4vmmplatsupport_guest_vcpu_util.html): - Provides abstractions and helpers for managing libsel4vm vcpus -* [sel4vmmplatsupport/ioports.h](api/libsel4vmmplatsupport_ioports.html): Useful - abstraction for initialising, registering and handling ioport events for a - guest VM instance -* [sel4vmmplatsupport/drivers/cross_vm_connection.h](api/libsel4vmmplatsupport_cross_vm_connection.html): - Facilitates the creation of communication channels between VM's and other - components on an seL4-based system -* [sel4vmmplatsupport/drivers/pci.h](api/libsel4vmmplatsupport_pci.html): Interface - presents a VMM PCI Driver, which manages the host's PCI devices, and handles - guest OS PCI config space read & writes -* [sel4vmmplatsupport/drivers/pci_helper.h](api/libsel4vmmplatsupport_pci_helper.html): - This interface presents a series of helpers when using the VMM PCI Driver -* [sel4vmmplatsupport/drivers/virtio_con.h](api/libsel4vmmplatsupport_virtio_con.html): - This interface provides the ability to initalise a VMM virtio console driver -* [sel4vmmplatsupport/drivers/virtio_net.h](api/libsel4vmmplatsupport_virtio_net.html): - This interface provides the ability to initalise a VMM virtio net driver - -### Architecture Specific Interfaces - -#### Arm - -* [sel4vmmplatsupport/arch/generic_forward_device.h](api/libsel4vmmplatsupport_arm_generic_forward_device.html): - This interface facilitates the creation of a virtual device used for - dispatching faults to external handlers -* [sel4vmmplatsupport/arch/guest_boot_init.h](api/libsel4vmmplatsupport_arm_guest_boot_init.html): - Provides helpers to initialise the booting state of a VM instance -* [sel4vmmplatsupport/arch/guest_reboot,h](api/libsel4vmmplatsupport_arm_guest_reboot.html): - Provides a series of helpers for registering callbacks when rebooting the VMM -* [sel4vmmplatsupport/arch/guest_vcpu_fault.h](api/libsel4vmmplatsupport_arm_guest_vcpu_fault.html): - Provides a module for registering and processing ARM vcpu faults -* [sel4vmmplatsupport/arch/guest_vcpu_util.h](api/libsel4vmmplatsupport_arm_guest_vcpu_util.html): - Provides abstractions and helpers for managing libsel4vm vcpus on an ARM - platform -* [sel4vmmplatsupport/arch/vpci.h](api/libsel4vmmplatsupport_arm_vpci.html): Presents - a Virtual PCI driver for ARM-based VM's -* [sel4vmmplatsupport/arch/vusb.h](api/libsel4vmmplatsupport_arm_vusb.html): Presents - a Virtual USB driver for ARM-based VM's -* [sel4vmmplatsupport/arch/ac_device.h](api/libsel4vmmplatsupport_arm_ac_device.html): - Facilitates the creation of generic virtual devices in a VM instance with - access control permissions over the devices addressable memory - -#### x86 - -* [sel4vmmplatsupport/arch/acpi.h](api/libsel4vmmplatsupport_x86_acpi.html): Provides - support for generating ACPI table in a guest x86 VM -* [sel4vmmplatsupport/arch/guest_boot_init.h](api/libsel4vmmplatsupport_x86_guest_boot_init.html): - Provides helpers to initialise the booting state of a VM instance -* [sel4vmmplatsupport/arch/drivers/vmm_pci_helper.h](api/libsel4vmmplatsupport_x86_vmm_pci_helper.html): - Interface presents a series of helpers for establishing VMM PCI support on x86 - platforms diff --git a/projects/virtualization/index.html b/projects/virtualization/index.html new file mode 100644 index 00000000000..88ec105e289 --- /dev/null +++ b/projects/virtualization/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/virtualization/index.md b/projects/virtualization/index.md deleted file mode 100644 index e6f8d9cd5cd..00000000000 --- a/projects/virtualization/index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -redirect_from: - - /VM/ -redirect_to: projects/camkes-vm/ -project: virtualization -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- diff --git a/projects/virtualization/libsel4vm.html b/projects/virtualization/libsel4vm.html new file mode 100644 index 00000000000..ce5d4ae0a13 --- /dev/null +++ b/projects/virtualization/libsel4vm.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/virtualization/libsel4vm.md b/projects/virtualization/libsel4vm.md deleted file mode 100644 index 798822b496f..00000000000 --- a/projects/virtualization/libsel4vm.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: libsel4vm -redirect_to: /projects/virtualization/docs/libsel4vm.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- diff --git a/projects/virtualization/libsel4vmmplatsupport.html b/projects/virtualization/libsel4vmmplatsupport.html new file mode 100644 index 00000000000..294d2eaff58 --- /dev/null +++ b/projects/virtualization/libsel4vmmplatsupport.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/projects/virtualization/libsel4vmmplatsupport.md b/projects/virtualization/libsel4vmmplatsupport.md deleted file mode 100644 index f79bac4ad7c..00000000000 --- a/projects/virtualization/libsel4vmmplatsupport.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: libsel4vmmplatsupport -redirect_to: /projects/virtualization/docs/libsel4vmm.html -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2020 seL4 Project a Series of LF Projects, LLC. ---- diff --git a/redirects.json b/redirects.json new file mode 100644 index 00000000000..b2eb5366183 --- /dev/null +++ b/redirects.json @@ -0,0 +1 @@ +{"/camkes_release/CAmkES_2.0.0/":"https://docs.sel4.systems/releases/camkes/camkes-2.0.0.html","/camkes_release/CAmkES_2.0.0.html":"https://docs.sel4.systems/releases/camkes/camkes-2.0.0.html","/camkes_release/CAmkES_2.1.0/":"https://docs.sel4.systems/releases/camkes/camkes-2.1.0.html","/camkes_release/CAmkES_2.1.0.html":"https://docs.sel4.systems/releases/camkes/camkes-2.1.0.html","/camkes_release/CAmkES_2.2.0/":"https://docs.sel4.systems/releases/camkes/camkes-2.2.0.html","/camkes_release/CAmkES_2.2.0.html":"https://docs.sel4.systems/releases/camkes/camkes-2.2.0.html","/camkes_release/CAmkES_2.3.0/":"https://docs.sel4.systems/releases/camkes/camkes-2.3.0.html","/camkes_release/CAmkES_2.3.0.html":"https://docs.sel4.systems/releases/camkes/camkes-2.3.0.html","/camkes_release/CAmkES_2.3.1/":"https://docs.sel4.systems/releases/camkes/camkes-2.3.1.html","/camkes_release/CAmkES_2.3.1.html":"https://docs.sel4.systems/releases/camkes/camkes-2.3.1.html","/camkes_release/CAmkES_3.0.0/":"https://docs.sel4.systems/releases/camkes/camkes-3.0.0.html","/camkes_release/CAmkES_3.0.0.html":"https://docs.sel4.systems/releases/camkes/camkes-3.0.0.html","/camkes_release/CAmkES_3.1.0/":"https://docs.sel4.systems/releases/camkes/camkes-3.1.0.html","/camkes_release/CAmkES_3.1.0.html":"https://docs.sel4.systems/releases/camkes/camkes-3.1.0.html","/camkes_release/CAmkES_3.2.0/":"https://docs.sel4.systems/releases/camkes/camkes-3.2.0.html","/camkes_release/CAmkES_3.2.0.html":"https://docs.sel4.systems/releases/camkes/camkes-3.2.0.html","/camkes_release/CAmkES_3.3.0/":"https://docs.sel4.systems/releases/camkes/camkes-3.3.0.html","/camkes_release/CAmkES_3.3.0.html":"https://docs.sel4.systems/releases/camkes/camkes-3.3.0.html","/camkes_release/CAmkES_3.4.0/":"https://docs.sel4.systems/releases/camkes/camkes-3.4.0.html","/camkes_release/CAmkES_3.4.0.html":"https://docs.sel4.systems/releases/camkes/camkes-3.4.0.html","/camkes_release/CAmkES_3.5.0/":"https://docs.sel4.systems/releases/camkes/camkes-3.5.0.html","/camkes_release/CAmkES_3.5.0.html":"https://docs.sel4.systems/releases/camkes/camkes-3.5.0.html","/camkes_release/Camkes_3.6.0/":"https://docs.sel4.systems/releases/camkes/camkes-3.6.0.html","/camkes_release/Camkes_3.6.0.html":"https://docs.sel4.systems/releases/camkes/camkes-3.6.0.html","/camkes_release/Camkes_3.7.0/":"https://docs.sel4.systems/releases/camkes/camkes-3.7.0.html","/camkes_release/Camkes_3.7.0.html":"https://docs.sel4.systems/releases/camkes/camkes-3.7.0.html","/sel4_release/seL4_0.0.1-rt-dev/":"https://docs.sel4.systems/releases/sel4/0.0.1-rt-dev.html","/sel4_release/seL4_0.0.1-rt-dev.html":"https://docs.sel4.systems/releases/sel4/0.0.1-rt-dev.html","/sel4_release/seL4_1.0.0-rt-dev/":"https://docs.sel4.systems/releases/sel4/1.0.0-rt-dev.html","/sel4_release/seL4_1.0.0-rt-dev.html":"https://docs.sel4.systems/releases/sel4/1.0.0-rt-dev.html","/sel4_release/seL4_10.0.0/":"https://docs.sel4.systems/releases/sel4/10.0.0.html","/sel4_release/seL4_10.0.0.html":"https://docs.sel4.systems/releases/sel4/10.0.0.html","/sel4_release/seL4_10.1.0/":"https://docs.sel4.systems/releases/sel4/10.1.0.html","/sel4_release/seL4_10.1.0.html":"https://docs.sel4.systems/releases/sel4/10.1.0.html","/sel4_release/seL4_10.1.1-mcs/":"https://docs.sel4.systems/releases/sel4/10.1.1-mcs.html","/sel4_release/seL4_10.1.1-mcs.html":"https://docs.sel4.systems/releases/sel4/10.1.1-mcs.html","/sel4_release/seL4_10.1.1/":"https://docs.sel4.systems/releases/sel4/10.1.1.html","/sel4_release/seL4_10.1.1.html":"https://docs.sel4.systems/releases/sel4/10.1.1.html","/sel4_release/seL4_2.0.0/":"https://docs.sel4.systems/releases/sel4/2.0.0.html","/sel4_release/seL4_2.0.0.html":"https://docs.sel4.systems/releases/sel4/2.0.0.html","/sel4_release/seL4_2.1.0/":"https://docs.sel4.systems/releases/sel4/2.1.0.html","/sel4_release/seL4_2.1.0.html":"https://docs.sel4.systems/releases/sel4/2.1.0.html","/sel4_release/seL4_3.0.0/":"https://docs.sel4.systems/releases/sel4/3.0.0.html","/sel4_release/seL4_3.0.0.html":"https://docs.sel4.systems/releases/sel4/3.0.0.html","/sel4_release/seL4_3.0.1/":"https://docs.sel4.systems/releases/sel4/3.0.1.html","/sel4_release/seL4_3.0.1.html":"https://docs.sel4.systems/releases/sel4/3.0.1.html","/sel4_release/seL4_3.1.0/":"https://docs.sel4.systems/releases/sel4/3.1.0.html","/sel4_release/seL4_3.1.0.html":"https://docs.sel4.systems/releases/sel4/3.1.0.html","/sel4_release/seL4_3.2.0/":"https://docs.sel4.systems/releases/sel4/3.2.0.html","/sel4_release/seL4_3.2.0.html":"https://docs.sel4.systems/releases/sel4/3.2.0.html","/sel4_release/seL4_4.0.0/":"https://docs.sel4.systems/releases/sel4/4.0.0.html","/sel4_release/seL4_4.0.0.html":"https://docs.sel4.systems/releases/sel4/4.0.0.html","/sel4_release/seL4_5.0.0/":"https://docs.sel4.systems/releases/sel4/5.0.0.html","/sel4_release/seL4_5.0.0.html":"https://docs.sel4.systems/releases/sel4/5.0.0.html","/sel4_release/seL4_5.1.0/":"https://docs.sel4.systems/releases/sel4/5.1.0.html","/sel4_release/seL4_5.1.0.html":"https://docs.sel4.systems/releases/sel4/5.1.0.html","/sel4_release/seL4_5.2.0-mcs/":"https://docs.sel4.systems/releases/sel4/5.2.0-mcs.html","/sel4_release/seL4_5.2.0-mcs.html":"https://docs.sel4.systems/releases/sel4/5.2.0-mcs.html","/sel4_release/seL4_5.2.0/":"https://docs.sel4.systems/releases/sel4/5.2.0.html","/sel4_release/seL4_5.2.0.html":"https://docs.sel4.systems/releases/sel4/5.2.0.html","/sel4_release/seL4_6.0.0/":"https://docs.sel4.systems/releases/sel4/6.0.0.html","/sel4_release/seL4_6.0.0.html":"https://docs.sel4.systems/releases/sel4/6.0.0.html","/sel4_release/seL4_7.0.0/":"https://docs.sel4.systems/releases/sel4/7.0.0.html","/sel4_release/seL4_7.0.0.html":"https://docs.sel4.systems/releases/sel4/7.0.0.html","/sel4_release/seL4_8.0.0/":"https://docs.sel4.systems/releases/sel4/8.0.0.html","/sel4_release/seL4_8.0.0.html":"https://docs.sel4.systems/releases/sel4/8.0.0.html","/sel4_release/seL4_9.0.0-mcs/":"https://docs.sel4.systems/releases/sel4/9.0.0-mcs.html","/sel4_release/seL4_9.0.0-mcs.html":"https://docs.sel4.systems/releases/sel4/9.0.0-mcs.html","/sel4_release/seL4_9.0.0/":"https://docs.sel4.systems/releases/sel4/9.0.0.html","/sel4_release/seL4_9.0.0.html":"https://docs.sel4.systems/releases/sel4/9.0.0.html","/sel4_release/seL4_9.0.1/":"https://docs.sel4.systems/releases/sel4/9.0.1.html","/sel4_release/seL4_9.0.1.html":"https://docs.sel4.systems/releases/sel4/9.0.1.html","/status/camkes.html":"https://docs.sel4.systems/projects/camkes/status.html","/projects/camkes/status.html":"https://docs.sel4.systems/projects/camkes/features.html","/status/sel4.html":"https://docs.sel4.systems/projects/sel4/status.html","/projects/sel4/status.html":"https://docs.sel4.systems/projects/sel4/configurations.html","/status/sel4bench.html":"https://docs.sel4.systems/projects/sel4bench/status.html","/projects/sel4bench/status.html":"https://docs.sel4.systems/projects/sel4bench/","/status/sel4test.html":"https://docs.sel4.systems/projects/sel4test/status.html","/projects/sel4test/status.html":"https://docs.sel4.systems/projects/sel4test/","/status/user_libs.html":"https://docs.sel4.systems/projects/user_libs/status.html","/projects/user_libs/status.html":"https://docs.sel4.systems/projects/user_libs/","/seL4DriverAPI/AddressingOtherDevices":"https://docs.sel4.systems/projects/driver_framework/AddressingOtherDevices.html","/seL4DriverAPI/ChildEnumeration":"https://docs.sel4.systems/projects/driver_framework/ChildEnumeration.html","/seL4DriverAPI/DriverManagement":"https://docs.sel4.systems/projects/driver_framework/DriverManagement.html","/Resources.html":"https://docs.sel4.systems/projects/buildsystem/host-dependencies.html","/ApiDoc":"https://docs.sel4.systems/projects/sel4/api-doc.html","/BenchmarkingGuide":"https://docs.sel4.systems/projects/sel4-tutorials/benchmarking-guide.html","/VM/CAmkESVMCentOS":"https://docs.sel4.systems/projects/camkes-vm/centos.html","/CAmkESCLI":"https://docs.sel4.systems/projects/camkes/cli.html","/processes/code-review.html":"https://sel4.systems/Contribute/pull-requests.html","/processes/conduct.html":"https://sel4.systems/Contribute/conduct.html","/processes/contributing.html":"https://sel4.systems/Contribute/","/DebuggingGuide":"https://docs.sel4.systems/projects/sel4-tutorials/debugging-guide.html","/DebuggingUserspace":"https://docs.sel4.systems/projects/sel4-tutorials/debugging-userspace.html","/CAmkESDifferences":"https://docs.sel4.systems/projects/camkes/differences.html","/DocsContributing":"https://docs.sel4.systems/processes/docs-contributing.html","/projects/sel4/documentation.html":"https://sel4.systems/Learn/","/projects/sel4/frequently-asked-questions.html":"https://sel4.systems/About/FAQ.html","/processes/git-conventions.html":"https://sel4.systems/Contribute/git-conventions.html","/HostDependencies":"https://docs.sel4.systems/projects/buildsystem/host-dependencies.html","/Developing/Building/Incorporating":"https://docs.sel4.systems/projects/buildsystem/incorporating.html","/projects/l4v/":"https://sel4.systems/Verification/","/projects/":"https://docs.sel4.systems/","/VM/":"https://docs.sel4.systems/projects/virtualization/","/projects/virtualization/":"https://docs.sel4.systems/projects/camkes-vm/","/projects/sel4webserver/":"https://github.com/seL4/sel4webserver/blob/master/README.md","/projects/sel4_tools/":"https://github.com/seL4/seL4_tools/tree/master/misc","/VisualCAmkES/":"https://docs.sel4.systems/projects/camkes/visual-camkes/","/CAmkES/":"https://docs.sel4.systems/projects/camkes/","/SeL4Libraries":"https://docs.sel4.systems/projects/user_libs/","/Docker":"https://docs.sel4.systems/projects/dockerfiles/","/seL4Test":"https://docs.sel4.systems/projects/sel4test/","/LevelConverter":"https://docs.sel4.systems/projects/hardware_hacks/level-converter/","/HardwareHacks":"https://docs.sel4.systems/projects/hardware_hacks/","/VM/CAmkESX86VM":"https://docs.sel4.systems/projects/camkes-vm/","/Rust":"https://docs.sel4.systems/projects/rust/","/CapDL":"https://docs.sel4.systems/projects/capdl/","/Developing/Building/OldBuildSystem":"https://docs.sel4.systems/projects/buildsystem/old/","/Developing/Building/":"https://docs.sel4.systems/projects/buildsystem/","/projects/sel4-tutorials.html":"https://docs.sel4.systems/Tutorials/","/projects/sel4-tutorials/":"https://docs.sel4.systems/Tutorials/","/processes/":"https://sel4.systems/support.html","/CAmkESInternals":"https://docs.sel4.systems/projects/camkes/internals.html","/projects/virtualization/libsel4vm.html":"https://docs.sel4.systems/projects/virtualization/docs/libsel4vm.html","/projects/virtualization/libsel4vmmplatsupport.html":"https://docs.sel4.systems/projects/virtualization/docs/libsel4vmm.html","/processes/licenses.html":"https://sel4.systems/Legal/license.html","/seL4ManualAPIGeneration":"https://docs.sel4.systems/projects/sel4/manual-api-generation.html","/projects/sel4/manual-api-generation.html":"https://github.com/seL4/seL4/blob/master/manual/README.md","/CAmkES/Terminology":"https://docs.sel4.systems/projects/camkes/manual.html","/projects/camkes/terminology.html":"https://docs.sel4.systems/projects/camkes/manual.html","/CAmkESNext":"https://docs.sel4.systems/projects/camkes/next.html","/projects/capdl/object-sizes.html":"https://github.com/seL4/capdl/tree/master/object_sizes/","/Tutorials/pathways.html":"https://docs.sel4.systems/Tutorials/index.html","/projects/sel4/platf-owner.html":"https://sel4.systems/Contribute/platform-ports.html","/PortingSeL4":"https://docs.sel4.systems/projects/sel4/porting.html","/projects/capdl/python-tool.html":"https://github.com/seL4/capdl/tree/master/python-capdl-tool","/camkes_release":"https://docs.sel4.systems/releases/camkes.html","/sel4_release":"https://docs.sel4.systems/releases/seL4.html","/processes/release-process.html":"https://docs.sel4.systems/releases.html","/RepoCheatsheet":"https://docs.sel4.systems/projects/buildsystem/repo-cheatsheet.html","/processes/rfc-process.html":"https://sel4.systems/Contribute/rfc-process.html","/projects/roadmap.html":"https://sel4.systems/roadmap.html","/processes/roles.html":"https://sel4.systems/Contribute/roles.html","/seL4SharedDataWithCaps":"https://docs.sel4.systems/projects/camkes/seL4SharedDataWithCaps.html","/Hardware/RISCV":"https://docs.sel4.systems/Hardware/spike.html","/Developing/Building/seL4Standalone":"https://docs.sel4.systems/projects/buildsystem/standalone.html","/processes/style-guide.html":"https://sel4.systems/Contribute/style.html","/projects/capdl/translator.html":"https://github.com/seL4/capdl/tree/master/capDL-tool/","/Developing/Building/Using":"https://docs.sel4.systems/projects/buildsystem/using.html","/VerifiedConfigurations":"https://docs.sel4.systems/projects/sel4/verified-configurations.html"} \ No newline at end of file diff --git a/releases.html b/releases.html new file mode 100644 index 00000000000..5e05dbbcf42 --- /dev/null +++ b/releases.html @@ -0,0 +1,717 @@ + + + + + + + Releases | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases.md b/releases.md deleted file mode 100644 index e4ade4164de..00000000000 --- a/releases.md +++ /dev/null @@ -1,127 +0,0 @@ ---- -SPDX-License-Identifier: CC-BY-SA-4.0 -SPDX-FileCopyrightText: 2025 Proofcraft Pty Ltd -redirect_from: - - processes/release-process.html ---- - -# Releases - -## Latest Versions - -The latest versioned software releases provided by the seL4 Foundation are - -{% include releases.html %} - -## Release Channels - -There are two release channels: - -- **Bleeding edge**: These happen whenever any of the maintained repository - collections is updated and the tests for it are passing. -- **Versioned releases**: Versioned releases of the seL4 kernel, the seL4 - proofs, CAmkES, Microkit, capDL, and Rust support. These happen manually and - less frequently. The latest versions of these are shown at the top of this - page. - -Bleeding edge releases happen every time the code is updated and passes the test -suites and proofs. Working on the bleeding edge means that API changes occur -often and code depending on that API may break without warning. - -Currently, we do not guarantee maintenance of previous releases, or individually -versioned libraries, projects, and applications. If that becomes necessary for -you, please let us know via one of the [contact channels][contact]. - -### Which release should you use? - -We recommend you develop on a specific official release version of the kernel, -rather than the bleeding edge. Each MAJOR.MINOR release has release notes which -describe changes and specific upgrade notes. - -New board support, features, and bug fixes will appear in bleeding edge updates -earlier than in a released version. If you are working on a long-term project -on seL4 or are using different user-level libraries than we provide then it is -usually better to pick a versioned release and manually upgrade when new -features are required. We only guarantee working proofs for released versions, -although we try to maintain working proofs for bleeding edge releases as well. -If you are trying out seL4 and experimenting with different features, rerunning -benchmarks or doing the tutorials, using the bleeding edge versions of the -projects is often fine. They will only get updated when they are passing our -tests. Please report any issues to the relevant GitHub issue tracker or post on -one of the [support channels](https://sel4.systems/support.html). - -### Version Numbers - -For versioned releases, seL4, Microkit, CAmkES, and capDL have different policies. - -**seL4**, **Microkit**, and **rust-sel4** follow [semantic -versioning](http://semver.org/). In short: - -Given a version number MAJOR.MINOR.PATCH, increment the: - -- MAJOR version when you make incompatible API changes; -- MINOR version when you add functionality in a backwards-compatible manner; -- PATCH version when you make backwards-compatible bug fixes. - -seL4 versions are tagged in git. - -**CAmkES** and **capDL** versions follow the following policy: - -MAJOR.MINOR.PATCH: - -- MAJOR: A big rewrite -- MINOR: The actual release number, increased when seL4 is released or there are - source/binary incompatible CAmkES updates -- PATCH: Small bug fixes that are backwards compatible. - -### Library Compatibility - -The libraries maintained by the seL4 Foundation have branches that track all -MAJOR.MINOR versions, with branch names in the format MAJOR.MINOR-compatible. A -MAJOR.MINOR-compatible branch will build with any MAJOR.MINOR.\* version of the -kernel, and all MAJOR.MINOR-compatible branches across our libraries are -compatible with each other. - -### Legacy support - -We only currently provide bug fixes and support for the latest version of the -kernel and latest version of libraries. Please do [contact us][contact] if -commercial support of specific older versions of the kernel is important to you. - -## Manifests - -Repository collections are tracked via manifests and the Google repo tool. Each -repository collection [below](#versioned-repository-collections) is tracked in a -separate manifest repository with at least the following manifest files: - -- `default.xml` specifies pinned revisions of the source that are updated every - time a new *bleeding edge* release is pushed. This happens every time there is - a code change and the regression tests for the corresponding repository - collection passes. This means, these manifests should always compile and pass - tests provided the correct build configurations are used. -- `master.xml` specifies the tip of each repository in a project. These are used - for development and *not* guaranteed to work. They may contain combinations of - repositories that have not yet been tested together. - -`default.xml` is tagged at each released version. To obtain the manifest for a -specific kernel version check out the corresponding X.Y.z tag. - -### Proof manifests - -The `verification-manifest` repository contains a `${SEL4_VERSION}.xml` manifest -for each release. It records the revisions of the proofs that match the -corresponding released version of the kernel and the version of the Isabelle/HOL -theorem prover that can be used to check the proofs. - -### Versioned repository collections - -The following manifests track maintained repository collections, meaning -both bleeding edge and versioned releases are available: - -{% for project in site.data.maintained.github -%} -{% for repo in project.repo_projects -%} -- [{{repo}}](https://github.com/{{project.name}}/{{repo}}) -{% endfor -%} -{% endfor %} - -[contact]: https://sel4.systems/contact.html diff --git a/releases/camkes.html b/releases/camkes.html new file mode 100644 index 00000000000..c4dc2fbe1fd --- /dev/null +++ b/releases/camkes.html @@ -0,0 +1,606 @@ + + + + + + + CAmkES releases | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-2.0.0.html b/releases/camkes/camkes-2.0.0.html new file mode 100644 index 00000000000..60499ffd578 --- /dev/null +++ b/releases/camkes/camkes-2.0.0.html @@ -0,0 +1,560 @@ + + + + + + + Camkes 2.0.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-2.1.0.html b/releases/camkes/camkes-2.1.0.html new file mode 100644 index 00000000000..5d1d481bbb1 --- /dev/null +++ b/releases/camkes/camkes-2.1.0.html @@ -0,0 +1,592 @@ + + + + + + + Camkes 2.1.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-2.2.0.html b/releases/camkes/camkes-2.2.0.html new file mode 100644 index 00000000000..599a770f194 --- /dev/null +++ b/releases/camkes/camkes-2.2.0.html @@ -0,0 +1,573 @@ + + + + + + + Camkes 2.2.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-2.3.0.html b/releases/camkes/camkes-2.3.0.html new file mode 100644 index 00000000000..b04e6270f9b --- /dev/null +++ b/releases/camkes/camkes-2.3.0.html @@ -0,0 +1,568 @@ + + + + + + + Camkes 2.3.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-2.3.1.html b/releases/camkes/camkes-2.3.1.html new file mode 100644 index 00000000000..a59b4aa09b1 --- /dev/null +++ b/releases/camkes/camkes-2.3.1.html @@ -0,0 +1,560 @@ + + + + + + + Camkes 2.3.1 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-3.0.0.html b/releases/camkes/camkes-3.0.0.html new file mode 100644 index 00000000000..8d31e034d99 --- /dev/null +++ b/releases/camkes/camkes-3.0.0.html @@ -0,0 +1,701 @@ + + + + + + + Camkes 3.0.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-3.1.0.html b/releases/camkes/camkes-3.1.0.html new file mode 100644 index 00000000000..ff3e117dbbe --- /dev/null +++ b/releases/camkes/camkes-3.1.0.html @@ -0,0 +1,599 @@ + + + + + + + Camkes 3.1.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-3.10.0.html b/releases/camkes/camkes-3.10.0.html new file mode 100644 index 00000000000..7fda4a567de --- /dev/null +++ b/releases/camkes/camkes-3.10.0.html @@ -0,0 +1,599 @@ + + + + + + + Camkes 3.10.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-3.11.0.html b/releases/camkes/camkes-3.11.0.html new file mode 100644 index 00000000000..459c36abec2 --- /dev/null +++ b/releases/camkes/camkes-3.11.0.html @@ -0,0 +1,639 @@ + + + + + + + Camkes 3.11.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-3.11.1.html b/releases/camkes/camkes-3.11.1.html new file mode 100644 index 00000000000..9c9afae1417 --- /dev/null +++ b/releases/camkes/camkes-3.11.1.html @@ -0,0 +1,583 @@ + + + + + + + Camkes 3.11.1 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-3.2.0.html b/releases/camkes/camkes-3.2.0.html new file mode 100644 index 00000000000..bba656b0c22 --- /dev/null +++ b/releases/camkes/camkes-3.2.0.html @@ -0,0 +1,642 @@ + + + + + + + Camkes 3.2.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-3.3.0.html b/releases/camkes/camkes-3.3.0.html new file mode 100644 index 00000000000..8b15b769bdf --- /dev/null +++ b/releases/camkes/camkes-3.3.0.html @@ -0,0 +1,590 @@ + + + + + + + Camkes 3.3.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-3.4.0.html b/releases/camkes/camkes-3.4.0.html new file mode 100644 index 00000000000..a10d2b8893c --- /dev/null +++ b/releases/camkes/camkes-3.4.0.html @@ -0,0 +1,573 @@ + + + + + + + Camkes 3.4.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-3.5.0.html b/releases/camkes/camkes-3.5.0.html new file mode 100644 index 00000000000..e1d5b091b6f --- /dev/null +++ b/releases/camkes/camkes-3.5.0.html @@ -0,0 +1,583 @@ + + + + + + + Camkes 3.5.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-3.6.0.html b/releases/camkes/camkes-3.6.0.html new file mode 100644 index 00000000000..37f7b63a162 --- /dev/null +++ b/releases/camkes/camkes-3.6.0.html @@ -0,0 +1,600 @@ + + + + + + + Camkes 3.6.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-3.7.0.html b/releases/camkes/camkes-3.7.0.html new file mode 100644 index 00000000000..3c0eac6817f --- /dev/null +++ b/releases/camkes/camkes-3.7.0.html @@ -0,0 +1,571 @@ + + + + + + + Camkes 3.7.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-3.8.0.html b/releases/camkes/camkes-3.8.0.html new file mode 100644 index 00000000000..5f11cdc4626 --- /dev/null +++ b/releases/camkes/camkes-3.8.0.html @@ -0,0 +1,622 @@ + + + + + + + Camkes 3.8.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/camkes/camkes-3.9.0.html b/releases/camkes/camkes-3.9.0.html new file mode 100644 index 00000000000..a05b4ce1c06 --- /dev/null +++ b/releases/camkes/camkes-3.9.0.html @@ -0,0 +1,704 @@ + + + + + + + Camkes 3.9.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/capDL.html b/releases/capDL.html new file mode 100644 index 00000000000..2e2765a3e67 --- /dev/null +++ b/releases/capDL.html @@ -0,0 +1,567 @@ + + + + + + + capDL Releases | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/capdl/0.1.0.html b/releases/capdl/0.1.0.html new file mode 100644 index 00000000000..c4ef0fde956 --- /dev/null +++ b/releases/capdl/0.1.0.html @@ -0,0 +1,655 @@ + + + + + + + 0.1.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/capdl/0.2.0.html b/releases/capdl/0.2.0.html new file mode 100644 index 00000000000..9a64a74fa1c --- /dev/null +++ b/releases/capdl/0.2.0.html @@ -0,0 +1,629 @@ + + + + + + + 0.2.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/capdl/0.2.1.html b/releases/capdl/0.2.1.html new file mode 100644 index 00000000000..5fff1685174 --- /dev/null +++ b/releases/capdl/0.2.1.html @@ -0,0 +1,582 @@ + + + + + + + 0.2.1 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/capdl/0.3.0.html b/releases/capdl/0.3.0.html new file mode 100644 index 00000000000..f009df997d9 --- /dev/null +++ b/releases/capdl/0.3.0.html @@ -0,0 +1,605 @@ + + + + + + + 0.3.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/capdl/0.4.0.html b/releases/capdl/0.4.0.html new file mode 100644 index 00000000000..62f5e3ae6c8 --- /dev/null +++ b/releases/capdl/0.4.0.html @@ -0,0 +1,584 @@ + + + + + + + 0.4.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/microkit.html b/releases/microkit.html new file mode 100644 index 00000000000..90ca4d1972c --- /dev/null +++ b/releases/microkit.html @@ -0,0 +1,784 @@ + + + + + + + Microkit releases | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/microkit/1.3.0.html b/releases/microkit/1.3.0.html new file mode 100644 index 00000000000..338293e9cec --- /dev/null +++ b/releases/microkit/1.3.0.html @@ -0,0 +1,629 @@ + + + + + + + 1.3.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/microkit/1.4.0.html b/releases/microkit/1.4.0.html new file mode 100644 index 00000000000..3ded0761a97 --- /dev/null +++ b/releases/microkit/1.4.0.html @@ -0,0 +1,629 @@ + + + + + + + 1.4.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/microkit/1.4.1.html b/releases/microkit/1.4.1.html new file mode 100644 index 00000000000..dcf1a957522 --- /dev/null +++ b/releases/microkit/1.4.1.html @@ -0,0 +1,596 @@ + + + + + + + 1.4.1 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/microkit/2.0.0.html b/releases/microkit/2.0.0.html new file mode 100644 index 00000000000..ff1620c86cd --- /dev/null +++ b/releases/microkit/2.0.0.html @@ -0,0 +1,725 @@ + + + + + + + 2.0.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/microkit/2.0.1.html b/releases/microkit/2.0.1.html new file mode 100644 index 00000000000..4f8716b2e96 --- /dev/null +++ b/releases/microkit/2.0.1.html @@ -0,0 +1,577 @@ + + + + + + + 2.0.1 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/microkit/2.1.0.html b/releases/microkit/2.1.0.html new file mode 100644 index 00000000000..0508e616d48 --- /dev/null +++ b/releases/microkit/2.1.0.html @@ -0,0 +1,692 @@ + + + + + + + 2.1.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/seL4.html b/releases/seL4.html new file mode 100644 index 00000000000..a6d30b093f9 --- /dev/null +++ b/releases/seL4.html @@ -0,0 +1,792 @@ + + + + + + + seL4 releases | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/0.0.1-rt-dev.html b/releases/sel4/0.0.1-rt-dev.html new file mode 100644 index 00000000000..b78f306fc0c --- /dev/null +++ b/releases/sel4/0.0.1-rt-dev.html @@ -0,0 +1,657 @@ + + + + + + + 0.0.1 Rt Dev | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/1.0.0-rt-dev.html b/releases/sel4/1.0.0-rt-dev.html new file mode 100644 index 00000000000..1c7f360d048 --- /dev/null +++ b/releases/sel4/1.0.0-rt-dev.html @@ -0,0 +1,725 @@ + + + + + + + 1.0.0 Rt Dev | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/10.0.0.html b/releases/sel4/10.0.0.html new file mode 100644 index 00000000000..5b3076b44a0 --- /dev/null +++ b/releases/sel4/10.0.0.html @@ -0,0 +1,589 @@ + + + + + + + 10.0.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/10.1.0.html b/releases/sel4/10.1.0.html new file mode 100644 index 00000000000..69afe9db9ba --- /dev/null +++ b/releases/sel4/10.1.0.html @@ -0,0 +1,593 @@ + + + + + + + 10.1.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/10.1.1-mcs.html b/releases/sel4/10.1.1-mcs.html new file mode 100644 index 00000000000..f8fc8d98b58 --- /dev/null +++ b/releases/sel4/10.1.1-mcs.html @@ -0,0 +1,783 @@ + + + + + + + 10.1.1 Mcs | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/10.1.1.html b/releases/sel4/10.1.1.html new file mode 100644 index 00000000000..4d932d780db --- /dev/null +++ b/releases/sel4/10.1.1.html @@ -0,0 +1,574 @@ + + + + + + + 10.1.1 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/11.0.0.html b/releases/sel4/11.0.0.html new file mode 100644 index 00000000000..da9916f49d2 --- /dev/null +++ b/releases/sel4/11.0.0.html @@ -0,0 +1,685 @@ + + + + + + + 11.0.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/12.0.0.html b/releases/sel4/12.0.0.html new file mode 100644 index 00000000000..a7f8112e071 --- /dev/null +++ b/releases/sel4/12.0.0.html @@ -0,0 +1,837 @@ + + + + + + + 12.0.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/12.1.0.html b/releases/sel4/12.1.0.html new file mode 100644 index 00000000000..5826cc2f71b --- /dev/null +++ b/releases/sel4/12.1.0.html @@ -0,0 +1,713 @@ + + + + + + + 12.1.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/13.0.0.html b/releases/sel4/13.0.0.html new file mode 100644 index 00000000000..d8cdff0d602 --- /dev/null +++ b/releases/sel4/13.0.0.html @@ -0,0 +1,852 @@ + + + + + + + 13.0.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/14.0.0.html b/releases/sel4/14.0.0.html new file mode 100644 index 00000000000..3dd5ebe9697 --- /dev/null +++ b/releases/sel4/14.0.0.html @@ -0,0 +1,725 @@ + + + + + + + 14.0.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/2.0.0.html b/releases/sel4/2.0.0.html new file mode 100644 index 00000000000..b447dd18865 --- /dev/null +++ b/releases/sel4/2.0.0.html @@ -0,0 +1,708 @@ + + + + + + + 2.0.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/2.1.0.html b/releases/sel4/2.1.0.html new file mode 100644 index 00000000000..4a59968f7fb --- /dev/null +++ b/releases/sel4/2.1.0.html @@ -0,0 +1,587 @@ + + + + + + + 2.1.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/3.0.0.html b/releases/sel4/3.0.0.html new file mode 100644 index 00000000000..ad847eb2d12 --- /dev/null +++ b/releases/sel4/3.0.0.html @@ -0,0 +1,671 @@ + + + + + + + 3.0.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/3.0.1.html b/releases/sel4/3.0.1.html new file mode 100644 index 00000000000..33850c4b435 --- /dev/null +++ b/releases/sel4/3.0.1.html @@ -0,0 +1,574 @@ + + + + + + + 3.0.1 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/3.1.0.html b/releases/sel4/3.1.0.html new file mode 100644 index 00000000000..ff40728795d --- /dev/null +++ b/releases/sel4/3.1.0.html @@ -0,0 +1,594 @@ + + + + + + + 3.1.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/3.2.0.html b/releases/sel4/3.2.0.html new file mode 100644 index 00000000000..c556689ae72 --- /dev/null +++ b/releases/sel4/3.2.0.html @@ -0,0 +1,597 @@ + + + + + + + 3.2.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/4.0.0.html b/releases/sel4/4.0.0.html new file mode 100644 index 00000000000..c7177eac919 --- /dev/null +++ b/releases/sel4/4.0.0.html @@ -0,0 +1,646 @@ + + + + + + + 4.0.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/5.0.0.html b/releases/sel4/5.0.0.html new file mode 100644 index 00000000000..b4de7e86e67 --- /dev/null +++ b/releases/sel4/5.0.0.html @@ -0,0 +1,607 @@ + + + + + + + 5.0.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/5.1.0.html b/releases/sel4/5.1.0.html new file mode 100644 index 00000000000..9eeaaccb828 --- /dev/null +++ b/releases/sel4/5.1.0.html @@ -0,0 +1,587 @@ + + + + + + + 5.1.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/5.2.0-mcs.html b/releases/sel4/5.2.0-mcs.html new file mode 100644 index 00000000000..d414703d6b0 --- /dev/null +++ b/releases/sel4/5.2.0-mcs.html @@ -0,0 +1,787 @@ + + + + + + + 5.2.0 Mcs | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/5.2.0.html b/releases/sel4/5.2.0.html new file mode 100644 index 00000000000..eff3134174c --- /dev/null +++ b/releases/sel4/5.2.0.html @@ -0,0 +1,588 @@ + + + + + + + 5.2.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/6.0.0.html b/releases/sel4/6.0.0.html new file mode 100644 index 00000000000..413cd627a43 --- /dev/null +++ b/releases/sel4/6.0.0.html @@ -0,0 +1,629 @@ + + + + + + + 6.0.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/7.0.0.html b/releases/sel4/7.0.0.html new file mode 100644 index 00000000000..4bc6475b156 --- /dev/null +++ b/releases/sel4/7.0.0.html @@ -0,0 +1,619 @@ + + + + + + + 7.0.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/8.0.0.html b/releases/sel4/8.0.0.html new file mode 100644 index 00000000000..5e08a65ef26 --- /dev/null +++ b/releases/sel4/8.0.0.html @@ -0,0 +1,597 @@ + + + + + + + 8.0.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/9.0.0-mcs.html b/releases/sel4/9.0.0-mcs.html new file mode 100644 index 00000000000..76e3a327010 --- /dev/null +++ b/releases/sel4/9.0.0-mcs.html @@ -0,0 +1,807 @@ + + + + + + + 9.0.0 Mcs | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/9.0.0.html b/releases/sel4/9.0.0.html new file mode 100644 index 00000000000..dd5befb8c4d --- /dev/null +++ b/releases/sel4/9.0.0.html @@ -0,0 +1,609 @@ + + + + + + + 9.0.0 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/releases/sel4/9.0.1.html b/releases/sel4/9.0.1.html new file mode 100644 index 00000000000..d13ccbf2bfc --- /dev/null +++ b/releases/sel4/9.0.1.html @@ -0,0 +1,583 @@ + + + + + + + 9.0.1 | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/robots.txt b/robots.txt new file mode 100644 index 00000000000..7d1a5de3d32 --- /dev/null +++ b/robots.txt @@ -0,0 +1 @@ +Sitemap: https://docs.sel4.systems/sitemap.xml diff --git a/seL4DriverAPI/AddressingOtherDevices.html b/seL4DriverAPI/AddressingOtherDevices.html new file mode 100644 index 00000000000..74aa5779987 --- /dev/null +++ b/seL4DriverAPI/AddressingOtherDevices.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/seL4DriverAPI/ChildEnumeration.html b/seL4DriverAPI/ChildEnumeration.html new file mode 100644 index 00000000000..3c83cbe420b --- /dev/null +++ b/seL4DriverAPI/ChildEnumeration.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/seL4DriverAPI/DriverManagement.html b/seL4DriverAPI/DriverManagement.html new file mode 100644 index 00000000000..78a346f356f --- /dev/null +++ b/seL4DriverAPI/DriverManagement.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/seL4ManualAPIGeneration.html b/seL4ManualAPIGeneration.html new file mode 100644 index 00000000000..66c041292ee --- /dev/null +++ b/seL4ManualAPIGeneration.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/seL4SharedDataWithCaps.html b/seL4SharedDataWithCaps.html new file mode 100644 index 00000000000..1dadc82ff72 --- /dev/null +++ b/seL4SharedDataWithCaps.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/seL4Test.html b/seL4Test.html new file mode 100644 index 00000000000..b38d9f0fec8 --- /dev/null +++ b/seL4Test.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release.html b/sel4_release.html new file mode 100644 index 00000000000..a2ea1d67c38 --- /dev/null +++ b/sel4_release.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_0.0.1-rt-dev.html b/sel4_release/seL4_0.0.1-rt-dev.html new file mode 100644 index 00000000000..9913995ff7a --- /dev/null +++ b/sel4_release/seL4_0.0.1-rt-dev.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_0.0.1-rt-dev/index.html b/sel4_release/seL4_0.0.1-rt-dev/index.html new file mode 100644 index 00000000000..9913995ff7a --- /dev/null +++ b/sel4_release/seL4_0.0.1-rt-dev/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_1.0.0-rt-dev.html b/sel4_release/seL4_1.0.0-rt-dev.html new file mode 100644 index 00000000000..ec55a7b9a06 --- /dev/null +++ b/sel4_release/seL4_1.0.0-rt-dev.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_1.0.0-rt-dev/index.html b/sel4_release/seL4_1.0.0-rt-dev/index.html new file mode 100644 index 00000000000..ec55a7b9a06 --- /dev/null +++ b/sel4_release/seL4_1.0.0-rt-dev/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_10.0.0.html b/sel4_release/seL4_10.0.0.html new file mode 100644 index 00000000000..421cecaef28 --- /dev/null +++ b/sel4_release/seL4_10.0.0.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_10.0.0/index.html b/sel4_release/seL4_10.0.0/index.html new file mode 100644 index 00000000000..421cecaef28 --- /dev/null +++ b/sel4_release/seL4_10.0.0/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_10.1.0.html b/sel4_release/seL4_10.1.0.html new file mode 100644 index 00000000000..3168f4eab31 --- /dev/null +++ b/sel4_release/seL4_10.1.0.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_10.1.0/index.html b/sel4_release/seL4_10.1.0/index.html new file mode 100644 index 00000000000..3168f4eab31 --- /dev/null +++ b/sel4_release/seL4_10.1.0/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_10.1.1-mcs.html b/sel4_release/seL4_10.1.1-mcs.html new file mode 100644 index 00000000000..2eed7b260e6 --- /dev/null +++ b/sel4_release/seL4_10.1.1-mcs.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_10.1.1-mcs/index.html b/sel4_release/seL4_10.1.1-mcs/index.html new file mode 100644 index 00000000000..2eed7b260e6 --- /dev/null +++ b/sel4_release/seL4_10.1.1-mcs/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_10.1.1.html b/sel4_release/seL4_10.1.1.html new file mode 100644 index 00000000000..895fca984cc --- /dev/null +++ b/sel4_release/seL4_10.1.1.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_10.1.1/index.html b/sel4_release/seL4_10.1.1/index.html new file mode 100644 index 00000000000..895fca984cc --- /dev/null +++ b/sel4_release/seL4_10.1.1/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_2.0.0.html b/sel4_release/seL4_2.0.0.html new file mode 100644 index 00000000000..c234085ca02 --- /dev/null +++ b/sel4_release/seL4_2.0.0.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_2.0.0/index.html b/sel4_release/seL4_2.0.0/index.html new file mode 100644 index 00000000000..c234085ca02 --- /dev/null +++ b/sel4_release/seL4_2.0.0/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_2.1.0.html b/sel4_release/seL4_2.1.0.html new file mode 100644 index 00000000000..cbe8c080647 --- /dev/null +++ b/sel4_release/seL4_2.1.0.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_2.1.0/index.html b/sel4_release/seL4_2.1.0/index.html new file mode 100644 index 00000000000..cbe8c080647 --- /dev/null +++ b/sel4_release/seL4_2.1.0/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_3.0.0.html b/sel4_release/seL4_3.0.0.html new file mode 100644 index 00000000000..10bb4129339 --- /dev/null +++ b/sel4_release/seL4_3.0.0.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_3.0.0/index.html b/sel4_release/seL4_3.0.0/index.html new file mode 100644 index 00000000000..10bb4129339 --- /dev/null +++ b/sel4_release/seL4_3.0.0/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_3.0.1.html b/sel4_release/seL4_3.0.1.html new file mode 100644 index 00000000000..616b3d85533 --- /dev/null +++ b/sel4_release/seL4_3.0.1.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_3.0.1/index.html b/sel4_release/seL4_3.0.1/index.html new file mode 100644 index 00000000000..616b3d85533 --- /dev/null +++ b/sel4_release/seL4_3.0.1/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_3.1.0.html b/sel4_release/seL4_3.1.0.html new file mode 100644 index 00000000000..a336cf18279 --- /dev/null +++ b/sel4_release/seL4_3.1.0.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_3.1.0/index.html b/sel4_release/seL4_3.1.0/index.html new file mode 100644 index 00000000000..a336cf18279 --- /dev/null +++ b/sel4_release/seL4_3.1.0/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_3.2.0.html b/sel4_release/seL4_3.2.0.html new file mode 100644 index 00000000000..4c7ef4f76f0 --- /dev/null +++ b/sel4_release/seL4_3.2.0.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_3.2.0/index.html b/sel4_release/seL4_3.2.0/index.html new file mode 100644 index 00000000000..4c7ef4f76f0 --- /dev/null +++ b/sel4_release/seL4_3.2.0/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_4.0.0.html b/sel4_release/seL4_4.0.0.html new file mode 100644 index 00000000000..e84c0db4dff --- /dev/null +++ b/sel4_release/seL4_4.0.0.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_4.0.0/index.html b/sel4_release/seL4_4.0.0/index.html new file mode 100644 index 00000000000..e84c0db4dff --- /dev/null +++ b/sel4_release/seL4_4.0.0/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_5.0.0.html b/sel4_release/seL4_5.0.0.html new file mode 100644 index 00000000000..006c615096a --- /dev/null +++ b/sel4_release/seL4_5.0.0.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_5.0.0/index.html b/sel4_release/seL4_5.0.0/index.html new file mode 100644 index 00000000000..006c615096a --- /dev/null +++ b/sel4_release/seL4_5.0.0/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_5.1.0.html b/sel4_release/seL4_5.1.0.html new file mode 100644 index 00000000000..8a5ee0dcd42 --- /dev/null +++ b/sel4_release/seL4_5.1.0.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_5.1.0/index.html b/sel4_release/seL4_5.1.0/index.html new file mode 100644 index 00000000000..8a5ee0dcd42 --- /dev/null +++ b/sel4_release/seL4_5.1.0/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_5.2.0-mcs.html b/sel4_release/seL4_5.2.0-mcs.html new file mode 100644 index 00000000000..fdc50a5fbf3 --- /dev/null +++ b/sel4_release/seL4_5.2.0-mcs.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_5.2.0-mcs/index.html b/sel4_release/seL4_5.2.0-mcs/index.html new file mode 100644 index 00000000000..fdc50a5fbf3 --- /dev/null +++ b/sel4_release/seL4_5.2.0-mcs/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_5.2.0.html b/sel4_release/seL4_5.2.0.html new file mode 100644 index 00000000000..3b20aaefc20 --- /dev/null +++ b/sel4_release/seL4_5.2.0.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_5.2.0/index.html b/sel4_release/seL4_5.2.0/index.html new file mode 100644 index 00000000000..3b20aaefc20 --- /dev/null +++ b/sel4_release/seL4_5.2.0/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_6.0.0.html b/sel4_release/seL4_6.0.0.html new file mode 100644 index 00000000000..2de156f6e9a --- /dev/null +++ b/sel4_release/seL4_6.0.0.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_6.0.0/index.html b/sel4_release/seL4_6.0.0/index.html new file mode 100644 index 00000000000..2de156f6e9a --- /dev/null +++ b/sel4_release/seL4_6.0.0/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_7.0.0.html b/sel4_release/seL4_7.0.0.html new file mode 100644 index 00000000000..1c146d30104 --- /dev/null +++ b/sel4_release/seL4_7.0.0.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_7.0.0/index.html b/sel4_release/seL4_7.0.0/index.html new file mode 100644 index 00000000000..1c146d30104 --- /dev/null +++ b/sel4_release/seL4_7.0.0/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_8.0.0.html b/sel4_release/seL4_8.0.0.html new file mode 100644 index 00000000000..90f068baf15 --- /dev/null +++ b/sel4_release/seL4_8.0.0.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_8.0.0/index.html b/sel4_release/seL4_8.0.0/index.html new file mode 100644 index 00000000000..90f068baf15 --- /dev/null +++ b/sel4_release/seL4_8.0.0/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_9.0.0-mcs.html b/sel4_release/seL4_9.0.0-mcs.html new file mode 100644 index 00000000000..9db1e4fe3d3 --- /dev/null +++ b/sel4_release/seL4_9.0.0-mcs.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_9.0.0-mcs/index.html b/sel4_release/seL4_9.0.0-mcs/index.html new file mode 100644 index 00000000000..9db1e4fe3d3 --- /dev/null +++ b/sel4_release/seL4_9.0.0-mcs/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_9.0.0.html b/sel4_release/seL4_9.0.0.html new file mode 100644 index 00000000000..f160f46942e --- /dev/null +++ b/sel4_release/seL4_9.0.0.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_9.0.0/index.html b/sel4_release/seL4_9.0.0/index.html new file mode 100644 index 00000000000..f160f46942e --- /dev/null +++ b/sel4_release/seL4_9.0.0/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_9.0.1.html b/sel4_release/seL4_9.0.1.html new file mode 100644 index 00000000000..3e3df2c5fbc --- /dev/null +++ b/sel4_release/seL4_9.0.1.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sel4_release/seL4_9.0.1/index.html b/sel4_release/seL4_9.0.1/index.html new file mode 100644 index 00000000000..3e3df2c5fbc --- /dev/null +++ b/sel4_release/seL4_9.0.1/index.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/sitemap.html b/sitemap.html new file mode 100644 index 00000000000..7f722a12092 --- /dev/null +++ b/sitemap.html @@ -0,0 +1,821 @@ + + + + + + + Sitemap | seL4 docs + + + + + + + + + + + + +
+ + + +
+
+
+
+ + + +
+
+ + + +
+
+
+ + diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000000..8577058eefb --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,891 @@ + + + +https://docs.sel4.systems/releases/camkes/camkes-2.0.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/camkes/camkes-2.1.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/camkes/camkes-2.2.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/camkes/camkes-2.3.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/camkes/camkes-2.3.1.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/camkes/camkes-3.0.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/camkes/camkes-3.1.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/camkes/camkes-3.10.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/camkes/camkes-3.11.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/camkes/camkes-3.11.1.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/camkes/camkes-3.2.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/camkes/camkes-3.3.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/camkes/camkes-3.4.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/camkes/camkes-3.5.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/camkes/camkes-3.6.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/camkes/camkes-3.7.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/camkes/camkes-3.8.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/camkes/camkes-3.9.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/capdl/0.1.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/capdl/0.2.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/capdl/0.2.1.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/capdl/0.3.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/capdl/0.4.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/microkit/1.3.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/microkit/1.4.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/microkit/1.4.1.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/microkit/2.0.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/microkit/2.0.1.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/microkit/2.1.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/0.0.1-rt-dev.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/1.0.0-rt-dev.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/10.0.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/10.1.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/10.1.1-mcs.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/10.1.1.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/11.0.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/12.0.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/12.1.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/13.0.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/14.0.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/2.0.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/2.1.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/3.0.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/3.0.1.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/3.1.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/3.2.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/4.0.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/5.0.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/5.1.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/5.2.0-mcs.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/5.2.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/6.0.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/7.0.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/8.0.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/9.0.0-mcs.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/9.0.0.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/releases/sel4/9.0.1.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/updates/buildsystem/11.0.x.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/updates/camkes-vm/camkes-3.8.x-arm-old.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/updates/camkes-vm/camkes-3.8.x.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/updates/elfloader/11.0.x.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/updates/sel4-tutorials/camkes-3.8.x.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/updates/sel4bench/11.0.x.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/updates/sel4runtime/11.0.x.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/updates/sel4test/11.0.x.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/updates/sel4webserver/camkes-3.8.x.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/updates/user_libs/11.0.x.html +2026-03-16T04:11:22+00:00 + + +https://docs.sel4.systems/projects/driver_framework/AddressingOtherDevices.html + + +https://docs.sel4.systems/Hardware/BeagleBoard.html + + +https://docs.sel4.systems/Hardware/Beaglebone.html + + +https://docs.sel4.systems/projects/driver_framework/ChildEnumeration.html + + +https://docs.sel4.systems/projects/driver_framework/DriverManagement.html + + +https://docs.sel4.systems/Hardware/GeneralARM.html + + +https://docs.sel4.systems/Hardware/IA32.html + + +https://docs.sel4.systems/Hardware/IF6410.html + + +https://docs.sel4.systems/Hardware/JetsonTX2.html + + +https://docs.sel4.systems/Hardware/Kzm.html + + +https://docs.sel4.systems/Hardware/MaaXBoard.html + + +https://docs.sel4.systems/Hardware/OdroidC2.html + + +https://docs.sel4.systems/Hardware/OdroidC4.html + + +https://docs.sel4.systems/Hardware/OdroidXU.html + + +https://docs.sel4.systems/Hardware/OdroidXU4.html + + +https://docs.sel4.systems/Hardware/Rpi3.html + + +https://docs.sel4.systems/Hardware/Rpi4.html + + +https://docs.sel4.systems/Hardware/X64.html + + +https://docs.sel4.systems/Hardware/ZC706.html + + +https://docs.sel4.systems/Hardware/ZCU102.html + + +https://docs.sel4.systems/Hardware/ZCU106.html + + +https://docs.sel4.systems/projects/sel4/api-doc.html + + +https://docs.sel4.systems/Hardware/ariane.html + + +https://docs.sel4.systems/Hardware/arndale.html + + +https://docs.sel4.systems/Hardware/bananapi-f3.html + + +https://docs.sel4.systems/projects/sel4-tutorials/benchmarking-guide.html + + +https://docs.sel4.systems/projects/sel4/bfgen.html + + +https://docs.sel4.systems/projects/capdl/c-loader-app.html + + +https://docs.sel4.systems/Tutorials/camkes-vm-crossvm.html + + +https://docs.sel4.systems/Tutorials/camkes-vm-linux.html + + +https://docs.sel4.systems/Tutorials/capabilities.html + + +https://docs.sel4.systems/projects/capdl/cdl-utils.html + + +https://docs.sel4.systems/projects/camkes-vm/centos.html + + +https://docs.sel4.systems/Hardware/cheshire.html + + +https://docs.sel4.systems/projects/camkes/cli.html + + +https://docs.sel4.systems/projects/camkes/components.html + + +https://docs.sel4.systems/projects/sel4/configurations.html + + +https://docs.sel4.systems/projects/sel4-tutorials/debugging-guide.html + + +https://docs.sel4.systems/projects/sel4-tutorials/debugging-userspace.html + + +https://docs.sel4.systems/projects/camkes/differences.html + + +https://docs.sel4.systems/processes/docs-contributing.html + + +https://docs.sel4.systems/projects/microkit/tutorial/end.html + + +https://docs.sel4.systems/examples.html + + +https://docs.sel4.systems/Tutorials/fault-handlers.html + + +https://docs.sel4.systems/projects/camkes/features.html + + +https://docs.sel4.systems/Tutorials/get-the-tutorials.html + + +https://docs.sel4.systems/getting-started.html + + +https://docs.sel4.systems/projects/camkes/hardware.html + + +https://docs.sel4.systems/Tutorials/hello-camkes-0.html + + +https://docs.sel4.systems/Tutorials/hello-camkes-1.html + + +https://docs.sel4.systems/Tutorials/hello-camkes-2.html + + +https://docs.sel4.systems/Tutorials/hello-camkes-timer.html + + +https://docs.sel4.systems/Tutorials/hello-world.html + + +https://docs.sel4.systems/Hardware/hifive-p550.html + + +https://docs.sel4.systems/Hardware/hifive.html + + +https://docs.sel4.systems/projects/buildsystem/host-dependencies.html + + +https://docs.sel4.systems/Tutorials/how-to-CAmkES.html + + +https://docs.sel4.systems/Tutorials/how-to-libs.html + + +https://docs.sel4.systems/Tutorials/how-to-seL4.html + + +https://docs.sel4.systems/projects/rust/how-to-use.html + + +https://docs.sel4.systems/Hardware/imx8mm.html + + +https://docs.sel4.systems/Hardware/imx8mp.html + + +https://docs.sel4.systems/Hardware/imx8mq.html + + +https://docs.sel4.systems/Hardware/imx93.html + + +https://docs.sel4.systems/projects/buildsystem/incorporating.html + + +https://docs.sel4.systems/ + + +https://docs.sel4.systems/projects/camkes/visual-camkes/ + + +https://docs.sel4.systems/projects/camkes/ + + +https://docs.sel4.systems/projects/user_libs/ + + +https://docs.sel4.systems/projects/dockerfiles/ + + +https://docs.sel4.systems/projects/sel4bench/ + + +https://docs.sel4.systems/projects/sel4/ + + +https://docs.sel4.systems/projects/sel4test/ + + +https://docs.sel4.systems/projects/hardware_hacks/level-converter/ + + +https://docs.sel4.systems/projects/hardware_hacks/ + + +https://docs.sel4.systems/projects/sel4runtime/ + + +https://docs.sel4.systems/projects/camkes-vm/ + + +https://docs.sel4.systems/projects/elfloader/ + + +https://docs.sel4.systems/projects/rust/ + + +https://docs.sel4.systems/projects/capdl/ + + +https://docs.sel4.systems/projects/microkit/manual/2.1.0/ + + +https://docs.sel4.systems/projects/microkit/manual/latest/ + + +https://docs.sel4.systems/projects/microkit/manual/2.0.1/ + + +https://docs.sel4.systems/projects/microkit/ + + +https://docs.sel4.systems/projects/buildsystem/old/ + + +https://docs.sel4.systems/projects/buildsystem/ + + +https://docs.sel4.systems/CMA34DBMC/ + + +https://docs.sel4.systems/Tutorials/ + + +https://docs.sel4.systems/Hardware/CEI_TK1_SOM/LogicPro8/ + + +https://docs.sel4.systems/Hardware/CEI_TK1_SOM/Tk1SomMods/ + + +https://docs.sel4.systems/Hardware/CEI_TK1_SOM/L4TCan/ + + +https://docs.sel4.systems/Hardware/CEI_TK1_SOM/DaughterBoard/ + + +https://docs.sel4.systems/Hardware/CEI_TK1_SOM/CANBoard/ + + +https://docs.sel4.systems/Hardware/CEI_TK1_SOM/ + + +https://docs.sel4.systems/Hardware/VMware/ + + +https://docs.sel4.systems/Hardware/HiKey/ + + +https://docs.sel4.systems/Hardware/Star64/ + + +https://docs.sel4.systems/Hardware/ + + +https://docs.sel4.systems/projects/camkes/internals.html + + +https://docs.sel4.systems/Tutorials/interrupts.html + + +https://docs.sel4.systems/Tutorials/ipc.html + + +https://docs.sel4.systems/Hardware/jetsontk1.html + + +https://docs.sel4.systems/Hardware/jetsontx1.html + + +https://docs.sel4.systems/projects/sel4/kernel-contribution.html + + +https://docs.sel4.systems/projects/capdl/lang-spec.html + + +https://docs.sel4.systems/Tutorials/libraries-1.html + + +https://docs.sel4.systems/Tutorials/libraries-2.html + + +https://docs.sel4.systems/Tutorials/libraries-3.html + + +https://docs.sel4.systems/Tutorials/libraries-4.html + + +https://docs.sel4.systems/projects/virtualization/docs/libsel4vm.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vm_arm_guest_vm.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vm_boot.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vm_guest_arm_context.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vm_guest_iospace.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vm_guest_irq_controller.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vm_guest_memory.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vm_guest_memory_helpers.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vm_guest_ram.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vm_guest_vcpu_fault.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vm_guest_vm.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vm_guest_vm_util.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vm_guest_x86_context.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vm_x86_guest_vm.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vm_x86_ioports.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vm_x86_vmcall.html + + +https://docs.sel4.systems/projects/virtualization/docs/libsel4vmm.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_ac_device.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_generic_forward_device.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_guest_boot_init.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_guest_reboot.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_guest_vcpu_fault.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_guest_vcpu_util.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_vpci.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_arm_vusb.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_cross_vm_connection.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_device.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_device_utils.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_guest_image.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_guest_memory_util.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_guest_vcpu_util.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_ioports.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_pci.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_pci_helper.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_virtio_con.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_virtio_net.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_x86_acpi.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_x86_guest_boot_init.html + + +https://docs.sel4.systems/projects/virtualization/docs/api/libsel4vmmplatsupport_x86_vmm_pci_helper.html + + +https://docs.sel4.systems/projects/camkes/manual.html + + +https://docs.sel4.systems/projects/sel4/manual.html + + +https://docs.sel4.systems/Tutorials/mapping.html + + +https://docs.sel4.systems/Tutorials/mcs.html + + +https://docs.sel4.systems/projects/camkes/next.html + + +https://docs.sel4.systems/Tutorials/notifications.html + + +https://docs.sel4.systems/Hardware/odroidx.html + + +https://docs.sel4.systems/projects/microkit/tutorial/part0.html + + +https://docs.sel4.systems/projects/microkit/tutorial/part1.html + + +https://docs.sel4.systems/projects/microkit/tutorial/part2.html + + +https://docs.sel4.systems/projects/microkit/tutorial/part3.html + + +https://docs.sel4.systems/projects/microkit/tutorial/part4.html + + +https://docs.sel4.systems/projects/microkit/platforms.html + + +https://docs.sel4.systems/Hardware/polarfire.html + + +https://docs.sel4.systems/projects/sel4/porting.html + + +https://docs.sel4.systems/Hardware/qemu-arm-virt.html + + +https://docs.sel4.systems/Hardware/qemu-riscv-virt.html + + +https://docs.sel4.systems/releases/camkes.html + + +https://docs.sel4.systems/releases/seL4.html + + +https://docs.sel4.systems/projects/rust/releases.html + + +https://docs.sel4.systems/releases/capDL.html + + +https://docs.sel4.systems/releases/microkit.html + + +https://docs.sel4.systems/releases.html + + +https://docs.sel4.systems/projects/buildsystem/repo-cheatsheet.html + + +https://docs.sel4.systems/projects/microkit/roadmap.html + + +https://docs.sel4.systems/Hardware/rock3b.html + + +https://docs.sel4.systems/Hardware/rocketchip-zcu102.html + + +https://docs.sel4.systems/Hardware/rocketchip.html + + +https://docs.sel4.systems/Hardware/rockpro64.html + + +https://docs.sel4.systems/Hardware/sabreLite.html + + +https://docs.sel4.systems/Tutorials/seL4-end.html + + +https://docs.sel4.systems/projects/camkes/seL4SharedDataWithCaps.html + + +https://docs.sel4.systems/projects/camkes/setting-up.html + + +https://docs.sel4.systems/projects/microkit/setting-up.html + + +https://docs.sel4.systems/Tutorials/setting-up.html + + +https://docs.sel4.systems/sitemap.html + + +https://docs.sel4.systems/Hardware/spike.html + + +https://docs.sel4.systems/projects/buildsystem/standalone.html + + +https://docs.sel4.systems/projects/rust/supported-configurations.html + + +https://docs.sel4.systems/processes/test-status.html + + +https://docs.sel4.systems/Tutorials/threads.html + + +https://docs.sel4.systems/Hardware/tqma8xqp1gb.html + + +https://docs.sel4.systems/Hardware/ultra96v2.html + + +https://docs.sel4.systems/Tutorials/untyped.html + + +https://docs.sel4.systems/projects/buildsystem/using.html + + +https://docs.sel4.systems/projects/sel4/verified-configurations.html + + +https://docs.sel4.systems/projects/microkit/tutorial/welcome.html + + +https://docs.sel4.systems/projects/camkes-vm/zmq-samples.html + + +https://docs.sel4.systems/Hardware/CEI_TK1_SOM/CANBoard/canboard_v3.pdf +2026-03-16T04:08:54+00:00 + + +https://docs.sel4.systems/Hardware/CEI_TK1_SOM/DaughterBoard/daughterboard_r3a_schematic.pdf +2026-03-16T04:08:54+00:00 + + +https://docs.sel4.systems/projects/microkit/manual/2.0.1/assets/microkit_flow.pdf +2026-03-16T04:08:54+00:00 + + +https://docs.sel4.systems/projects/microkit/manual/2.0.1/microkit_user_manual.pdf +2026-03-16T04:08:54+00:00 + + +https://docs.sel4.systems/projects/microkit/manual/2.1.0/assets/microkit_flow.pdf +2026-03-16T04:08:54+00:00 + + +https://docs.sel4.systems/projects/microkit/manual/2.1.0/microkit_user_manual.pdf +2026-03-16T04:08:54+00:00 + + +https://docs.sel4.systems/projects/microkit/manual/latest/assets/microkit_flow.pdf +2026-03-16T04:08:54+00:00 + + +https://docs.sel4.systems/projects/microkit/manual/latest/microkit_user_manual.pdf +2026-03-16T04:08:54+00:00 + + diff --git a/status/camkes.html b/status/camkes.html new file mode 100644 index 00000000000..bdbe87d44c6 --- /dev/null +++ b/status/camkes.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/status/sel4.html b/status/sel4.html new file mode 100644 index 00000000000..8af3d6ef9c8 --- /dev/null +++ b/status/sel4.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/status/sel4bench.html b/status/sel4bench.html new file mode 100644 index 00000000000..6019cbde303 --- /dev/null +++ b/status/sel4bench.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/status/sel4test.html b/status/sel4test.html new file mode 100644 index 00000000000..8e99b30d39e --- /dev/null +++ b/status/sel4test.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/status/user_libs.html b/status/user_libs.html new file mode 100644 index 00000000000..002f1519fe3 --- /dev/null +++ b/status/user_libs.html @@ -0,0 +1,11 @@ + + + + Redirecting… + + + + +

Redirecting…

+ Click here if you are not redirected. + diff --git a/tools/Dockerfile b/tools/Dockerfile deleted file mode 100644 index 5f8091c23ab..00000000000 --- a/tools/Dockerfile +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2020 Data61, CSIRO -# SPDX-License-Identifier: BSD-2-Clause - -FROM ruby:2 - -RUN apt-get update -q \ - && apt-get install -y --no-install-recommends \ - doxygen \ - python3-dev \ - python3-bs4 \ - python3-lxml \ - python3-six \ - python3-jinja2 \ - python3-sh \ - python3-pip \ - python3-pyelftools \ - rsync \ - && apt-get clean autoclean \ - && apt-get autoremove --yes \ - && pip3 install setuptools camkes-deps \ - && rm -rf /var/lib/{apt,dpkg,cache,log}/ - -# Init bundle dependencies -RUN git clone https://github.com/seL4/docs.git \ - && cd docs \ - && bundle install \ - && cd / \ - && rm -rf docs - -RUN curl -sSf https://sh.rustup.rs \ - | bash -s -- -y --no-modify-path - -ENV PATH=/root/.cargo/bin:$PATH - -RUN git config --global --add safe.directory '/docs' - -# Jekyll will be serving on 127.0.0.1:4000 -EXPOSE 4000 diff --git a/tools/gen_markdown_api_doc.py b/tools/gen_markdown_api_doc.py deleted file mode 100755 index d9e812bfcf8..00000000000 --- a/tools/gen_markdown_api_doc.py +++ /dev/null @@ -1,35 +0,0 @@ -#! /usr/bin/env python3 - -# Copyright 2020 Data61, CSIRO -# SPDX-License-Identifier: BSD-2-Clause - -import os -import argparse - -parser = argparse.ArgumentParser() -parser.add_argument("-f", "--file", dest="file", type=str, - help="Markdown location (within repository)") -parser.add_argument("-o", "--output", dest="output", type=str, - help="Output docsite file") -parser.add_argument("-p", "--parent", dest="parent", type=str, - help="Parent file on docsite") -args = parser.parse_args() - -base = os.path.basename(args.file) -title = os.path.splitext(base)[0] -output = '''--- -title: {0} -layout: "api" -toc: true -parent: "/projects/virtualization/docs/{1}" ---- - -{{% capture file %}} -{{% include_absolute {2} %}} -{{% endcapture %}} -{{% assign file = file | replace: '[top](#)', '[top](#page-top)' %}} - -{{{{ file }}}} -'''.format(title, args.parent, args.file) -with open(args.output, "w") as output_file: - output_file.write(output) diff --git a/tools/get_repos.py b/tools/get_repos.py deleted file mode 100755 index 914382077fb..00000000000 --- a/tools/get_repos.py +++ /dev/null @@ -1,23 +0,0 @@ -#! /usr/bin/env python3 - -# Copyright 2020 Data61, CSIRO -# SPDX-License-Identifier: BSD-2-Clause - -import sys -from yaml import load, dump - -# Try use libyaml C bindings first for parsing. Fall back to python implementations -# otherwise. -try: - from yaml import CLoader as Loader -except ImportError: - from yaml import Loader - -# Parse yaml file from stdin and output a newline separated list of repositories -data = load(sys.stdin, Loader=Loader) -try: - if "repositories" in data: - for repo in data["repositories"]: - print(("%s/%s" % (repo["org"], repo["repo"])).lower()) -except: - pass diff --git a/tools/inject_backlink.sh b/tools/inject_backlink.sh deleted file mode 100755 index 182a889978a..00000000000 --- a/tools/inject_backlink.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -# Copyright 2025 Proofcraft Pty Ltd -# SPDX-License-Identifier: BSD-2-Clause -# -# Insert a back link to the seL4 docsite into the Rust tutorial. - -if [ $# -ne 1 ]; then - echo "Usage: $0 " - exit 1 -fi - -if [ ! -d "$1" ]; then - echo "'$1' not a directory." - exit 1 -fi - -TOC="$1/toc.js" - -LINK='
  • Back to seL4 docsite' - -sed -i.bak "s|
  • |${LINK}|" "$TOC" diff --git a/tools/mk_tutorial_vars.sh b/tools/mk_tutorial_vars.sh deleted file mode 100755 index 20f2a6f7ae0..00000000000 --- a/tools/mk_tutorial_vars.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh -# -# Copyright 2025 Proofcraft Pty Ltd -# SPDX-License-Identifier: BSD-2-Clause - -# Generate _data/microkit_tutorial.yml from microkit_tutorial repo -# -# Usage: ./mk_tutorial_vars.sh - -if [ $# -ne 2 ]; then - echo "Usage: $0 " - exit 1 -fi - -INPUT_FILE="$1" -DATA_FILE="$2" - -if [ ! -r "$INPUT_FILE" ]; then - echo "Error: $INPUT_FILE is not readable." - exit 1 -fi - -# Conver export VAR="value" to VAR: value -cat $INPUT_FILE | \ - grep -E '^export ' | \ - sed -E 's/^export ([^=]+)=(.*)$/\1: \2/' > $DATA_FILE - -echo "$INPUT_FILE ==> $DATA_FILE" diff --git a/tools/process-mdbook.py b/tools/process-mdbook.py deleted file mode 100755 index e5b151a7bfc..00000000000 --- a/tools/process-mdbook.py +++ /dev/null @@ -1,80 +0,0 @@ -#! /usr/bin/env python3 - -# Copyright 2025 Proofcraft Pty Ltd -# SPDX-License-Identifier: BSD-2-Clause - -# Process mdbook .md files to -# - execute `{{#include "path/to/file.md"}}` directives -# - convert tab directives Jekyll includes used in the docsite -# - convert
    to
    -# - convert {{variable}} to {{site.data.microkit_tutorial.variable}} - -import os -import re -import argparse - - -def inclusion_content(input_path, match): - include_path = match.group(1) - start_line = match.group(2) - end_line = match.group(3) - - full_path = os.path.join(input_path, include_path) - if os.path.exists(full_path): - with open(full_path, 'r', encoding='utf-8') as inc_file: - lines = inc_file.read().splitlines() - if start_line is None: - start_line = 1 - if end_line is None: - end_line = len(lines) - else: - end_line = int(end_line) - # Return the specified lines as a string - return '\n'.join(lines[int(start_line)-1:end_line]) - else: - print(f'Include file {include_path} not found in {input_path}') - return f'' - - -def process_mdbook(input_file, output_dir): - if not os.path.exists(output_dir): - os.makedirs(output_dir) - - # Read entire input file - with open(input_file, 'r', encoding='utf-8') as f: - content = f.read() - - # Process include directives with line numbers - include_pattern = re.compile(r'{{#include[ ]*([^ :]+)(?::(\d+):(\d+))?[ ]*}}') - input_path = os.path.dirname(input_file) - content = re.sub(include_pattern, lambda match: inclusion_content(input_path, match), content) - - # Convert tab directives to Jekyll includes - # {{#tabs }}, {{#endtabs }}, {{#endtab }} - pat = re.compile(r'{{#([a-z]*tabs?)[ ]*}}') - content = re.sub(pat, r'{% include \1.html %}', content) - - # "{{#tab name="Linux" }}" - pat = re.compile(r'{{#tab name="([^"]+)"[ ]*}}') - content = re.sub(pat, r'{% include tab.html title="\1" %}', content) - - # Convert
    to
    - content = re.sub(r'
    ', r'
    ', content) - - # Convert {{variable}} to {{site.data.microkit_tutorial.variable}} - pat = re.compile(r'{{([a-zA-Z0-9_]+)}}') - content = re.sub(pat, r'{{site.data.microkit_tutorial.\1}}', content) - - # Write processed content - output_file = os.path.join(output_dir, os.path.basename(input_file)) - with open(output_file, 'w', encoding='utf-8') as f: - f.write(content) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description='Process mdbook .md files for includes and tabs.') - parser.add_argument('input_file', help='Path to the input .md file') - parser.add_argument('output_dir', help='Directory to save the processed output') - - args = parser.parse_args() - process_mdbook(args.input_file, args.output_dir) diff --git a/tools/testWCAG.py b/tools/testWCAG.py deleted file mode 100644 index f2e2fe7c44e..00000000000 --- a/tools/testWCAG.py +++ /dev/null @@ -1,84 +0,0 @@ -#! /usr/bin/env python - -# Copyright 2020 Data61, CSIRO -# SPDX-License-Identifier: BSD-2-Clause - -import sys -from sys import stdin -import requests -import json -from multiprocessing import Pool - -from HTMLParser import HTMLParser -from junit_xml import TestSuite, TestCase - -AATT_SITE_ENDPOINT = "http://localhost:3000/sniffURL" -JEKYLL_SITE_URL = "http://localhost:4000" - - -def run_test(page): - - class SimpleHTMLParser(HTMLParser): - ''' - This pulls out the number of errors which is the data in the span - with class `result-count-errors`. - ''' - get_error = False - num_errors = 0 - - def handle_starttag(self, tag, attrs): - if tag == "span": - for (key, val) in attrs: - if key == "class" and "result-count-errors" in val: - self.get_error = True - - def handle_data(self, data): - if self.get_error: - self.num_errors = data - self.get_error = False - - def get_result(self): - return self.num_errors - - # POST request with url to AATT endpoint - url = AATT_SITE_ENDPOINT - headers = {'content-type': 'application/x-www-form-urlencoded'} - r = requests.post(url, data='engine=htmlcs&msgErr=true&textURL=%s/%s' % - (JEKYLL_SITE_URL, page), headers=headers) - output = json.loads(r.text) - - # Parse result using simple parser to get number of errors. - parser = SimpleHTMLParser() - parser.feed(output['data']) - result = parser.get_result() - - # Put error number into junit TestCase and return to caller. - tc = TestCase(page, 'some.class.name', 1, output['data']) - if (parser.get_result() != "0"): - tc.add_failure_info("Detected %s error(s)." % (parser.get_result())) - return tc - - -def main(): - # Read list of html files in from stdin line by line. - # This is to enable piping result from `find` - # Use a multiprocessing pool to get some parallelism - pool = Pool() - - queries = [] - test_cases = [] - - for line in sys.stdin: - queries.append(pool.apply_async(run_test, [line.strip()])) - - for query in queries: - test_cases.append(query.get(timeout=10)) - - # Dump test results to stdout - ts = [TestSuite("my test suite", test_cases)] - print(TestSuite.to_xml_string(ts)) - return 0 - - -if __name__ == "__main__": - main() diff --git a/updates/buildsystem/11.0.x.html b/updates/buildsystem/11.0.x.html new file mode 100644 index 00000000000..dc352b4f848 --- /dev/null +++ b/updates/buildsystem/11.0.x.html @@ -0,0 +1,650 @@ + + + + + + + seL4 11.0.x-compatible | seL4 docs + + + + + + + + + + + + +
    + + + +
    +
    +
    +
    +
    +

    This page is archived and is no longer receiving updates.

    +

    It remains here because some of the content may still be useful.

    +
    + + + +
    +
    + + + +
    +
    +
    + + diff --git a/updates/camkes-vm/camkes-3.8.x-arm-old.html b/updates/camkes-vm/camkes-3.8.x-arm-old.html new file mode 100644 index 00000000000..3fc5f408b47 --- /dev/null +++ b/updates/camkes-vm/camkes-3.8.x-arm-old.html @@ -0,0 +1,659 @@ + + + + + + + camkes-3.8.x-compatible-arm-old | seL4 docs + + + + + + + + + + + + +
    + + + +
    +
    +
    +
    +
    +

    This page is archived and is no longer receiving updates.

    +

    It remains here because some of the content may still be useful.

    +
    + + + +
    +
    + + + +
    +
    +
    + + diff --git a/updates/camkes-vm/camkes-3.8.x.html b/updates/camkes-vm/camkes-3.8.x.html new file mode 100644 index 00000000000..9452d85aac1 --- /dev/null +++ b/updates/camkes-vm/camkes-3.8.x.html @@ -0,0 +1,589 @@ + + + + + + + camkes-3.8.x-compatible | seL4 docs + + + + + + + + + + + + +
    + + + +
    +
    +
    +
    +
    +

    This page is archived and is no longer receiving updates.

    +

    It remains here because some of the content may still be useful.

    +
    + + + +
    +
    + + + +
    +
    +
    + + diff --git a/updates/elfloader/11.0.x.html b/updates/elfloader/11.0.x.html new file mode 100644 index 00000000000..5c3a3bf581c --- /dev/null +++ b/updates/elfloader/11.0.x.html @@ -0,0 +1,646 @@ + + + + + + + seL4 11.0.x-compatible | seL4 docs + + + + + + + + + + + + +
    + + + +
    +
    +
    +
    +
    +

    This page is archived and is no longer receiving updates.

    +

    It remains here because some of the content may still be useful.

    +
    + + + +
    +
    + + + +
    +
    +
    + + diff --git a/updates/sel4-tutorials/camkes-3.8.x.html b/updates/sel4-tutorials/camkes-3.8.x.html new file mode 100644 index 00000000000..32b497ba349 --- /dev/null +++ b/updates/sel4-tutorials/camkes-3.8.x.html @@ -0,0 +1,593 @@ + + + + + + + camkes-3.8.x-compatible | seL4 docs + + + + + + + + + + + + +
    + + + +
    +
    +
    +
    +
    +

    This page is archived and is no longer receiving updates.

    +

    It remains here because some of the content may still be useful.

    +
    + + + +
    +
    + + + +
    +
    +
    + + diff --git a/updates/sel4bench/11.0.x.html b/updates/sel4bench/11.0.x.html new file mode 100644 index 00000000000..595eb4aa8ab --- /dev/null +++ b/updates/sel4bench/11.0.x.html @@ -0,0 +1,599 @@ + + + + + + + seL4 11.0.x-compatible | seL4 docs + + + + + + + + + + + + +
    + + + +
    +
    +
    +
    +
    +

    This page is archived and is no longer receiving updates.

    +

    It remains here because some of the content may still be useful.

    +
    + + + +
    +
    + + + +
    +
    +
    + + diff --git a/updates/sel4runtime/11.0.x.html b/updates/sel4runtime/11.0.x.html new file mode 100644 index 00000000000..5287a0d4103 --- /dev/null +++ b/updates/sel4runtime/11.0.x.html @@ -0,0 +1,593 @@ + + + + + + + seL4 11.0.x-compatible | seL4 docs + + + + + + + + + + + + +
    + + + +
    +
    +
    +
    +
    +

    This page is archived and is no longer receiving updates.

    +

    It remains here because some of the content may still be useful.

    +
    + + + +
    +
    + + + +
    +
    +
    + + diff --git a/updates/sel4test/11.0.x.html b/updates/sel4test/11.0.x.html new file mode 100644 index 00000000000..9d409535a64 --- /dev/null +++ b/updates/sel4test/11.0.x.html @@ -0,0 +1,634 @@ + + + + + + + seL4 11.0.x-compatible | seL4 docs + + + + + + + + + + + + +
    + + + +
    +
    +
    +
    +
    +

    This page is archived and is no longer receiving updates.

    +

    It remains here because some of the content may still be useful.

    +
    + + + +
    +
    + + + +
    +
    +
    + + diff --git a/updates/sel4webserver/camkes-3.8.x.html b/updates/sel4webserver/camkes-3.8.x.html new file mode 100644 index 00000000000..eaba4cf6003 --- /dev/null +++ b/updates/sel4webserver/camkes-3.8.x.html @@ -0,0 +1,566 @@ + + + + + + + camkes-3.8.x-compatible | seL4 docs + + + + + + + + + + + + +
    + + + +
    +
    +
    +
    +
    +

    This page is archived and is no longer receiving updates.

    +

    It remains here because some of the content may still be useful.

    +
    + + + +
    +
    + + + +
    +
    +
    + + diff --git a/updates/user_libs/11.0.x.html b/updates/user_libs/11.0.x.html new file mode 100644 index 00000000000..b3de1f23f3e --- /dev/null +++ b/updates/user_libs/11.0.x.html @@ -0,0 +1,902 @@ + + + + + + + seL4 11.0.x-compatible | seL4 docs + + + + + + + + + + + + +
    + + + +
    +
    +
    +
    +
    +

    This page is archived and is no longer receiving updates.

    +

    It remains here because some of the content may still be useful.

    +
    + + + +
    +
    + + + +
    +
    +
    + +