summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api-docs/cppdocs/Doxyfile9
-rw-r--r--api-docs/cppdocs/DoxygenLayout.xml10
-rw-r--r--api-docs/cppdocs/README.md2
-rw-r--r--api-docs/cppdocs/custom.css87
-rw-r--r--api-docs/cppdocs/doxygen-awesome-css/LICENSE21
-rw-r--r--api-docs/cppdocs/doxygen-awesome-css/README.md4
-rw-r--r--api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js157
-rw-r--r--api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js85
-rw-r--r--api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js51
-rw-r--r--api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css40
-rw-r--r--api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css113
-rw-r--r--api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome.css2135
-rw-r--r--api-docs/cppdocs/header.html61
-rw-r--r--api-docs/cppdocs/style.css2021
-rw-r--r--binaryninjaapi.h1388
-rw-r--r--python/binaryview.py25
-rw-r--r--python/filemetadata.py5
-rw-r--r--python/types.py1
18 files changed, 4163 insertions, 2052 deletions
diff --git a/api-docs/cppdocs/Doxyfile b/api-docs/cppdocs/Doxyfile
index f7cb9b6e..c2cd6428 100644
--- a/api-docs/cppdocs/Doxyfile
+++ b/api-docs/cppdocs/Doxyfile
@@ -1165,7 +1165,7 @@ HTML_FOOTER = footer.html
# obsolete.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_STYLESHEET = style.css
+HTML_STYLESHEET =
# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
# cascading style sheets that are included after the standard style sheets
@@ -1178,7 +1178,10 @@ HTML_STYLESHEET = style.css
# list). For an example see the documentation.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_EXTRA_STYLESHEET =
+HTML_EXTRA_STYLESHEET = doxygen-awesome-css/doxygen-awesome.css \
+ doxygen-awesome-css/doxygen-awesome-sidebar-only.css \
+ doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css \
+ custom.css
# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
# other source files which should be copied to the HTML output directory. Note
@@ -1188,7 +1191,7 @@ HTML_EXTRA_STYLESHEET =
# files will be copied as-is; there are no commands or markers available.
# This tag requires that the tag GENERATE_HTML is set to YES.
-HTML_EXTRA_FILES =
+HTML_EXTRA_FILES = doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js
# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
# will adjust the colors in the style sheet and background images according to
diff --git a/api-docs/cppdocs/DoxygenLayout.xml b/api-docs/cppdocs/DoxygenLayout.xml
index 06fa867d..f946e233 100644
--- a/api-docs/cppdocs/DoxygenLayout.xml
+++ b/api-docs/cppdocs/DoxygenLayout.xml
@@ -2,13 +2,10 @@
<!-- Generated by doxygen 1.8.20 -->
<!-- Navigation index tabs for HTML output -->
<navindex>
- <tab type="mainpage" visible="yes" title=""/>
- <tab type="pages" visible="yes" title="" intro=""/>
+ <tab type="mainpage" visible="no" title="Binary Ninja API"/>
+ <tab type="pages" visible="yes" title="Binary Ninja API" intro=""/>
<tab type="modules" visible="yes" title="" intro=""/>
- <tab type="namespaces" visible="yes" title="">
- <tab type="namespacelist" visible="yes" title="" intro=""/>
- <tab type="namespacemembers" visible="yes" title="" intro=""/>
- </tab>
+ <tab type="namespacelist" visible="yes" title="Namespaces" intro=""/>
<tab type="interfaces" visible="yes" title="">
<tab type="interfacelist" visible="yes" title="" intro=""/>
<tab type="interfaceindex" visible="$ALPHABETICAL_INDEX" title=""/>
@@ -24,7 +21,6 @@
<tab type="exceptionindex" visible="$ALPHABETICAL_INDEX" title=""/>
<tab type="exceptionhierarchy" visible="yes" title="" intro=""/>
</tab>
- <tab type="filelist" visible="yes" title="Files"/>
<tab type="examples" visible="yes" title="" intro=""/>
</navindex>
diff --git a/api-docs/cppdocs/README.md b/api-docs/cppdocs/README.md
index 237a840c..9a857d17 100644
--- a/api-docs/cppdocs/README.md
+++ b/api-docs/cppdocs/README.md
@@ -1,6 +1,6 @@
# CPP Docs
-We are currently expirmenting with two different document generation systems. You'll see artifacts for both of them in this directory. Currently, the documentation available [online](https://api.binary.ninja/cpp) uses [Doxygen](https://www.doxygen.nl/index.html) but we plan eventually to move to [Breathe](https://breathe.readthedocs.io/en/latest/) / [Sphinx](https://www.sphinx-doc.org/en/master/).
+We are currently experimenting with two different document generation systems. You'll see artifacts for both of them in this directory. Currently, the documentation available [online](https://api.binary.ninja/cpp) uses [Doxygen](https://www.doxygen.nl/index.html) but we plan eventually to move to [Breathe](https://breathe.readthedocs.io/en/latest/) / [Sphinx](https://www.sphinx-doc.org/en/master/).
## Doxygen
diff --git a/api-docs/cppdocs/custom.css b/api-docs/cppdocs/custom.css
new file mode 100644
index 00000000..e977a5b7
--- /dev/null
+++ b/api-docs/cppdocs/custom.css
@@ -0,0 +1,87 @@
+
+/* external link icon */
+div.contents a[href ^= "http"]:after {
+ content: " " url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=);
+}
+
+.githublogo {
+ content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RERCMUIwOUY4NkNFMTFFM0FBNTJFRTMzNTJEMUJDNDYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RERCMUIwOUU4NkNFMTFFM0FBNTJFRTMzNTJEMUJDNDYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkU1MTc4QTJBOTlBMDExRTI5QTE1QkMxMDQ2QTg5MDREIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkU1MTc4QTJCOTlBMDExRTI5QTE1QkMxMDQ2QTg5MDREIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+jUqS1wAAApVJREFUeNq0l89rE1EQx3e3gVJoSPzZeNEWPKgHoa0HBak0iHiy/4C3WvDmoZ56qJ7txVsPQu8qlqqHIhRKJZceesmhioQEfxTEtsoSpdJg1u/ABJ7Pmc1m8zLwgWTmzcw3L+/te+tHUeQltONgCkyCi2AEDHLsJ6iBMlgHL8FeoqokoA2j4CloRMmtwTmj7erHBXPgCWhG6a3JNXKdCiDl1cidVbXZkJoXQRi5t5BrxwoY71FzU8S4JuAIqFkJ2+BFSlEh525b/hr3+k/AklDkNsf6wTT4yv46KIMNpsy+iMdMc47HNWxbsgVcUn7FmLAzzoFAWDsBx+wVP6bUpp5ewI+DOeUx0Wd9D8F70BTGNjkWtqnhmT1JQAHcUgZd8Lo3rQb1LAT8eJVUfgGvHQigGp+V2Z0iAUUl8QH47kAA1XioxIo+bRN8OG8F/oBjwv+Z1nJgX5jpdzQDw0LCjsPmrcW7I/iHScCAEDj03FtD8A0EyuChHgg4KTlJQF3wZ7WELppnBX+dBFSVpJsOBWi1qiRgSwnOgoyD5hmuJdkWCVhTgnTvW3AgYIFrSbZGh0UW/Io5Vp+DQoK7o80pztWMemZbgxeNwCNwDbw1fIfgGZjhU6xPaJgBV8BdsMw5cbZoHsenwYFxkZzl83xTSKTiviCAfCsJLysH3POfC8m8NegyGAGfLP/VmGmfSChgXroR0RSWjEFv2J/nG84cuKFMf4sTCZqXuJd4KaXFVjEG3+tw4eXbNK/YC9oXXs3O8NY8y99L4BXY5cvLY/Bb2VZ58EOJVcB18DHJq9lRsKr8inyKGVjlmh29mtHs3AHfuhCwy1vXT/Nu2GKQt+UHsGdctyX6eQyNvc+5sfX9Dl7Pe2J/BRgAl2CpwmrsHR0AAAAASUVORK5CYII=);
+}
+
+/* search bar wrapper */
+#titlearea #projectalign + td {
+ position: absolute;
+ left: 20px;
+ top: 80px;
+}
+
+doxygen-awesome-dark-mode-toggle {
+ display: inline-block !important;
+ position: absolute;
+ right: -27px;
+ top: 0px;
+ padding-top: 5px;
+ height: 29px;
+}
+/*
+Doxygen by default does this horrible table layout thing where it tries to figure the default width of the left
+ column by taking the largest item in that column (the type), unwrapped, and making that the width for the entire column
+We are working with C++, type declarations can be massive. So lock it to 350px and turn on word wrapping for the Types
+ column.
+*/
+table.memberdecls .memItemLeft {
+ white-space: normal;
+ min-width: 350px;
+}
+
+html.dark-mode {
+ --primary-color: #c74433!important;
+ --primary-dark-color: #d0584d !important;;
+ --primary-light-color: #a2382a !important;;
+}
+html {
+ --primary-color: #c74433!important;
+ --primary-dark-color: #d0584d !important;;
+ --primary-light-color: #a2382a !important;;
+ --side-nav-background: #252628 !important;
+ --side-nav-foreground: #ffffff !important;
+}
+
+div#projectname {
+ color: white;
+}
+.paramname {
+ color: var(--primary-light-color);
+}
+.paramtype .el {
+ color: var(--primary-dark-color) !important;
+}
+
+tr#projectrow {
+ margin-top: 7px;
+ display: block;
+}
+
+#MSearchBox span.left {
+ left: 5px;
+ top: 1px;
+}
+
+input#MSearchField {
+ padding-left: 10px;
+ top: -1px;
+}
+
+/* Basic Mobile functionality fixes */
+@media screen and (max-width: 767px) {
+ div#top {
+ height: 125px;
+ }
+ div#MSearchBox {
+ top: -16px;
+ }
+ doxygen-awesome-dark-mode-toggle {
+ padding-top: 0px;
+ right: -22px;
+ }
+} \ No newline at end of file
diff --git a/api-docs/cppdocs/doxygen-awesome-css/LICENSE b/api-docs/cppdocs/doxygen-awesome-css/LICENSE
new file mode 100644
index 00000000..1d8b99a9
--- /dev/null
+++ b/api-docs/cppdocs/doxygen-awesome-css/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 jothepro
+
+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/api-docs/cppdocs/doxygen-awesome-css/README.md b/api-docs/cppdocs/doxygen-awesome-css/README.md
new file mode 100644
index 00000000..b823a109
--- /dev/null
+++ b/api-docs/cppdocs/doxygen-awesome-css/README.md
@@ -0,0 +1,4 @@
+This doxygen theme is from https://github.com/jothepro/doxygen-awesome-css
+
+Do not edit any of the files in this directory unless *absolutely necessary*; instead edit ../custom.css .
+
diff --git a/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js
new file mode 100644
index 00000000..f2c5853f
--- /dev/null
+++ b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js
@@ -0,0 +1,157 @@
+/**
+
+Doxygen Awesome
+https://github.com/jothepro/doxygen-awesome-css
+
+MIT License
+
+Copyright (c) 2021 - 2022 jothepro
+
+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.
+
+*/
+
+class DoxygenAwesomeDarkModeToggle extends HTMLElement {
+ // SVG icons from https://fonts.google.com/icons
+ // Licensed under the Apache 2.0 license:
+ // https://www.apache.org/licenses/LICENSE-2.0.html
+ static lightModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FCBF00"><rect fill="none" height="24" width="24"/><circle cx="12" cy="12" opacity=".3" r="3"/><path d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"/></svg>`
+ static darkModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FE9700"><rect fill="none" height="24" width="24"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27 C17.45,17.19,14.93,19,12,19c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z" opacity=".3"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/></svg>`
+ static title = "Toggle Light/Dark Mode"
+
+ static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode"
+ static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode"
+
+ static _staticConstructor = function() {
+ DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.userPreference)
+ // Update the color scheme when the browsers preference changes
+ // without user interaction on the website.
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
+ DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged()
+ })
+ // Update the color scheme when the tab is made visible again.
+ // It is possible that the appearance was changed in another tab
+ // while this tab was in the background.
+ document.addEventListener("visibilitychange", visibilityState => {
+ if (document.visibilityState === 'visible') {
+ DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged()
+ }
+ });
+ }()
+
+ static init() {
+ $(function() {
+ $(document).ready(function() {
+ const toggleButton = document.createElement('doxygen-awesome-dark-mode-toggle')
+ toggleButton.title = DoxygenAwesomeDarkModeToggle.title
+ toggleButton.updateIcon()
+
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
+ toggleButton.updateIcon()
+ })
+ document.addEventListener("visibilitychange", visibilityState => {
+ if (document.visibilityState === 'visible') {
+ toggleButton.updateIcon()
+ }
+ });
+
+ $(document).ready(function(){
+ document.getElementById("MSearchBox").parentNode.appendChild(toggleButton)
+ })
+ $(window).resize(function(){
+ document.getElementById("MSearchBox").parentNode.appendChild(toggleButton)
+ })
+ })
+ })
+ }
+
+ constructor() {
+ super();
+ this.onclick=this.toggleDarkMode
+ }
+
+ /**
+ * @returns `true` for dark-mode, `false` for light-mode system preference
+ */
+ static get systemPreference() {
+ return window.matchMedia('(prefers-color-scheme: dark)').matches
+ }
+
+ /**
+ * @returns `true` for dark-mode, `false` for light-mode user preference
+ */
+ static get userPreference() {
+ return (!DoxygenAwesomeDarkModeToggle.systemPreference && localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)) ||
+ (DoxygenAwesomeDarkModeToggle.systemPreference && !localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey))
+ }
+
+ static set userPreference(userPreference) {
+ DoxygenAwesomeDarkModeToggle.darkModeEnabled = userPreference
+ if(!userPreference) {
+ if(DoxygenAwesomeDarkModeToggle.systemPreference) {
+ localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey, true)
+ } else {
+ localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)
+ }
+ } else {
+ if(!DoxygenAwesomeDarkModeToggle.systemPreference) {
+ localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey, true)
+ } else {
+ localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey)
+ }
+ }
+ DoxygenAwesomeDarkModeToggle.onUserPreferenceChanged()
+ }
+
+ static enableDarkMode(enable) {
+ if(enable) {
+ DoxygenAwesomeDarkModeToggle.darkModeEnabled = true
+ document.documentElement.classList.add("dark-mode")
+ document.documentElement.classList.remove("light-mode")
+ } else {
+ DoxygenAwesomeDarkModeToggle.darkModeEnabled = false
+ document.documentElement.classList.remove("dark-mode")
+ document.documentElement.classList.add("light-mode")
+ }
+ }
+
+ static onSystemPreferenceChanged() {
+ DoxygenAwesomeDarkModeToggle.darkModeEnabled = DoxygenAwesomeDarkModeToggle.userPreference
+ DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled)
+ }
+
+ static onUserPreferenceChanged() {
+ DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled)
+ }
+
+ toggleDarkMode() {
+ DoxygenAwesomeDarkModeToggle.userPreference = !DoxygenAwesomeDarkModeToggle.userPreference
+ this.updateIcon()
+ }
+
+ updateIcon() {
+ if(DoxygenAwesomeDarkModeToggle.darkModeEnabled) {
+ this.innerHTML = DoxygenAwesomeDarkModeToggle.darkModeIcon
+ } else {
+ this.innerHTML = DoxygenAwesomeDarkModeToggle.lightModeIcon
+ }
+ }
+}
+
+customElements.define("doxygen-awesome-dark-mode-toggle", DoxygenAwesomeDarkModeToggle);
diff --git a/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js
new file mode 100644
index 00000000..7d06b348
--- /dev/null
+++ b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js
@@ -0,0 +1,85 @@
+/**
+
+Doxygen Awesome
+https://github.com/jothepro/doxygen-awesome-css
+
+MIT License
+
+Copyright (c) 2022 jothepro
+
+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.
+
+*/
+
+class DoxygenAwesomeFragmentCopyButton extends HTMLElement {
+ constructor() {
+ super();
+ this.onclick=this.copyContent
+ }
+ static title = "Copy to clipboard"
+ static copyIcon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/></svg>`
+ static successIcon = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41L9 16.17z"/></svg>`
+ static successDuration = 980
+ static init() {
+ $(function() {
+ $(document).ready(function() {
+ if(navigator.clipboard) {
+ const fragments = document.getElementsByClassName("fragment")
+ for(const fragment of fragments) {
+ const fragmentWrapper = document.createElement("div")
+ fragmentWrapper.className = "doxygen-awesome-fragment-wrapper"
+ const fragmentCopyButton = document.createElement("doxygen-awesome-fragment-copy-button")
+ fragmentCopyButton.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon
+ fragmentCopyButton.title = DoxygenAwesomeFragmentCopyButton.title
+
+ fragment.parentNode.replaceChild(fragmentWrapper, fragment)
+ fragmentWrapper.appendChild(fragment)
+ fragmentWrapper.appendChild(fragmentCopyButton)
+
+ }
+ }
+ })
+ })
+ }
+
+
+ copyContent() {
+ const content = this.previousSibling.cloneNode(true)
+ // filter out line number from file listings
+ content.querySelectorAll(".lineno, .ttc").forEach((node) => {
+ node.remove()
+ })
+ let textContent = content.textContent
+ // remove trailing newlines that appear in file listings
+ let numberOfTrailingNewlines = 0
+ while(textContent.charAt(textContent.length - (numberOfTrailingNewlines + 1)) == '\n') {
+ numberOfTrailingNewlines++;
+ }
+ textContent = textContent.substring(0, textContent.length - numberOfTrailingNewlines)
+ navigator.clipboard.writeText(textContent);
+ this.classList.add("success")
+ this.innerHTML = DoxygenAwesomeFragmentCopyButton.successIcon
+ window.setTimeout(() => {
+ this.classList.remove("success")
+ this.innerHTML = DoxygenAwesomeFragmentCopyButton.copyIcon
+ }, DoxygenAwesomeFragmentCopyButton.successDuration);
+ }
+}
+
+customElements.define("doxygen-awesome-fragment-copy-button", DoxygenAwesomeFragmentCopyButton)
diff --git a/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js
new file mode 100644
index 00000000..6424dbd4
--- /dev/null
+++ b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js
@@ -0,0 +1,51 @@
+/**
+
+Doxygen Awesome
+https://github.com/jothepro/doxygen-awesome-css
+
+MIT License
+
+Copyright (c) 2022 jothepro
+
+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.
+
+*/
+
+class DoxygenAwesomeParagraphLink {
+ // Icon from https://fonts.google.com/icons
+ // Licensed under the Apache 2.0 license:
+ // https://www.apache.org/licenses/LICENSE-2.0.html
+ static icon = `<svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M17 7h-4v2h4c1.65 0 3 1.35 3 3s-1.35 3-3 3h-4v2h4c2.76 0 5-2.24 5-5s-2.24-5-5-5zm-6 8H7c-1.65 0-3-1.35-3-3s1.35-3 3-3h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-2zm-3-4h8v2H8z"/></svg>`
+ static title = "Permanent Link"
+ static init() {
+ $(function() {
+ $(document).ready(function() {
+ document.querySelectorAll(".contents a.anchor[id], .contents .groupheader > a[id]").forEach((node) => {
+ let anchorlink = document.createElement("a")
+ anchorlink.setAttribute("href", `#${node.getAttribute("id")}`)
+ anchorlink.setAttribute("title", DoxygenAwesomeParagraphLink.title)
+ anchorlink.classList.add("anchorlink")
+ node.classList.add("anchor")
+ anchorlink.innerHTML = DoxygenAwesomeParagraphLink.icon
+ node.parentElement.appendChild(anchorlink)
+ })
+ })
+ })
+ }
+}
diff --git a/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css
new file mode 100644
index 00000000..b988b6f0
--- /dev/null
+++ b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css
@@ -0,0 +1,40 @@
+
+/**
+
+Doxygen Awesome
+https://github.com/jothepro/doxygen-awesome-css
+
+MIT License
+
+Copyright (c) 2021 jothepro
+
+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.
+
+*/
+
+@media screen and (min-width: 768px) {
+
+ #MSearchBox {
+ width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - var(--searchbar-height) - 1px);
+ }
+
+ #MSearchField {
+ width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 66px - var(--searchbar-height));
+ }
+}
diff --git a/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css
new file mode 100644
index 00000000..b5c4e7cb
--- /dev/null
+++ b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css
@@ -0,0 +1,113 @@
+/**
+
+Doxygen Awesome
+https://github.com/jothepro/doxygen-awesome-css
+
+MIT License
+
+Copyright (c) 2021 jothepro
+
+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.
+
+ */
+
+html {
+ /* side nav width. MUST be = `TREEVIEW_WIDTH`.
+ * Make sure it is wide enough to contain the page title (logo + title + version)
+ */
+ --side-nav-fixed-width: 335px;
+ --menu-display: none;
+
+ --top-height: 120px;
+}
+
+#projectname {
+ white-space: nowrap;
+}
+
+
+@media screen and (min-width: 768px) {
+ html {
+ --searchbar-background: var(--page-background-color);
+ }
+
+ #side-nav {
+ min-width: var(--side-nav-fixed-width);
+ max-width: var(--side-nav-fixed-width);
+ top: var(--top-height);
+ overflow: visible;
+ }
+
+ #nav-tree, #side-nav {
+ height: calc(100vh - var(--top-height)) !important;
+ }
+
+ #nav-tree {
+ padding: 0;
+ }
+
+ #top {
+ display: block;
+ border-bottom: none;
+ height: var(--top-height);
+ margin-bottom: calc(0px - var(--top-height));
+ max-width: var(--side-nav-fixed-width);
+ overflow: hidden;
+ background: var(--side-nav-background);
+ }
+ #main-nav {
+ float: left;
+ padding-right: 0;
+ }
+
+ .ui-resizable-handle {
+ cursor: default;
+ width: 1px !important;
+ box-shadow: 0 calc(-2 * var(--top-height)) 0 0 var(--separator-color);
+ }
+
+ #nav-path {
+ position: fixed;
+ right: 0;
+ left: var(--side-nav-fixed-width);
+ bottom: 0;
+ width: auto;
+ }
+
+ #doc-content {
+ height: calc(100vh - 31px) !important;
+ padding-bottom: calc(3 * var(--spacing-large));
+ padding-top: calc(var(--top-height) - 80px);
+ box-sizing: border-box;
+ margin-left: var(--side-nav-fixed-width) !important;
+ }
+
+ #MSearchBox {
+ width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)));
+ }
+
+ #MSearchField {
+ width: calc(var(--side-nav-fixed-width) - calc(2 * var(--spacing-medium)) - 65px);
+ }
+
+ #MSearchResultsWindow {
+ left: var(--spacing-medium) !important;
+ right: auto;
+ }
+}
diff --git a/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome.css b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome.css
new file mode 100644
index 00000000..5f420dc4
--- /dev/null
+++ b/api-docs/cppdocs/doxygen-awesome-css/doxygen-awesome.css
@@ -0,0 +1,2135 @@
+/**
+
+Doxygen Awesome
+https://github.com/jothepro/doxygen-awesome-css
+
+MIT License
+
+Copyright (c) 2021 - 2022 jothepro
+
+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.
+
+*/
+
+html {
+ /* primary theme color. This will affect the entire websites color scheme: links, arrows, labels, ... */
+ --primary-color: #1779c4;
+ --primary-dark-color: #335c80;
+ --primary-light-color: #70b1e9;
+
+ /* page base colors */
+ --page-background-color: white;
+ --page-foreground-color: #2f4153;
+ --page-secondary-foreground-color: #637485;
+
+ /* color for all separators on the website: hr, borders, ... */
+ --separator-color: #dedede;
+
+ /* border radius for all rounded components. Will affect many components, like dropdowns, memitems, codeblocks, ... */
+ --border-radius-large: 8px;
+ --border-radius-small: 4px;
+ --border-radius-medium: 6px;
+
+ /* default spacings. Most compontest reference these values for spacing, to provide uniform spacing on the page. */
+ --spacing-small: 5px;
+ --spacing-medium: 10px;
+ --spacing-large: 16px;
+
+ /* default box shadow used for raising an element above the normal content. Used in dropdowns, Searchresult, ... */
+ --box-shadow: 0 2px 8px 0 rgba(0,0,0,.075);
+
+ --odd-color: rgba(0,0,0,.028);
+
+ /* font-families. will affect all text on the website
+ * font-family: the normal font for text, headlines, menus
+ * font-family-monospace: used for preformatted text in memtitle, code, fragments
+ */
+ --font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;
+ --font-family-monospace: ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;
+
+ /* font sizes */
+ --page-font-size: 15.6px;
+ --navigation-font-size: 14.4px;
+ --code-font-size: 14px; /* affects code, fragment */
+ --title-font-size: 22px;
+
+ /* content text properties. These only affect the page content, not the navigation or any other ui elements */
+ --content-line-height: 27px;
+ /* The content is centered and constraint in it's width. To make the content fill the whole page, set the variable to auto.*/
+ --content-maxwidth: 1000px;
+
+ /* colors for various content boxes: @warning, @note, @deprecated @bug */
+ --warning-color: #f8d1cc;
+ --warning-color-dark: #b61825;
+ --warning-color-darker: #75070f;
+ --note-color: #faf3d8;
+ --note-color-dark: #f3a600;
+ --note-color-darker: #5f4204;
+ --todo-color: #e4f3ff;
+ --todo-color-dark: #1879C4;
+ --todo-color-darker: #274a5c;
+ --deprecated-color: #ecf0f3;
+ --deprecated-color-dark: #5b6269;
+ --deprecated-color-darker: #43454a;
+ --bug-color: #e4dafd;
+ --bug-color-dark: #5b2bdd;
+ --bug-color-darker: #2a0d72;
+ --invariant-color: #d8f1e3;
+ --invariant-color-dark: #44b86f;
+ --invariant-color-darker: #265532;
+
+ /* blockquote colors */
+ --blockquote-background: #f8f9fa;
+ --blockquote-foreground: #636568;
+
+ /* table colors */
+ --tablehead-background: #f1f1f1;
+ --tablehead-foreground: var(--page-foreground-color);
+
+ /* menu-display: block | none
+ * Visibility of the top navigation on screens >= 768px. On smaller screen the menu is always visible.
+ * `GENERATE_TREEVIEW` MUST be enabled!
+ */
+ --menu-display: block;
+
+ --menu-focus-foreground: var(--page-background-color);
+ --menu-focus-background: var(--primary-color);
+ --menu-selected-background: rgba(0,0,0,.05);
+
+
+ --header-background: var(--page-background-color);
+ --header-foreground: var(--page-foreground-color);
+
+ /* searchbar colors */
+ --searchbar-background: var(--side-nav-background);
+ --searchbar-foreground: var(--page-foreground-color);
+
+ /* searchbar size
+ * (`searchbar-width` is only applied on screens >= 768px.
+ * on smaller screens the searchbar will always fill the entire screen width) */
+ --searchbar-height: 33px;
+ --searchbar-width: 210px;
+ --searchbar-border-radius: var(--searchbar-height);
+
+ /* code block colors */
+ --code-background: #f5f5f5;
+ --code-foreground: var(--page-foreground-color);
+
+ /* fragment colors */
+ --fragment-background: #F8F9FA;
+ --fragment-foreground: #37474F;
+ --fragment-keyword: #bb6bb2;
+ --fragment-keywordtype: #8258b3;
+ --fragment-keywordflow: #d67c3b;
+ --fragment-token: #438a59;
+ --fragment-comment: #969696;
+ --fragment-link: #5383d6;
+ --fragment-preprocessor: #46aaa5;
+ --fragment-linenumber-color: #797979;
+ --fragment-linenumber-background: #f4f4f5;
+ --fragment-linenumber-border: #e3e5e7;
+ --fragment-lineheight: 20px;
+
+ /* sidebar navigation (treeview) colors */
+ --side-nav-background: #fbfbfb;
+ --side-nav-foreground: var(--page-foreground-color);
+ --side-nav-arrow-opacity: 0;
+ --side-nav-arrow-hover-opacity: 0.9;
+
+ --toc-background: var(--side-nav-background);
+ --toc-foreground: var(--side-nav-foreground);
+
+ /* height of an item in any tree / collapsable table */
+ --tree-item-height: 30px;
+
+ --memname-font-size: var(--code-font-size);
+ --memtitle-font-size: 18px;
+
+ --webkit-scrollbar-size: 7px;
+ --webkit-scrollbar-padding: 4px;
+ --webkit-scrollbar-color: var(--separator-color);
+}
+
+@media screen and (max-width: 767px) {
+ html {
+ --page-font-size: 16px;
+ --navigation-font-size: 16px;
+ --code-font-size: 15px; /* affects code, fragment */
+ --title-font-size: 22px;
+ }
+}
+
+@media (prefers-color-scheme: dark) {
+ html:not(.light-mode) {
+ color-scheme: dark;
+
+ --primary-color: #1982d2;
+ --primary-dark-color: #86a9c4;
+ --primary-light-color: #4779ac;
+
+ --box-shadow: 0 2px 8px 0 rgba(0,0,0,.35);
+
+ --odd-color: rgba(100,100,100,.06);
+
+ --menu-selected-background: rgba(0,0,0,.4);
+
+ --page-background-color: #1C1D1F;
+ --page-foreground-color: #d2dbde;
+ --page-secondary-foreground-color: #859399;
+ --separator-color: #38393b;
+ --side-nav-background: #252628;
+
+ --code-background: #2a2c2f;
+
+ --tablehead-background: #2a2c2f;
+
+ --blockquote-background: #222325;
+ --blockquote-foreground: #7e8c92;
+
+ --warning-color: #2e1917;
+ --warning-color-dark: #ad2617;
+ --warning-color-darker: #f5b1aa;
+ --note-color: #3b2e04;
+ --note-color-dark: #f1b602;
+ --note-color-darker: #ceb670;
+ --todo-color: #163750;
+ --todo-color-dark: #1982D2;
+ --todo-color-darker: #dcf0fa;
+ --deprecated-color: #2e323b;
+ --deprecated-color-dark: #738396;
+ --deprecated-color-darker: #abb0bd;
+ --bug-color: #2a2536;
+ --bug-color-dark: #7661b3;
+ --bug-color-darker: #ae9ed6;
+ --invariant-color: #303a35;
+ --invariant-color-dark: #76ce96;
+ --invariant-color-darker: #cceed5;
+
+ --fragment-background: #282c34;
+ --fragment-foreground: #dbe4eb;
+ --fragment-keyword: #cc99cd;
+ --fragment-keywordtype: #ab99cd;
+ --fragment-keywordflow: #e08000;
+ --fragment-token: #7ec699;
+ --fragment-comment: #999999;
+ --fragment-link: #98c0e3;
+ --fragment-preprocessor: #65cabe;
+ --fragment-linenumber-color: #cccccc;
+ --fragment-linenumber-background: #35393c;
+ --fragment-linenumber-border: #1f1f1f;
+ }
+}
+
+/* dark mode variables are defined twice, to support both the dark-mode without and with doxygen-awesome-darkmode-toggle.js */
+html.dark-mode {
+ color-scheme: dark;
+
+ --primary-color: #1982d2;
+ --primary-dark-color: #86a9c4;
+ --primary-light-color: #4779ac;
+
+ --box-shadow: 0 2px 8px 0 rgba(0,0,0,.30);
+
+ --odd-color: rgba(100,100,100,.06);
+
+ --menu-selected-background: rgba(0,0,0,.4);
+
+ --page-background-color: #1C1D1F;
+ --page-foreground-color: #d2dbde;
+ --page-secondary-foreground-color: #859399;
+ --separator-color: #38393b;
+ --side-nav-background: #252628;
+
+ --code-background: #2a2c2f;
+
+ --tablehead-background: #2a2c2f;
+
+ --blockquote-background: #222325;
+ --blockquote-foreground: #7e8c92;
+
+ --warning-color: #2e1917;
+ --warning-color-dark: #ad2617;
+ --warning-color-darker: #f5b1aa;
+ --note-color: #3b2e04;
+ --note-color-dark: #f1b602;
+ --note-color-darker: #ceb670;
+ --todo-color: #163750;
+ --todo-color-dark: #1982D2;
+ --todo-color-darker: #dcf0fa;
+ --deprecated-color: #2e323b;
+ --deprecated-color-dark: #738396;
+ --deprecated-color-darker: #abb0bd;
+ --bug-color: #2a2536;
+ --bug-color-dark: #7661b3;
+ --bug-color-darker: #ae9ed6;
+ --invariant-color: #303a35;
+ --invariant-color-dark: #76ce96;
+ --invariant-color-darker: #cceed5;
+
+ --fragment-background: #282c34;
+ --fragment-foreground: #dbe4eb;
+ --fragment-keyword: #cc99cd;
+ --fragment-keywordtype: #ab99cd;
+ --fragment-keywordflow: #e08000;
+ --fragment-token: #7ec699;
+ --fragment-comment: #999999;
+ --fragment-link: #98c0e3;
+ --fragment-preprocessor: #65cabe;
+ --fragment-linenumber-color: #cccccc;
+ --fragment-linenumber-background: #35393c;
+ --fragment-linenumber-border: #1f1f1f;
+}
+
+body {
+ color: var(--page-foreground-color);
+ background-color: var(--page-background-color);
+ font-size: var(--page-font-size);
+}
+
+body, table, div, p, dl, #nav-tree .label, .title, .sm-dox a, .sm-dox a:hover, .sm-dox a:focus, #projectname, .SelectItem, #MSearchField, .navpath li.navelem a, .navpath li.navelem a:hover {
+ font-family: var(--font-family);
+}
+
+h1, h2, h3, h4, h5 {
+ margin-top: .9em;
+ font-weight: 600;
+ line-height: initial;
+}
+
+p, div, table, dl {
+ font-size: var(--page-font-size);
+}
+
+a:link, a:visited, a:hover, a:focus, a:active {
+ color: var(--primary-color) !important;
+ font-weight: 500;
+}
+
+a.anchor {
+ scroll-margin-top: var(--spacing-large);
+}
+
+/*
+ Title and top navigation
+ */
+
+#top {
+ background: var(--header-background);
+ border-bottom: 1px solid var(--separator-color);
+}
+
+@media screen and (min-width: 768px) {
+ #top {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
+ align-items: center;
+ }
+}
+
+#main-nav {
+ flex-grow: 5;
+ padding: var(--spacing-small) var(--spacing-medium);
+}
+
+#titlearea {
+ width: auto;
+ padding: var(--spacing-medium) var(--spacing-large);
+ background: none;
+ color: var(--header-foreground);
+ border-bottom: none;
+}
+
+@media screen and (max-width: 767px) {
+ #titlearea {
+ padding-bottom: var(--spacing-small);
+ }
+}
+
+#titlearea table tbody tr {
+ height: auto !important;
+}
+
+#projectname {
+ font-size: var(--title-font-size);
+ font-weight: 600;
+}
+
+#projectnumber {
+ font-family: inherit;
+ font-size: 60%;
+}
+
+#projectbrief {
+ font-family: inherit;
+ font-size: 80%;
+}
+
+#projectlogo {
+ vertical-align: middle;
+}
+
+#projectlogo img {
+ max-height: calc(var(--title-font-size) * 2);
+ margin-right: var(--spacing-small);
+}
+
+.sm-dox, .tabs, .tabs2, .tabs3 {
+ background: none;
+ padding: 0;
+}
+
+.tabs, .tabs2, .tabs3 {
+ border-bottom: 1px solid var(--separator-color);
+ margin-bottom: -1px;
+}
+
+@media screen and (max-width: 767px) {
+ .sm-dox a span.sub-arrow {
+ background: var(--code-background);
+ }
+
+ #main-menu a.has-submenu span.sub-arrow {
+ color: var(--page-secondary-foreground-color);
+ border-radius: var(--border-radius-medium);
+ }
+
+ #main-menu a.has-submenu:hover span.sub-arrow {
+ color: var(--page-foreground-color);
+ }
+}
+
+@media screen and (min-width: 768px) {
+ .sm-dox li, .tablist li {
+ display: var(--menu-display);
+ }
+
+ .sm-dox a span.sub-arrow {
+ border-color: var(--header-foreground) transparent transparent transparent;
+ }
+
+ .sm-dox a:hover span.sub-arrow {
+ border-color: var(--menu-focus-foreground) transparent transparent transparent;
+ }
+
+ .sm-dox ul a span.sub-arrow {
+ border-color: transparent transparent transparent var(--page-foreground-color);
+ }
+
+ .sm-dox ul a:hover span.sub-arrow {
+ border-color: transparent transparent transparent var(--menu-focus-foreground);
+ }
+}
+
+.sm-dox ul {
+ background: var(--page-background-color);
+ box-shadow: var(--box-shadow);
+ border: 1px solid var(--separator-color);
+ border-radius: var(--border-radius-medium) !important;
+ padding: var(--spacing-small);
+ animation: ease-out 150ms slideInMenu;
+}
+
+@keyframes slideInMenu {
+ from {
+ opacity: 0;
+ transform: translate(0px, -2px);
+ }
+
+ to {
+ opacity: 1;
+ transform: translate(0px, 0px);
+ }
+}
+
+.sm-dox ul a {
+ color: var(--page-foreground-color) !important;
+ background: var(--page-background-color);
+ font-size: var(--navigation-font-size);
+}
+
+.sm-dox>li>ul:after {
+ border-bottom-color: var(--page-background-color) !important;
+}
+
+.sm-dox>li>ul:before {
+ border-bottom-color: var(--separator-color) !important;
+}
+
+.sm-dox ul a:hover, .sm-dox ul a:active, .sm-dox ul a:focus {
+ font-size: var(--navigation-font-size) !important;
+ color: var(--menu-focus-foreground) !important;
+ text-shadow: none;
+ background-color: var(--menu-focus-background);
+ border-radius: var(--border-radius-small) !important;
+}
+
+.sm-dox a, .sm-dox a:focus, .tablist li, .tablist li a, .tablist li.current a {
+ text-shadow: none;
+ background: transparent;
+ background-image: none !important;
+ color: var(--header-foreground) !important;
+ font-weight: normal;
+ font-size: var(--navigation-font-size);
+ border-radius: var(--border-radius-small) !important;
+}
+
+.sm-dox a:focus {
+ outline: auto;
+}
+
+.sm-dox a:hover, .sm-dox a:active, .tablist li a:hover {
+ text-shadow: none;
+ font-weight: normal;
+ background: var(--menu-focus-background);
+ color: var(--menu-focus-foreground) !important;
+ border-radius: var(--border-radius-small) !important;
+ font-size: var(--navigation-font-size);
+}
+
+.tablist li.current {
+ border-radius: var(--border-radius-small);
+ background: var(--menu-selected-background);
+}
+
+.tablist li {
+ margin: var(--spacing-small) 0 var(--spacing-small) var(--spacing-small);
+}
+
+.tablist a {
+ padding: 0 var(--spacing-large);
+}
+
+
+/*
+ Search box
+ */
+
+#MSearchBox {
+ height: var(--searchbar-height);
+ background: var(--searchbar-background);
+ border-radius: var(--searchbar-border-radius);
+ border: 1px solid var(--separator-color);
+ overflow: hidden;
+ width: var(--searchbar-width);
+ position: relative;
+ box-shadow: none;
+ display: block;
+ margin-top: 0;
+}
+
+.left #MSearchSelect {
+ left: 0;
+ user-select: none;
+}
+
+.SelectionMark {
+ user-select: none;
+}
+
+.tabs .left #MSearchSelect {
+ padding-left: 0;
+}
+
+.tabs #MSearchBox {
+ position: absolute;
+ right: var(--spacing-medium);
+}
+
+@media screen and (max-width: 767px) {
+ .tabs #MSearchBox {
+ position: relative;
+ right: 0;
+ margin-left: var(--spacing-medium);
+ margin-top: 0;
+ }
+}
+
+#MSearchSelectWindow, #MSearchResultsWindow {
+ z-index: 9999;
+}
+
+#MSearchBox.MSearchBoxActive {
+ border-color: var(--primary-color);
+ box-shadow: inset 0 0 0 1px var(--primary-color);
+}
+
+#main-menu > li:last-child {
+ margin-right: 0;
+}
+
+@media screen and (max-width: 767px) {
+ #main-menu > li:last-child {
+ height: 50px;
+ }
+}
+
+#MSearchField {
+ font-size: var(--navigation-font-size);
+ height: calc(var(--searchbar-height) - 2px);
+ background: transparent;
+ width: calc(var(--searchbar-width) - 64px);
+}
+
+.MSearchBoxActive #MSearchField {
+ color: var(--searchbar-foreground);
+}
+
+#MSearchSelect {
+ top: calc(calc(var(--searchbar-height) / 2) - 11px);
+}
+
+.left #MSearchSelect {
+ padding-left: 8px;
+}
+
+#MSearchBox span.left, #MSearchBox span.right {
+ background: none;
+}
+
+#MSearchBox span.right {
+ padding-top: calc(calc(var(--searchbar-height) / 2) - 12px);
+ position: absolute;
+ right: var(--spacing-small);
+}
+
+.tabs #MSearchBox span.right {
+ top: calc(calc(var(--searchbar-height) / 2) - 12px);
+}
+
+@keyframes slideInSearchResults {
+ from {
+ opacity: 0;
+ transform: translate(0, 15px);
+ }
+
+ to {
+ opacity: 1;
+ transform: translate(0, 20px);
+ }
+}
+
+#MSearchResultsWindow {
+ left: auto !important;
+ right: var(--spacing-medium);
+ border-radius: var(--border-radius-large);
+ border: 1px solid var(--separator-color);
+ transform: translate(0, 20px);
+ box-shadow: var(--box-shadow);
+ animation: ease-out 280ms slideInSearchResults;
+ background: var(--page-background-color);
+}
+
+iframe#MSearchResults {
+ margin: 4px;
+}
+
+iframe {
+ color-scheme: normal;
+}
+
+@media (prefers-color-scheme: dark) {
+ html:not(.light-mode) iframe#MSearchResults {
+ filter: invert() hue-rotate(180deg);
+ }
+}
+
+html.dark-mode iframe#MSearchResults {
+ filter: invert() hue-rotate(180deg);
+}
+
+#MSearchSelectWindow {
+ border: 1px solid var(--separator-color);
+ border-radius: var(--border-radius-medium);
+ box-shadow: var(--box-shadow);
+ background: var(--page-background-color);
+ padding-top: var(--spacing-small);
+ padding-bottom: var(--spacing-small);
+}
+
+#MSearchSelectWindow a.SelectItem {
+ font-size: var(--navigation-font-size);
+ line-height: var(--content-line-height);
+ margin: 0 var(--spacing-small);
+ border-radius: var(--border-radius-small);
+ color: var(--page-foreground-color) !important;
+ font-weight: normal;
+}
+
+#MSearchSelectWindow a.SelectItem:hover {
+ background: var(--menu-focus-background);
+ color: var(--menu-focus-foreground) !important;
+}
+
+@media screen and (max-width: 767px) {
+ #MSearchBox {
+ margin-top: var(--spacing-medium);
+ margin-bottom: var(--spacing-medium);
+ width: calc(100vw - 30px);
+ }
+
+ #main-menu > li:last-child {
+ float: none !important;
+ }
+
+ #MSearchField {
+ width: calc(100vw - 110px);
+ }
+
+ @keyframes slideInSearchResultsMobile {
+ from {
+ opacity: 0;
+ transform: translate(0, 15px);
+ }
+
+ to {
+ opacity: 1;
+ transform: translate(0, 20px);
+ }
+ }
+
+ #MSearchResultsWindow {
+ left: var(--spacing-medium) !important;
+ right: var(--spacing-medium);
+ overflow: auto;
+ transform: translate(0, 20px);
+ animation: ease-out 280ms slideInSearchResultsMobile;
+ }
+
+ /*
+ * Overwrites for fixing the searchbox on mobile in doxygen 1.9.2
+ */
+ label.main-menu-btn ~ #searchBoxPos1 {
+ top: 3px !important;
+ right: 6px !important;
+ left: 45px;
+ display: flex;
+ }
+
+ label.main-menu-btn ~ #searchBoxPos1 > #MSearchBox {
+ margin-top: 0;
+ margin-bottom: 0;
+ flex-grow: 2;
+ float: left;
+ }
+}
+
+/*
+ Tree view
+ */
+
+#side-nav {
+ padding: 0 !important;
+ background: var(--side-nav-background);
+}
+
+@media screen and (max-width: 767px) {
+ #side-nav {
+ display: none;
+ }
+
+ #doc-content {
+ margin-left: 0 !important;
+ }
+}
+
+#nav-tree {
+ background: transparent;
+}
+
+#nav-tree .label {
+ font-size: var(--navigation-font-size);
+}
+
+#nav-tree .item {
+ height: var(--tree-item-height);
+ line-height: var(--tree-item-height);
+}
+
+#nav-sync {
+ bottom: 12px;
+ right: 12px;
+ top: auto !important;
+ user-select: none;
+}
+
+#nav-tree .selected {
+ text-shadow: none;
+ background-image: none;
+ background-color: transparent;
+ position: relative;
+}
+
+#nav-tree .selected::after {
+ content: "";
+ position: absolute;
+ top: 1px;
+ bottom: 1px;
+ left: 0;
+ width: 4px;
+ border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0;
+ background: var(--primary-color);
+}
+
+
+#nav-tree a {
+ color: var(--side-nav-foreground) !important;
+ font-weight: normal;
+}
+
+#nav-tree a:focus {
+ outline-style: auto;
+}
+
+#nav-tree .arrow {
+ opacity: var(--side-nav-arrow-opacity);
+}
+
+.arrow {
+ color: inherit;
+ cursor: pointer;
+ font-size: 45%;
+ vertical-align: middle;
+ margin-right: 2px;
+ font-family: serif;
+ height: auto;
+ text-align: right;
+}
+
+#nav-tree div.item:hover .arrow, #nav-tree a:focus .arrow {
+ opacity: var(--side-nav-arrow-hover-opacity);
+}
+
+#nav-tree .selected a {
+ color: var(--primary-color) !important;
+ font-weight: bolder;
+ font-weight: 600;
+}
+
+.ui-resizable-e {
+ background: var(--separator-color);
+ width: 1px;
+}
+
+/*
+ Contents
+ */
+
+div.header {
+ border-bottom: 1px solid var(--separator-color);
+ background-color: var(--page-background-color);
+ background-image: none;
+}
+
+div.contents, div.header .title, div.header .summary {
+ max-width: var(--content-maxwidth);
+}
+
+div.contents, div.header .title {
+ line-height: initial;
+ margin: calc(var(--spacing-medium) + .2em) auto var(--spacing-medium) auto;
+}
+
+div.header .summary {
+ margin: var(--spacing-medium) auto 0 auto;
+}
+
+div.headertitle {
+ padding: 0;
+}
+
+div.header .title {
+ font-weight: 600;
+ font-size: 210%;
+ padding: var(--spacing-medium) var(--spacing-large);
+ word-break: break-word;
+}
+
+div.header .summary {
+ width: auto;
+ display: block;
+ float: none;
+ padding: 0 var(--spacing-large);
+}
+
+td.memSeparator {
+ border-color: var(--separator-color);
+}
+
+span.mlabel {
+ background: var(--primary-color);
+ border: none;
+ padding: 4px 9px;
+ border-radius: 12px;
+ margin-right: var(--spacing-medium);
+}
+
+span.mlabel:last-of-type {
+ margin-right: 2px;
+}
+
+div.contents {
+ padding: 0 var(--spacing-large);
+}
+
+div.contents p, div.contents li {
+ line-height: var(--content-line-height);
+}
+
+div.contents div.dyncontent {
+ margin: var(--spacing-medium) 0;
+}
+
+@media (prefers-color-scheme: dark) {
+ html:not(.light-mode) div.contents div.dyncontent img,
+ html:not(.light-mode) div.contents center img,
+ html:not(.light-mode) div.contents table img,
+ html:not(.light-mode) div.contents div.dyncontent iframe,
+ html:not(.light-mode) div.contents center iframe,
+ html:not(.light-mode) div.contents table iframe {
+ filter: hue-rotate(180deg) invert();
+ }
+}
+
+html.dark-mode div.contents div.dyncontent img,
+html.dark-mode div.contents center img,
+html.dark-mode div.contents table img,
+html.dark-mode div.contents div.dyncontent iframe,
+html.dark-mode div.contents center iframe,
+html.dark-mode div.contents table iframe {
+ filter: hue-rotate(180deg) invert();
+}
+
+h2.groupheader {
+ border-bottom: 0px;
+ color: var(--page-foreground-color);
+ box-shadow:
+ 100px 0 var(--page-background-color),
+ -100px 0 var(--page-background-color),
+ 100px 0.75px var(--separator-color),
+ -100px 0.75px var(--separator-color),
+ 500px 0 var(--page-background-color),
+ -500px 0 var(--page-background-color),
+ 500px 0.75px var(--separator-color),
+ -500px 0.75px var(--separator-color),
+ 1500px 0 var(--page-background-color),
+ -1500px 0 var(--page-background-color),
+ 1500px 0.75px var(--separator-color),
+ -1500px 0.75px var(--separator-color),
+ 2000px 0 var(--page-background-color),
+ -2000px 0 var(--page-background-color),
+ 2000px 0.75px var(--separator-color),
+ -2000px 0.75px var(--separator-color);
+}
+
+blockquote {
+ margin: 0 var(--spacing-medium) 0 var(--spacing-medium);
+ padding: var(--spacing-small) var(--spacing-large);
+ background: var(--blockquote-background);
+ color: var(--blockquote-foreground);
+ border-left: 0;
+ overflow: visible;
+ border-radius: var(--border-radius-medium);
+ overflow: visible;
+ position: relative;
+}
+
+blockquote::before, blockquote::after {
+ font-weight: bold;
+ font-family: serif;
+ font-size: 360%;
+ opacity: .15;
+ position: absolute;
+}
+
+blockquote::before {
+ content: "“";
+ left: -10px;
+ top: 4px;
+}
+
+blockquote::after {
+ content: "”";
+ right: -8px;
+ bottom: -25px;
+}
+
+blockquote p {
+ margin: var(--spacing-small) 0 var(--spacing-medium) 0;
+}
+.paramname {
+ font-weight: 600;
+ color: var(--primary-dark-color);
+}
+
+.paramname > code {
+ border: 0;
+}
+
+table.params .paramname {
+ font-weight: 600;
+ font-family: var(--font-family-monospace);
+ font-size: var(--code-font-size);
+ padding-right: var(--spacing-small);
+}
+
+.glow {
+ text-shadow: 0 0 15px var(--primary-light-color) !important;
+}
+
+.alphachar a {
+ color: var(--page-foreground-color);
+}
+
+/*
+ Table of Contents
+ */
+
+div.toc {
+ z-index: 10;
+ position: relative;
+ background-color: var(--toc-background);
+ border: 1px solid var(--separator-color);
+ border-radius: var(--border-radius-medium);
+ box-shadow: var(--box-shadow);
+ padding: 0 var(--spacing-large);
+ margin: 0 0 var(--spacing-medium) var(--spacing-medium);
+}
+
+div.toc h3 {
+ color: var(--toc-foreground);
+ font-size: var(--navigation-font-size);
+ margin: var(--spacing-large) 0;
+}
+
+div.toc li {
+ font-size: var(--navigation-font-size);
+ padding: 0;
+ background: none;
+}
+
+div.toc li:before {
+ content: '↓';
+ font-weight: 800;
+ font-family: var(--font-family);
+ margin-right: var(--spacing-small);
+ color: var(--toc-foreground);
+ opacity: .4;
+}
+
+div.toc ul li.level1 {
+ margin: 0;
+}
+
+div.toc ul li.level2, div.toc ul li.level3 {
+ margin-top: 0;
+}
+
+
+@media screen and (max-width: 767px) {
+ div.toc {
+ float: none;
+ width: auto;
+ margin: 0 0 var(--spacing-medium) 0;
+ }
+}
+
+/*
+ Code & Fragments
+ */
+
+code, div.fragment, pre.fragment {
+ border-radius: var(--border-radius-small);
+ border: 1px solid var(--separator-color);
+ overflow: hidden;
+}
+
+code {
+ display: inline;
+ background: var(--code-background);
+ color: var(--code-foreground);
+ padding: 2px 6px;
+ word-break: break-word;
+}
+
+div.fragment, pre.fragment {
+ margin: var(--spacing-medium) 0;
+ padding: calc(var(--spacing-large) - (var(--spacing-large) / 6)) var(--spacing-large);
+ background: var(--fragment-background);
+ color: var(--fragment-foreground);
+ overflow-x: auto;
+}
+
+@media screen and (max-width: 767px) {
+ div.fragment, pre.fragment {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-right: 0;
+ }
+
+ .contents > div.fragment,
+ .textblock > div.fragment,
+ .textblock > pre.fragment,
+ .contents > .doxygen-awesome-fragment-wrapper > div.fragment,
+ .textblock > .doxygen-awesome-fragment-wrapper > div.fragment,
+ .textblock > .doxygen-awesome-fragment-wrapper > pre.fragment {
+ margin: var(--spacing-medium) calc(0px - var(--spacing-large));
+ border-radius: 0;
+ border-left: 0;
+ }
+
+ .textblock li > .fragment,
+ .textblock li > .doxygen-awesome-fragment-wrapper > .fragment {
+ margin: var(--spacing-medium) calc(0px - var(--spacing-large));
+ }
+
+ .memdoc li > .fragment,
+ .memdoc li > .doxygen-awesome-fragment-wrapper > .fragment {
+ margin: var(--spacing-medium) calc(0px - var(--spacing-medium));
+ }
+
+ .textblock ul, .memdoc ul {
+ overflow: initial;
+ }
+
+ .memdoc > div.fragment,
+ .memdoc > pre.fragment,
+ dl dd > div.fragment,
+ dl dd pre.fragment,
+ .memdoc > .doxygen-awesome-fragment-wrapper > div.fragment,
+ .memdoc > .doxygen-awesome-fragment-wrapper > pre.fragment,
+ dl dd > .doxygen-awesome-fragment-wrapper > div.fragment,
+ dl dd .doxygen-awesome-fragment-wrapper > pre.fragment {
+ margin: var(--spacing-medium) calc(0px - var(--spacing-medium));
+ border-radius: 0;
+ border-left: 0;
+ }
+}
+
+code, code a, pre.fragment, div.fragment, div.fragment .line, div.fragment span, div.fragment .line a, div.fragment .line span {
+ font-family: var(--font-family-monospace);
+ font-size: var(--code-font-size) !important;
+}
+
+div.line:after {
+ margin-right: var(--spacing-medium);
+}
+
+div.fragment .line, pre.fragment {
+ white-space: pre;
+ word-wrap: initial;
+ line-height: var(--fragment-lineheight);
+}
+
+div.fragment span.keyword {
+ color: var(--fragment-keyword);
+}
+
+div.fragment span.keywordtype {
+ color: var(--fragment-keywordtype);
+}
+
+div.fragment span.keywordflow {
+ color: var(--fragment-keywordflow);
+}
+
+div.fragment span.stringliteral {
+ color: var(--fragment-token)
+}
+
+div.fragment span.comment {
+ color: var(--fragment-comment);
+}
+
+div.fragment a.code {
+ color: var(--fragment-link) !important;
+}
+
+div.fragment span.preprocessor {
+ color: var(--fragment-preprocessor);
+}
+
+div.fragment span.lineno {
+ display: inline-block;
+ width: 27px;
+ border-right: none;
+ background: var(--fragment-linenumber-background);
+ color: var(--fragment-linenumber-color);
+}
+
+div.fragment span.lineno a {
+ background: none;
+ color: var(--fragment-link) !important;
+}
+
+div.fragment .line:first-child .lineno {
+ box-shadow: -999999px 0px 0 999999px var(--fragment-linenumber-background), -999998px 0px 0 999999px var(--fragment-linenumber-border);
+}
+
+/*
+ dl warning, attention, note, deprecated, bug, ...
+ */
+
+dl.bug dt a, dl.deprecated dt a, dl.todo dt a {
+ font-weight: bold !important;
+}
+
+dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, dl.invariant, dl.pre, dl.todo, dl.remark {
+ padding: var(--spacing-medium);
+ margin: var(--spacing-medium) 0;
+ color: var(--page-background-color);
+ overflow: hidden;
+ margin-left: 0;
+ border-radius: var(--border-radius-small);
+}
+
+dl.section dd {
+ margin-bottom: 2px;
+}
+
+dl.warning, dl.attention {
+ background: var(--warning-color);
+ border-left: 8px solid var(--warning-color-dark);
+ color: var(--warning-color-darker);
+}
+
+dl.warning dt, dl.attention dt {
+ color: var(--warning-color-dark);
+}
+
+dl.note, dl.remark {
+ background: var(--note-color);
+ border-left: 8px solid var(--note-color-dark);
+ color: var(--note-color-darker);
+}
+
+dl.note dt, dl.remark dt {
+ color: var(--note-color-dark);
+}
+
+dl.todo {
+ background: var(--todo-color);
+ border-left: 8px solid var(--todo-color-dark);
+ color: var(--todo-color-darker);
+}
+
+dl.todo dt {
+ color: var(--todo-color-dark);
+}
+
+dl.bug dt a {
+ color: var(--todo-color-dark) !important;
+}
+
+dl.bug {
+ background: var(--bug-color);
+ border-left: 8px solid var(--bug-color-dark);
+ color: var(--bug-color-darker);
+}
+
+dl.bug dt a {
+ color: var(--bug-color-dark) !important;
+}
+
+dl.deprecated {
+ background: var(--deprecated-color);
+ border-left: 8px solid var(--deprecated-color-dark);
+ color: var(--deprecated-color-darker);
+}
+
+dl.deprecated dt a {
+ color: var(--deprecated-color-dark) !important;
+}
+
+dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd {
+ margin-inline-start: 0px;
+}
+
+dl.invariant, dl.pre {
+ background: var(--invariant-color);
+ border-left: 8px solid var(--invariant-color-dark);
+ color: var(--invariant-color-darker);
+}
+
+dl.invariant dt, dl.pre dt {
+ color: var(--invariant-color-dark);
+}
+
+/*
+ memitem
+ */
+
+div.memdoc, div.memproto, h2.memtitle {
+ box-shadow: none;
+ background-image: none;
+ border: none;
+}
+
+div.memdoc {
+ padding: 0 var(--spacing-medium);
+ background: var(--page-background-color);
+}
+
+h2.memtitle, div.memitem {
+ border: 1px solid var(--separator-color);
+ box-shadow: var(--box-shadow);
+}
+
+h2.memtitle {
+ box-shadow: 0px var(--spacing-medium) 0 -1px var(--fragment-background), var(--box-shadow);
+}
+
+div.memitem {
+ transition: none;
+}
+
+div.memproto, h2.memtitle {
+ background: var(--fragment-background);
+ text-shadow: none;
+}
+
+h2.memtitle {
+ font-weight: 500;
+ font-size: var(--memtitle-font-size);
+ font-family: var(--font-family-monospace);
+ border-bottom: none;
+ border-top-left-radius: var(--border-radius-medium);
+ border-top-right-radius: var(--border-radius-medium);
+ word-break: break-all;
+ position: relative;
+}
+
+h2.memtitle:after {
+ content: "";
+ display: block;
+ background: var(--fragment-background);
+ height: var(--spacing-medium);
+ bottom: calc(0px - var(--spacing-medium));
+ left: 0;
+ right: -14px;
+ position: absolute;
+ border-top-right-radius: var(--border-radius-medium);
+}
+
+h2.memtitle > span.permalink {
+ font-size: inherit;
+}
+
+h2.memtitle > span.permalink > a {
+ text-decoration: none;
+ padding-left: 3px;
+ margin-right: -4px;
+ user-select: none;
+ display: inline-block;
+ margin-top: -6px;
+}
+
+h2.memtitle > span.permalink > a:hover {
+ color: var(--primary-dark-color) !important;
+}
+
+a:target + h2.memtitle, a:target + h2.memtitle + div.memitem {
+ border-color: var(--primary-light-color);
+}
+
+div.memitem {
+ border-top-right-radius: var(--border-radius-medium);
+ border-bottom-right-radius: var(--border-radius-medium);
+ border-bottom-left-radius: var(--border-radius-medium);
+ overflow: hidden;
+ display: block !important;
+}
+
+div.memdoc {
+ border-radius: 0;
+}
+
+div.memproto {
+ border-radius: 0 var(--border-radius-small) 0 0;
+ overflow: auto;
+ border-bottom: 1px solid var(--separator-color);
+ padding: var(--spacing-medium);
+ margin-bottom: -1px;
+}
+
+div.memtitle {
+ border-top-right-radius: var(--border-radius-medium);
+ border-top-left-radius: var(--border-radius-medium);
+}
+
+div.memproto table.memname {
+ font-family: var(--font-family-monospace);
+ color: var(--page-foreground-color);
+ font-size: var(--memname-font-size);
+}
+
+div.memproto div.memtemplate {
+ font-family: var(--font-family-monospace);
+ color: var(--primary-dark-color);
+ font-size: var(--memname-font-size);
+ margin-left: 2px;
+}
+
+table.mlabels, table.mlabels > tbody {
+ display: block;
+}
+
+td.mlabels-left {
+ width: auto;
+}
+
+td.mlabels-right {
+ margin-top: 3px;
+ position: sticky;
+ left: 0;
+}
+
+table.mlabels > tbody > tr:first-child {
+ display: flex;
+ justify-content: space-between;
+ flex-wrap: wrap;
+}
+
+.memname, .memitem span.mlabels {
+ margin: 0
+}
+
+/*
+ reflist
+ */
+
+dl.reflist {
+ box-shadow: var(--box-shadow);
+ border-radius: var(--border-radius-medium);
+ border: 1px solid var(--separator-color);
+ overflow: hidden;
+ padding: 0;
+}
+
+
+dl.reflist dt, dl.reflist dd {
+ box-shadow: none;
+ text-shadow: none;
+ background-image: none;
+ border: none;
+ padding: 12px;
+}
+
+
+dl.reflist dt {
+ font-weight: 500;
+ border-radius: 0;
+ background: var(--code-background);
+ border-bottom: 1px solid var(--separator-color);
+ color: var(--page-foreground-color)
+}
+
+
+dl.reflist dd {
+ background: none;
+}
+
+/*
+ Table
+ */
+
+.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) {
+ display: inline-block;
+ max-width: 100%;
+ }
+
+.contents > table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname):not(.classindex) {
+ margin-left: calc(0px - var(--spacing-large));
+ margin-right: calc(0px - var(--spacing-large));
+ max-width: calc(100% + 2 * var(--spacing-large));
+}
+
+table.markdownTable, table.fieldtable {
+ border: none;
+ margin: var(--spacing-medium) 0;
+ box-shadow: 0 0 0 1px var(--separator-color);
+ border-radius: var(--border-radius-small);
+}
+
+table.fieldtable {
+ width: 100%;
+}
+
+th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone {
+ background: var(--tablehead-background);
+ color: var(--tablehead-foreground);
+ font-weight: 600;
+ font-size: var(--page-font-size);
+}
+
+th.markdownTableHeadLeft:first-child, th.markdownTableHeadRight:first-child, th.markdownTableHeadCenter:first-child, th.markdownTableHeadNone:first-child {
+ border-top-left-radius: var(--border-radius-small);
+}
+
+th.markdownTableHeadLeft:last-child, th.markdownTableHeadRight:last-child, th.markdownTableHeadCenter:last-child, th.markdownTableHeadNone:last-child {
+ border-top-right-radius: var(--border-radius-small);
+}
+
+table.markdownTable td, table.markdownTable th, table.fieldtable dt {
+ border: none;
+ border-right: 1px solid var(--separator-color);
+ padding: var(--spacing-small) var(--spacing-medium);
+}
+
+table.markdownTable td:last-child, table.markdownTable th:last-child, table.fieldtable dt:last-child {
+ border: none;
+}
+
+table.markdownTable tr, table.markdownTable tr {
+ border-bottom: 1px solid var(--separator-color);
+}
+
+table.markdownTable tr:last-child, table.markdownTable tr:last-child {
+ border-bottom: none;
+}
+
+table.fieldtable th {
+ font-size: var(--page-font-size);
+ font-weight: 600;
+ background-image: none;
+ background-color: var(--tablehead-background);
+ color: var(--tablehead-foreground);
+ border-bottom: 1px solid var(--separator-color);
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+ border-bottom: 1px solid var(--separator-color);
+ border-right: 1px solid var(--separator-color);
+}
+
+.fieldtable td.fielddoc {
+ border-bottom: 1px solid var(--separator-color);
+}
+
+.memberdecls td.glow, .fieldtable tr.glow {
+ background-color: var(--primary-light-color);
+ box-shadow: 0 0 15px var(--primary-light-color);
+}
+
+table.memberdecls {
+ display: block;
+}
+
+table.memberdecls tr[class^='memitem'] {
+ font-family: var(--font-family-monospace);
+ font-size: var(--code-font-size);
+}
+
+table.memberdecls tr[class^='memitem'] .memTemplParams {
+ font-family: var(--font-family-monospace);
+ font-size: var(--code-font-size);
+ color: var(--primary-dark-color);
+}
+
+table.memberdecls .memItemLeft,
+table.memberdecls .memItemRight,
+table.memberdecls .memTemplItemLeft,
+table.memberdecls .memTemplItemRight,
+table.memberdecls .memTemplParams {
+ transition: none;
+ padding-top: var(--spacing-small);
+ padding-bottom: var(--spacing-small);
+ border-top: 1px solid var(--separator-color);
+ border-bottom: 1px solid var(--separator-color);
+ background-color: var(--fragment-background);
+}
+
+table.memberdecls .memTemplItemLeft,
+table.memberdecls .memTemplItemRight {
+ padding-top: 2px;
+}
+
+table.memberdecls .memTemplParams {
+ border-bottom: 0;
+ border-left: 1px solid var(--separator-color);
+ border-right: 1px solid var(--separator-color);
+ border-radius: var(--border-radius-small) var(--border-radius-small) 0 0;
+ padding-bottom: 0;
+}
+
+table.memberdecls .memTemplItemLeft {
+ border-radius: 0 0 0 var(--border-radius-small);
+ border-left: 1px solid var(--separator-color);
+ border-top: 0;
+}
+
+table.memberdecls .memTemplItemRight {
+ border-radius: 0 0 var(--border-radius-small) 0;
+ border-right: 1px solid var(--separator-color);
+ border-top: 0;
+}
+
+table.memberdecls .memItemLeft {
+ border-radius: var(--border-radius-small) 0 0 var(--border-radius-small);
+ border-left: 1px solid var(--separator-color);
+ padding-left: var(--spacing-medium);
+ padding-right: 0;
+}
+
+table.memberdecls .memItemRight {
+ border-radius: 0 var(--border-radius-small) var(--border-radius-small) 0;
+ border-right: 1px solid var(--separator-color);
+ padding-right: var(--spacing-medium);
+ padding-left: 0;
+
+}
+
+table.memberdecls .mdescLeft, table.memberdecls .mdescRight {
+ background: none;
+ color: var(--page-foreground-color);
+ padding: var(--spacing-small) 0;
+}
+
+table.memberdecls .memSeparator {
+ background: var(--page-background-color);
+ height: var(--spacing-large);
+ border: 0;
+ transition: none;
+}
+
+table.memberdecls .groupheader {
+ margin-bottom: var(--spacing-large);
+}
+
+table.memberdecls .inherit_header td {
+ padding: 0 0 var(--spacing-medium) 0;
+ text-indent: -12px;
+ line-height: 1.5em;
+ color: var(--page-secondary-foreground-color);
+}
+
+@media screen and (max-width: 767px) {
+
+ table.memberdecls .memItemLeft,
+ table.memberdecls .memItemRight,
+ table.memberdecls .mdescLeft,
+ table.memberdecls .mdescRight,
+ table.memberdecls .memTemplItemLeft,
+ table.memberdecls .memTemplItemRight,
+ table.memberdecls .memTemplParams {
+ display: block;
+ text-align: left;
+ padding-left: var(--spacing-large);
+ margin: 0 calc(0px - var(--spacing-large)) 0 calc(0px - var(--spacing-large));
+ border-right: none;
+ border-left: none;
+ border-radius: 0;
+ }
+
+ table.memberdecls .memItemLeft,
+ table.memberdecls .mdescLeft,
+ table.memberdecls .memTemplItemLeft {
+ border-bottom: 0;
+ padding-bottom: 0;
+ }
+
+ table.memberdecls .memTemplItemLeft {
+ padding-top: 0;
+ }
+
+ table.memberdecls .mdescLeft {
+ margin-top: calc(0px - var(--page-font-size));
+ }
+
+ table.memberdecls .memItemRight,
+ table.memberdecls .mdescRight,
+ table.memberdecls .memTemplItemRight {
+ border-top: 0;
+ padding-top: 0;
+ padding-right: var(--spacing-large);
+ overflow-x: auto;
+ }
+
+ table.memberdecls tr[class^='memitem']:not(.inherit) {
+ display: block;
+ width: calc(100vw - 2 * var(--spacing-large));
+ }
+
+ table.memberdecls .mdescRight {
+ color: var(--page-foreground-color);
+ }
+
+ table.memberdecls tr.inherit {
+ visibility: hidden;
+ }
+
+ table.memberdecls tr[style="display: table-row;"] {
+ display: block !important;
+ visibility: visible;
+ width: calc(100vw - 2 * var(--spacing-large));
+ animation: fade .5s;
+ }
+
+ @keyframes fade {
+ 0% {
+ opacity: 0;
+ max-height: 0;
+ }
+
+ 100% {
+ opacity: 1;
+ max-height: 200px;
+ }
+ }
+}
+
+
+/*
+ Horizontal Rule
+ */
+
+hr {
+ margin-top: var(--spacing-large);
+ margin-bottom: var(--spacing-large);
+ height: 1px;
+ background-color: var(--separator-color);
+ border: 0;
+}
+
+.contents hr {
+ box-shadow: 100px 0 0 var(--separator-color),
+ -100px 0 0 var(--separator-color),
+ 500px 0 0 var(--separator-color),
+ -500px 0 0 var(--separator-color),
+ 1500px 0 0 var(--separator-color),
+ -1500px 0 0 var(--separator-color),
+ 2000px 0 0 var(--separator-color),
+ -2000px 0 0 var(--separator-color);
+}
+
+.contents img, .contents .center, .contents center, .contents div.image object {
+ max-width: 100%;
+ overflow: auto;
+}
+
+@media screen and (max-width: 767px) {
+ .contents .dyncontent > .center, .contents > center {
+ margin-left: calc(0px - var(--spacing-large));
+ margin-right: calc(0px - var(--spacing-large));
+ max-width: calc(100% + 2 * var(--spacing-large));
+ }
+}
+
+/*
+ Directories
+ */
+div.directory {
+ border-top: 1px solid var(--separator-color);
+ border-bottom: 1px solid var(--separator-color);
+ width: auto;
+}
+
+table.directory {
+ font-family: var(--font-family);
+ font-size: var(--page-font-size);
+ font-weight: normal;
+ width: 100%;
+}
+
+table.directory td.entry {
+ padding: var(--spacing-small);
+}
+
+table.directory td.desc {
+ min-width: 250px;
+}
+
+table.directory tr.even {
+ background-color: var(--odd-color);
+}
+
+.icona {
+ width: auto;
+ height: auto;
+ margin: 0 var(--spacing-small);
+}
+
+.icon {
+ background: var(--primary-color);
+ width: 18px;
+ height: 18px;
+ line-height: 18px;
+}
+
+.iconfopen, .icondoc, .iconfclosed {
+ background-position: center;
+ margin-bottom: 0;
+}
+
+.icondoc {
+ filter: saturate(0.2);
+}
+
+@media screen and (max-width: 767px) {
+ div.directory {
+ margin-left: calc(0px - var(--spacing-large));
+ margin-right: calc(0px - var(--spacing-large));
+ }
+}
+
+@media (prefers-color-scheme: dark) {
+ html:not(.light-mode) .iconfopen, html:not(.light-mode) .iconfclosed {
+ filter: hue-rotate(180deg) invert();
+ }
+}
+
+html.dark-mode .iconfopen, html.dark-mode .iconfclosed {
+ filter: hue-rotate(180deg) invert();
+}
+
+/*
+ Class list
+ */
+
+.classindex dl.odd {
+ background: var(--odd-color);
+ border-radius: var(--border-radius-small);
+}
+
+/*
+ Class Index Doxygen 1.8
+*/
+
+table.classindex {
+ margin-left: 0;
+ margin-right: 0;
+ width: 100%;
+}
+
+table.classindex table div.ah {
+ background-image: none;
+ background-color: initial;
+ border-color: var(--separator-color);
+ color: var(--page-foreground-color);
+ box-shadow: var(--box-shadow);
+ border-radius: var(--border-radius-large);
+ padding: var(--spacing-small);
+}
+
+div.qindex {
+ background-color: var(--odd-color);
+ border-radius: var(--border-radius-small);
+ border: 1px solid var(--separator-color);
+ padding: var(--spacing-small) 0;
+}
+
+/*
+ Footer and nav-path
+ */
+
+#nav-path {
+ width: 100%;
+}
+
+#nav-path ul {
+ background-image: none;
+ background: var(--page-background-color);
+ border: none;
+ border-top: 1px solid var(--separator-color);
+ border-bottom: 1px solid var(--separator-color);
+ border-bottom: 0;
+ box-shadow: 0 0.75px 0 var(--separator-color);
+ font-size: var(--navigation-font-size);
+}
+
+img.footer {
+ width: 60px;
+}
+
+.navpath li.footer {
+ color: var(--page-secondary-foreground-color);
+}
+
+address.footer {
+ color: var(--page-secondary-foreground-color);
+ margin-bottom: var(--spacing-large);
+}
+
+#nav-path li.navelem {
+ background-image: none;
+ display: flex;
+ align-items: center;
+}
+
+.navpath li.navelem a {
+ text-shadow: none;
+ display: inline-block;
+ color: var(--primary-color) !important;
+}
+
+.navpath li.navelem b {
+ color: var(--primary-dark-color);
+ font-weight: 500;
+}
+
+li.navelem {
+ padding: 0;
+ margin-left: -8px;
+}
+
+li.navelem:first-child {
+ margin-left: var(--spacing-large);
+}
+
+li.navelem:first-child:before {
+ display: none;
+}
+
+#nav-path li.navelem:after {
+ content: '';
+ border: 5px solid var(--page-background-color);
+ border-bottom-color: transparent;
+ border-right-color: transparent;
+ border-top-color: transparent;
+ transform: translateY(-1px) scaleY(4.2);
+ z-index: 10;
+ margin-left: 6px;
+}
+
+#nav-path li.navelem:before {
+ content: '';
+ border: 5px solid var(--separator-color);
+ border-bottom-color: transparent;
+ border-right-color: transparent;
+ border-top-color: transparent;
+ transform: translateY(-1px) scaleY(3.2);
+ margin-right: var(--spacing-small);
+}
+
+.navpath li.navelem a:hover {
+ color: var(--primary-color);
+}
+
+/*
+ Scrollbars for Webkit
+*/
+
+#nav-tree::-webkit-scrollbar,
+div.fragment::-webkit-scrollbar,
+pre.fragment::-webkit-scrollbar,
+div.memproto::-webkit-scrollbar,
+.contents center::-webkit-scrollbar,
+.contents .center::-webkit-scrollbar,
+.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname)::-webkit-scrollbar {
+ width: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding));
+ height: calc(var(--webkit-scrollbar-size) + var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding));
+}
+
+#nav-tree::-webkit-scrollbar-thumb,
+div.fragment::-webkit-scrollbar-thumb,
+pre.fragment::-webkit-scrollbar-thumb,
+div.memproto::-webkit-scrollbar-thumb,
+.contents center::-webkit-scrollbar-thumb,
+.contents .center::-webkit-scrollbar-thumb,
+.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname)::-webkit-scrollbar-thumb {
+ background-color: transparent;
+ border: var(--webkit-scrollbar-padding) solid transparent;
+ border-radius: calc(var(--webkit-scrollbar-padding) + var(--webkit-scrollbar-padding));
+ background-clip: padding-box;
+}
+
+#nav-tree:hover::-webkit-scrollbar-thumb,
+div.fragment:hover::-webkit-scrollbar-thumb,
+pre.fragment:hover::-webkit-scrollbar-thumb,
+div.memproto:hover::-webkit-scrollbar-thumb,
+.contents center:hover::-webkit-scrollbar-thumb,
+.contents .center:hover::-webkit-scrollbar-thumb,
+.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname):hover::-webkit-scrollbar-thumb {
+ background-color: var(--webkit-scrollbar-color);
+}
+
+#nav-tree::-webkit-scrollbar-track,
+div.fragment::-webkit-scrollbar-track,
+pre.fragment::-webkit-scrollbar-track,
+div.memproto::-webkit-scrollbar-track,
+.contents center::-webkit-scrollbar-track,
+.contents .center::-webkit-scrollbar-track,
+.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname)::-webkit-scrollbar-track {
+ background: transparent;
+}
+
+#nav-tree::-webkit-scrollbar-corner {
+ background-color: var(--side-nav-background);
+}
+
+#nav-tree,
+div.fragment,
+pre.fragment,
+div.memproto,
+.contents center,
+.contents .center,
+.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) {
+ overflow-x: auto;
+ overflow-x: overlay;
+}
+
+#nav-tree {
+ overflow-x: auto;
+ overflow-y: auto;
+ overflow-y: overlay;
+}
+
+/*
+ Scrollbars for Firefox
+*/
+
+#nav-tree,
+div.fragment,
+pre.fragment,
+div.memproto,
+.contents center,
+.contents .center,
+.contents table:not(.memberdecls):not(.mlabels):not(.fieldtable):not(.memname) {
+ scrollbar-width: thin;
+}
+
+/*
+ Optional Dark mode toggle button
+*/
+
+doxygen-awesome-dark-mode-toggle {
+ display: inline-block;
+ margin: 0 0 0 var(--spacing-small);
+ padding: 0;
+ width: var(--searchbar-height);
+ height: var(--searchbar-height);
+ background: none;
+ border: none;
+ border-radius: var(--searchbar-height);
+ vertical-align: middle;
+ text-align: center;
+ line-height: var(--searchbar-height);
+ font-size: 22px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ user-select: none;
+ cursor: pointer;
+}
+
+doxygen-awesome-dark-mode-toggle > svg {
+ transition: transform .1s ease-in-out;
+}
+
+doxygen-awesome-dark-mode-toggle:active > svg {
+ transform: scale(.5);
+}
+
+doxygen-awesome-dark-mode-toggle:hover {
+ background-color: rgba(0,0,0,.03);
+}
+
+html.dark-mode doxygen-awesome-dark-mode-toggle:hover {
+ background-color: rgba(0,0,0,.18);
+}
+
+/*
+ Optional fragment copy button
+*/
+.doxygen-awesome-fragment-wrapper {
+ position: relative;
+}
+
+doxygen-awesome-fragment-copy-button {
+ opacity: 0;
+ background: var(--fragment-background);
+ width: 28px;
+ height: 28px;
+ position: absolute;
+ right: calc(var(--spacing-large) - (var(--spacing-large) / 2.5));
+ top: calc(var(--spacing-large) - (var(--spacing-large) / 2.5));
+ border: 1px solid var(--fragment-foreground);
+ cursor: pointer;
+ border-radius: var(--border-radius-small);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.doxygen-awesome-fragment-wrapper:hover doxygen-awesome-fragment-copy-button, doxygen-awesome-fragment-copy-button.success {
+ opacity: .28;
+}
+
+doxygen-awesome-fragment-copy-button:hover, doxygen-awesome-fragment-copy-button.success {
+ opacity: 1 !important;
+}
+
+doxygen-awesome-fragment-copy-button:active:not([class~=success]) svg {
+ transform: scale(.91);
+}
+
+doxygen-awesome-fragment-copy-button svg {
+ fill: var(--fragment-foreground);
+ width: 18px;
+ height: 18px;
+}
+
+doxygen-awesome-fragment-copy-button.success svg {
+ fill: rgb(14, 168, 14);
+}
+
+doxygen-awesome-fragment-copy-button.success {
+ border-color: rgb(14, 168, 14);
+}
+
+@media screen and (max-width: 767px) {
+ .textblock > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button,
+ .textblock li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button,
+ .memdoc li > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button,
+ .memdoc > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button,
+ dl dd > .doxygen-awesome-fragment-wrapper > doxygen-awesome-fragment-copy-button {
+ right: 0;
+ }
+}
+
+/*
+ Optional paragraph link button
+*/
+
+a.anchorlink {
+ font-size: 90%;
+ margin-left: var(--spacing-small);
+ color: var(--page-foreground-color) !important;
+ text-decoration: none;
+ opacity: .15;
+ display: none;
+ transition: opacity .1s ease-in-out, color .1s ease-in-out;
+}
+
+a.anchorlink svg {
+ fill: var(--page-foreground-color);
+}
+
+h3 a.anchorlink svg, h4 a.anchorlink svg {
+ margin-bottom: -3px;
+ margin-top: -4px;
+}
+
+a.anchorlink:hover {
+ opacity: .45;
+}
+
+h2:hover a.anchorlink, h1:hover a.anchorlink, h3:hover a.anchorlink, h4:hover a.anchorlink {
+ display: inline-block;
+}
diff --git a/api-docs/cppdocs/header.html b/api-docs/cppdocs/header.html
index f78cbfcc..7d2534eb 100644
--- a/api-docs/cppdocs/header.html
+++ b/api-docs/cppdocs/header.html
@@ -1,13 +1,19 @@
-<!-- HTML header for doxygen 1.8.7-->
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!-- HTML header for doxygen 1.9.4-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
-<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen $doxygenversion"/>
-<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
-<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<!--BEGIN PROJECT_NAME--><title>BinaryNinja C++ API: $title</title><!--END PROJECT_NAME-->
+<!--BEGIN !PROJECT_NAME--><title>BinaryNinja C++ API</title><!--END !PROJECT_NAME-->
<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>
+<!--BEGIN DISABLE_INDEX-->
+ <!--BEGIN FULL_SIDEBAR-->
+<script type="text/javascript">var page_layout=1;</script>
+ <!--END FULL_SIDEBAR-->
+<!--END DISABLE_INDEX-->
<script type="text/javascript" src="$relpath^jquery.js"></script>
<script type="text/javascript" src="$relpath^dynsections.js"></script>
$treeview
@@ -15,10 +21,51 @@ $search
$mathjax
<link href="$relpath^$stylesheet" rel="stylesheet" type="text/css" />
$extrastylesheet
+<script type="text/javascript" src="$relpath^doxygen-awesome-darkmode-toggle.js"></script>
+<script type="text/javascript">
+ DoxygenAwesomeDarkModeToggle.init()
+</script>
</head>
<body>
+<!--BEGIN DISABLE_INDEX-->
+ <!--BEGIN FULL_SIDEBAR-->
+<div id="side-nav" class="ui-resizable side-nav-resizable"><!-- do not remove this div, it is closed by doxygen! -->
+ <!--END FULL_SIDEBAR-->
+<!--END DISABLE_INDEX-->
+
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
-<div id="topbanner"><a href="https://github.com/Vector35/binaryninja-api"><i class="githublogo"></i></a></div>
-$searchbox
+
+<!--BEGIN TITLEAREA-->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <!--BEGIN PROJECT_LOGO-->
+ <td id="projectlogo"><img alt="Logo" src="$relpath^$projectlogo"/></td>
+ <!--END PROJECT_LOGO-->
+ <!--BEGIN PROJECT_NAME-->
+ <td id="projectalign">
+ <div id="projectname">Binary Ninja C++ API<!--BEGIN PROJECT_NUMBER--><span id="projectnumber">&#160;$projectnumber</span><!--END PROJECT_NUMBER-->
+ </div>
+ </td>
+ <!--END PROJECT_NAME-->
+ <!--BEGIN !PROJECT_NAME-->
+ <!--END !PROJECT_NAME-->
+ <!--BEGIN DISABLE_INDEX-->
+ <!--BEGIN SEARCHENGINE-->
+ <!--BEGIN !FULL_SIDEBAR-->
+ <td>$searchbox</td>
+ <!--END !FULL_SIDEBAR-->
+ <!--END SEARCHENGINE-->
+ <!--END DISABLE_INDEX-->
+ </tr>
+ <!--BEGIN SEARCHENGINE-->
+ <!--BEGIN FULL_SIDEBAR-->
+ <tr><td colspan="2">$searchbox</td></tr>
+ <!--END FULL_SIDEBAR-->
+ <!--END SEARCHENGINE-->
+ </tbody>
+</table>
+</div>
<!--END TITLEAREA-->
<!-- end header part -->
diff --git a/api-docs/cppdocs/style.css b/api-docs/cppdocs/style.css
deleted file mode 100644
index 938592f1..00000000
--- a/api-docs/cppdocs/style.css
+++ /dev/null
@@ -1,2021 +0,0 @@
-/* The standard CSS for doxygen 1.8.20 */
-a {
- color: #d73726;
-}
-
-a:visited {
- color: #6b1b13;
-}
-
-
-.highlighted {
- background: none !important;
-}
-
-a.highlighted {
- background: none !important;
-}
-
-#nav-tree {
- background: #343131;
-}
-
-#nav-tree .selected {
- background-image: none;
- background: #c9c9c9;
- color: black !important;
-}
-
-#nav-tree .selected a {
- color: black !important;
-}
-
-#nav-tree a {
- color: #d9d9d9;
-}
-
-
-.glow {
- background-color: #d73726 !important;
- box-shadow: 0 0 15px #d73726 !important;
-}
-
-body, table, div, p, dl {
- font: 400 14px/22px Roboto,sans-serif;
-}
-
-p.reference, p.definition {
- font: 400 14px/22px Roboto,sans-serif;
-}
-
-/* @group Heading Levels */
-
-h1.groupheader {
- font-size: 150%;
-}
-
-.title {
- font: 400 14px/28px Roboto,sans-serif;
- font-size: 150%;
- font-weight: bold;
- margin: 10px 2px;
-}
-
-h2.groupheader {
- border-bottom: 1px solid #8A8A8A;
- color: #343434;
- font-size: 150%;
- font-weight: normal;
- margin-top: 1.75em;
- padding-top: 8px;
- padding-bottom: 4px;
- width: 100%;
-}
-
-h3.groupheader {
- font-size: 100%;
-}
-
-h1, h2, h3, h4, h5, h6 {
- -webkit-transition: text-shadow 0.5s linear;
- -moz-transition: text-shadow 0.5s linear;
- -ms-transition: text-shadow 0.5s linear;
- -o-transition: text-shadow 0.5s linear;
- transition: text-shadow 0.5s linear;
- margin-right: 15px;
-}
-
-h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
- text-shadow: 0 0 15px cyan;
-}
-
-dt {
- font-weight: bold;
-}
-
-ul.multicol {
- -moz-column-gap: 1em;
- -webkit-column-gap: 1em;
- column-gap: 1em;
- -moz-column-count: 3;
- -webkit-column-count: 3;
- column-count: 3;
-}
-
-p.startli, p.startdd {
- margin-top: 2px;
-}
-
-th p.starttd, th p.intertd, th p.endtd {
- font-size: 100%;
- font-weight: 700;
-}
-
-p.starttd {
- margin-top: 0px;
-}
-
-p.endli {
- margin-bottom: 0px;
-}
-
-p.enddd {
- margin-bottom: 4px;
-}
-
-p.endtd {
- margin-bottom: 2px;
-}
-
-p.interli {
-}
-
-p.interdd {
-}
-
-p.intertd {
-}
-
-/* @end */
-
-caption {
- font-weight: bold;
-}
-
-span.legend {
- font-size: 70%;
- text-align: center;
-}
-
-h3.version {
- font-size: 90%;
- text-align: center;
-}
-
-div.qindex, div.navtab{
- background-color: #EAEAEA;
- border: 1px solid #A3A3A3;
- text-align: center;
-}
-
-div.qindex, div.navpath {
- width: 100%;
- line-height: 140%;
-}
-
-div.navtab {
- margin-right: 15px;
-}
-
-/* @group Link Styling */
-
-a {
- color: #d73726;
- font-weight: normal;
- text-decoration: none;
-}
-
-.contents a:visited {
- color: #d73726;
-}
-
-a:hover {
- text-decoration: underline;
-}
-
-a.qindex {
- font-weight: bold;
-}
-
-a.qindexHL {
- font-weight: bold;
- background-color: #9C9C9C;
- color: #FFFFFF;
- border: 1px double #898989;
-}
-
-.contents a.qindexHL:visited {
- color: #FFFFFF;
-}
-
-a.el {
- font-weight: bold;
-}
-
-a.elRef {
-}
-
-a.code, a.code:visited, a.line, a.line:visited {
- color: #4E4E4E;
-}
-
-a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
- color: #4E4E4E;
-}
-
-/* @end */
-
-dl.el {
- margin-left: -1cm;
-}
-
-ul {
- overflow: hidden; /*Fixed: list item bullets overlap floating elements*/
-}
-
-#side-nav ul {
- overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */
-}
-
-#main-nav ul {
- overflow: visible; /* reset ul rule for the navigation bar drop down lists */
-}
-
-.fragment {
- text-align: left;
- direction: ltr;
- overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/
- overflow-y: hidden;
-}
-
-pre.fragment {
- border: 1px solid #C3C3C3;
- background-color: #FBFBFB;
- padding: 4px 6px;
- margin: 4px 8px 4px 2px;
- overflow: auto;
- word-wrap: break-word;
- font-size: 9pt;
- line-height: 125%;
- font-family: monospace, fixed;
- font-size: 105%;
-}
-
-div.fragment {
- padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/
- margin: 4px 8px 4px 2px;
- background-color: #FBFBFB;
- border: 1px solid #C3C3C3;
-}
-
-div.line {
- font-family: monospace, fixed;
- font-size: 13px;
- min-height: 13px;
- line-height: 1.0;
- text-wrap: unrestricted;
- white-space: -moz-pre-wrap; /* Moz */
- white-space: -pre-wrap; /* Opera 4-6 */
- white-space: -o-pre-wrap; /* Opera 7 */
- white-space: pre-wrap; /* CSS3 */
- word-wrap: break-word; /* IE 5.5+ */
- text-indent: -53px;
- padding-left: 53px;
- padding-bottom: 0px;
- margin: 0px;
- -webkit-transition-property: background-color, box-shadow;
- -webkit-transition-duration: 0.5s;
- -moz-transition-property: background-color, box-shadow;
- -moz-transition-duration: 0.5s;
- -ms-transition-property: background-color, box-shadow;
- -ms-transition-duration: 0.5s;
- -o-transition-property: background-color, box-shadow;
- -o-transition-duration: 0.5s;
- transition-property: background-color, box-shadow;
- transition-duration: 0.5s;
-}
-
-div.line:after {
- content:"\000A";
- white-space: pre;
-}
-
-div.line.glow {
- background-color: cyan;
- box-shadow: 0 0 10px cyan;
-}
-
-
-span.lineno {
- padding-right: 4px;
- text-align: right;
- border-right: 2px solid #0F0;
- background-color: #E8E8E8;
- white-space: pre;
-}
-span.lineno a {
- background-color: #D8D8D8;
-}
-
-span.lineno a:hover {
- background-color: #C8C8C8;
-}
-
-.lineno {
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -khtml-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-
-div.ah, span.ah {
- background-color: black;
- font-weight: bold;
- color: #FFFFFF;
- margin-bottom: 3px;
- margin-top: 3px;
- padding: 0.2em;
- border: solid thin #333;
- border-radius: 0.5em;
- -webkit-border-radius: .5em;
- -moz-border-radius: .5em;
- box-shadow: 2px 2px 3px #999;
- -webkit-box-shadow: 2px 2px 3px #999;
- -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
-}
-
-div.classindex ul {
- list-style: none;
- padding-left: 0;
-}
-
-div.classindex span.ai {
- display: inline-block;
-}
-
-div.groupHeader {
- margin-left: 16px;
- margin-top: 12px;
- font-weight: bold;
-}
-
-div.groupText {
- margin-left: 16px;
- font-style: italic;
-}
-
-body {
- background-color: white;
- color: black;
- margin: 0;
-}
-
-div.contents {
- margin-top: 10px;
- margin-left: 12px;
- margin-right: 8px;
-}
-
-td.indexkey {
- background-color: #EAEAEA;
- font-weight: bold;
- border: 1px solid #C3C3C3;
- margin: 2px 0px 2px 0;
- padding: 2px 10px;
- white-space: nowrap;
- vertical-align: top;
-}
-
-td.indexvalue {
- background-color: #EAEAEA;
- border: 1px solid #C3C3C3;
- padding: 2px 10px;
- margin: 2px 0px;
-}
-
-tr.memlist {
- background-color: #EDEDED;
-}
-
-p.formulaDsp {
- text-align: center;
-}
-
-img.formulaDsp {
-
-}
-
-img.formulaInl, img.inline {
- vertical-align: middle;
-}
-
-div.center {
- text-align: center;
- margin-top: 0px;
- margin-bottom: 0px;
- padding: 0px;
-}
-
-div.center img {
- border: 0px;
-}
-
-address.footer {
- text-align: right;
- padding-right: 12px;
-}
-
-img.footer {
- border: 0px;
- vertical-align: middle;
-}
-
-/* @group Code Colorization */
-
-span.keyword {
- color: #008000
-}
-
-span.keywordtype {
- color: #604020
-}
-
-span.keywordflow {
- color: #e08000
-}
-
-span.comment {
- color: #800000
-}
-
-span.preprocessor {
- color: #806020
-}
-
-span.stringliteral {
- color: #002080
-}
-
-span.charliteral {
- color: #008080
-}
-
-span.vhdldigit {
- color: #ff00ff
-}
-
-span.vhdlchar {
- color: #000000
-}
-
-span.vhdlkeyword {
- color: #700070
-}
-
-span.vhdllogic {
- color: #ff0000
-}
-
-blockquote {
- background-color: #F6F6F6;
- border-left: 2px solid #9C9C9C;
- margin: 0 24px 0 4px;
- padding: 0 12px 0 16px;
-}
-
-blockquote.DocNodeRTL {
- border-left: 0;
- border-right: 2px solid #9C9C9C;
- margin: 0 4px 0 24px;
- padding: 0 16px 0 12px;
-}
-
-/* @end */
-
-/*
-.search {
- color: #003399;
- font-weight: bold;
-}
-
-form.search {
- margin-bottom: 0px;
- margin-top: 0px;
-}
-
-input.search {
- font-size: 75%;
- color: #000080;
- font-weight: normal;
- background-color: #e8eef2;
-}
-*/
-
-td.tiny {
- font-size: 75%;
-}
-
-.dirtab {
- padding: 4px;
- border-collapse: collapse;
- border: 1px solid #A3A3A3;
-}
-
-th.dirtab {
- background: #EAEAEA;
- font-weight: bold;
-}
-
-hr {
- height: 0px;
- border: none;
- border-top: 1px solid #545454;
-}
-
-hr.footer {
- height: 1px;
-}
-
-/* @group Member Descriptions */
-
-table.memberdecls {
- border-spacing: 0px;
- padding: 0px;
-}
-
-.memberdecls td, .fieldtable tr {
- -webkit-transition-property: background-color, box-shadow;
- -webkit-transition-duration: 0.5s;
- -moz-transition-property: background-color, box-shadow;
- -moz-transition-duration: 0.5s;
- -ms-transition-property: background-color, box-shadow;
- -ms-transition-duration: 0.5s;
- -o-transition-property: background-color, box-shadow;
- -o-transition-duration: 0.5s;
- transition-property: background-color, box-shadow;
- transition-duration: 0.5s;
-}
-
-.memberdecls td.glow, .fieldtable tr.glow {
- background-color: cyan;
- box-shadow: 0 0 15px cyan;
-}
-
-.mdescLeft, .mdescRight,
-.memItemLeft, .memItemRight,
-.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
- background-color: #F9F9F9;
- border: none;
- margin: 4px;
- padding: 1px 0 0 8px;
-}
-
-.mdescLeft, .mdescRight {
- padding: 0px 8px 4px 8px;
- color: #555;
-}
-
-.memSeparator {
- border-bottom: 1px solid #DCDCDC;
- line-height: 1px;
- margin: 0px;
- padding: 0px;
-}
-
-.memItemLeft, .memTemplItemLeft {
- white-space: nowrap;
-}
-
-.memItemRight, .memTemplItemRight {
- width: 100%;
-}
-
-.memTemplParams {
- color: #4E4E4E;
- white-space: nowrap;
- font-size: 80%;
-}
-
-/* @end */
-
-/* @group Member Details */
-
-/* Styles for detailed member documentation */
-
-.memtitle {
- padding: 8px;
- border-top: 1px solid #A7A7A7;
- border-left: 1px solid #A7A7A7;
- border-right: 1px solid #A7A7A7;
- border-top-right-radius: 4px;
- border-top-left-radius: 4px;
- margin-bottom: -1px;
- background-color: #DDDDDD;
- line-height: 1.25;
- font-weight: 300;
- float:left;
-}
-
-.permalink {
- font-size: 65%;
- display: inline-block;
- vertical-align: middle;
-}
-
-.memtemplate {
- font-size: 80%;
- color: #4E4E4E;
- font-weight: normal;
- margin-left: 9px;
-}
-
-.memnav {
- background-color: #EAEAEA;
- border: 1px solid #A3A3A3;
- text-align: center;
- margin: 2px;
- margin-right: 15px;
- padding: 2px;
-}
-
-.mempage {
- width: 100%;
-}
-
-.memitem {
- padding: 0;
- margin-bottom: 10px;
- margin-right: 5px;
- -webkit-transition: box-shadow 0.5s linear;
- -moz-transition: box-shadow 0.5s linear;
- -ms-transition: box-shadow 0.5s linear;
- -o-transition: box-shadow 0.5s linear;
- transition: box-shadow 0.5s linear;
- display: table !important;
- width: 100%;
-}
-
-.memitem.glow {
- box-shadow: 0 0 15px cyan;
-}
-
-.memname {
- font-weight: 400;
- margin-left: 6px;
-}
-
-.memname td {
- vertical-align: bottom;
-}
-
-.memproto, dl.reflist dt {
- border-top: 1px solid #A7A7A7;
- border-left: 1px solid #A7A7A7;
- border-right: 1px solid #A7A7A7;
- padding: 6px 0px 6px 0px;
- color: #1E1E1E;
- font-weight: bold;
- text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
- background-color: #DDDDDD;
- /* opera specific markup */
- box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
- border-top-right-radius: 4px;
- /* firefox specific markup */
- -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
- -moz-border-radius-topright: 4px;
- /* webkit specific markup */
- -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
- -webkit-border-top-right-radius: 4px;
-}
-
-.overload {
- font-family: "courier new",courier,monospace;
- font-size: 65%;
-}
-
-.memdoc, dl.reflist dd {
- border-bottom: 1px solid #A7A7A7;
- border-left: 1px solid #A7A7A7;
- border-right: 1px solid #A7A7A7;
- padding: 6px 10px 2px 10px;
- background-color: #FBFBFB;
- border-top-width: 0;
- background-color: #FFFFFF;
- /* opera specific markup */
- border-bottom-left-radius: 4px;
- border-bottom-right-radius: 4px;
- box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
- /* firefox specific markup */
- -moz-border-radius-bottomleft: 4px;
- -moz-border-radius-bottomright: 4px;
- -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
- /* webkit specific markup */
- -webkit-border-bottom-left-radius: 4px;
- -webkit-border-bottom-right-radius: 4px;
- -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
-}
-
-dl.reflist dt {
- padding: 5px;
-}
-
-dl.reflist dd {
- margin: 0px 0px 10px 0px;
- padding: 5px;
-}
-
-.paramkey {
- text-align: right;
-}
-
-.paramtype {
- white-space: nowrap;
-}
-
-.paramname {
- color: #804040;
- white-space: nowrap;
-}
-.paramname em {
- font-style: normal;
-}
-.paramname code {
- line-height: 14px;
-}
-
-.params, .retval, .exception, .tparams {
- margin-left: 0px;
- padding-left: 0px;
-}
-
-.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname {
- font-weight: bold;
- vertical-align: top;
-}
-
-.params .paramtype, .tparams .paramtype {
- font-style: italic;
- vertical-align: top;
-}
-
-.params .paramdir, .tparams .paramdir {
- font-family: "courier new",courier,monospace;
- vertical-align: top;
-}
-
-table.mlabels {
- border-spacing: 0px;
-}
-
-td.mlabels-left {
- width: 100%;
- padding: 0px;
-}
-
-td.mlabels-right {
- vertical-align: bottom;
- padding: 0px;
- white-space: nowrap;
-}
-
-span.mlabels {
- margin-left: 8px;
-}
-
-span.mlabel {
- background-color: #777777;
- border-top:1px solid #5F5F5F;
- border-left:1px solid #5F5F5F;
- border-right:1px solid #C3C3C3;
- border-bottom:1px solid #C3C3C3;
- text-shadow: none;
- color: white;
- margin-right: 4px;
- padding: 2px 3px;
- border-radius: 3px;
- font-size: 7pt;
- white-space: nowrap;
- vertical-align: middle;
-}
-
-
-
-/* @end */
-
-/* these are for tree view inside a (index) page */
-
-div.directory {
- margin: 10px 0px;
- border-top: 1px solid #9C9C9C;
- border-bottom: 1px solid #9C9C9C;
- width: 100%;
-}
-
-.directory table {
- border-collapse:collapse;
-}
-
-.directory td {
- margin: 0px;
- padding: 0px;
- vertical-align: top;
-}
-
-.directory td.entry {
- white-space: nowrap;
- padding-right: 6px;
- padding-top: 3px;
-}
-
-.directory td.entry a {
- outline:none;
-}
-
-.directory td.entry a img {
- border: none;
-}
-
-.directory td.desc {
- width: 100%;
- padding-left: 6px;
- padding-right: 6px;
- padding-top: 3px;
- border-left: 1px solid rgba(0,0,0,0.05);
-}
-
-.directory tr.even {
- padding-left: 6px;
- background-color: #F6F6F6;
-}
-
-.directory img {
- vertical-align: -30%;
-}
-
-.directory .levels {
- white-space: nowrap;
- width: 100%;
- text-align: right;
- font-size: 9pt;
-}
-
-.directory .levels span {
- cursor: pointer;
- padding-left: 2px;
- padding-right: 2px;
- color: #3F3F3F;
-}
-
-.arrow {
- color: #9C9C9C;
- -webkit-user-select: none;
- -khtml-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- cursor: pointer;
- font-size: 80%;
- display: inline-block;
- width: 16px;
- height: 22px;
-}
-
-.icon {
- font-family: Arial, Helvetica;
- font-weight: bold;
- font-size: 12px;
- height: 14px;
- width: 16px;
- display: inline-block;
- background-color: #777777;
- color: white;
- text-align: center;
- border-radius: 4px;
- margin-left: 2px;
- margin-right: 2px;
-}
-
-.icona {
- width: 24px;
- height: 22px;
- display: inline-block;
-}
-
-.iconfopen {
- width: 24px;
- height: 18px;
- margin-bottom: 4px;
- background-image:url('folderopen.png');
- background-position: 0px -4px;
- background-repeat: repeat-y;
- vertical-align:top;
- display: inline-block;
-}
-
-.iconfclosed {
- width: 24px;
- height: 18px;
- margin-bottom: 4px;
- background-image:url('folderclosed.png');
- background-position: 0px -4px;
- background-repeat: repeat-y;
- vertical-align:top;
- display: inline-block;
-}
-
-.icondoc {
- width: 24px;
- height: 18px;
- margin-bottom: 4px;
- background-image:url('doc.png');
- background-position: 0px -4px;
- background-repeat: repeat-y;
- vertical-align:top;
- display: inline-block;
-}
-
-table.directory {
- font: 400 14px Roboto,sans-serif;
-}
-
-/* @end */
-
-div.dynheader {
- margin-top: 8px;
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -khtml-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-
-address {
- font-style: normal;
- color: #242424;
-}
-
-table.doxtable caption {
- caption-side: top;
-}
-
-table.doxtable {
- border-collapse:collapse;
- margin-top: 4px;
- margin-bottom: 4px;
-}
-
-table.doxtable td, table.doxtable th {
- border: 1px solid #282828;
- padding: 3px 7px 2px;
-}
-
-table.doxtable th {
- background-color: #363636;
- color: #FFFFFF;
- font-size: 110%;
- padding-bottom: 4px;
- padding-top: 5px;
-}
-
-table.fieldtable {
- /*width: 100%;*/
- margin-bottom: 10px;
- border: 1px solid #A7A7A7;
- border-spacing: 0px;
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
- border-radius: 4px;
- -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
- -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
- box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
-}
-
-.fieldtable td, .fieldtable th {
- padding: 3px 7px 2px;
-}
-
-.fieldtable td.fieldtype, .fieldtable td.fieldname {
- white-space: nowrap;
- border-right: 1px solid #A7A7A7;
- border-bottom: 1px solid #A7A7A7;
- vertical-align: top;
-}
-
-.fieldtable td.fieldname {
- padding-top: 3px;
-}
-
-.fieldtable td.fielddoc {
- border-bottom: 1px solid #A7A7A7;
- /*width: 100%;*/
-}
-
-.fieldtable td.fielddoc p:first-child {
- margin-top: 0px;
-}
-
-.fieldtable td.fielddoc p:last-child {
- margin-bottom: 2px;
-}
-
-.fieldtable tr:last-child td {
- border-bottom: none;
-}
-
-.fieldtable th {
- background-image:url('nav_f.png');
- background-repeat:repeat-x;
- background-color: #E1E1E1;
- font-size: 90%;
- color: #1E1E1E;
- padding-bottom: 4px;
- padding-top: 5px;
- text-align:left;
- font-weight: 400;
- -moz-border-radius-topleft: 4px;
- -moz-border-radius-topright: 4px;
- -webkit-border-top-left-radius: 4px;
- -webkit-border-top-right-radius: 4px;
- border-top-left-radius: 4px;
- border-top-right-radius: 4px;
- border-bottom: 1px solid #A7A7A7;
-}
-
-
-.tabsearch {
- top: 0px;
- left: 10px;
- height: 36px;
- background-image: url('tab_b.png');
- z-index: 101;
- overflow: hidden;
- font-size: 13px;
-}
-
-.navpath ul
-{
- font-size: 11px;
- background-image:url('tab_b.png');
- background-repeat:repeat-x;
- background-position: 0 -5px;
- height:30px;
- line-height:30px;
- color:#8C8C8C;
- border:solid 1px #C0C0C0;
- overflow:hidden;
- margin:0px;
- padding:0px;
-}
-
-.navpath li
-{
- list-style-type:none;
- float:left;
- padding-left:10px;
- padding-right:15px;
- background-image:url('bc_s.png');
- background-repeat:no-repeat;
- background-position:right;
- color:#353535;
-}
-
-.navpath li.navelem a
-{
- height:32px;
- display:block;
- text-decoration: none;
- outline: none;
- color: #222222;
- font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
- text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
- text-decoration: none;
-}
-
-.navpath li.navelem a:hover
-{
- color:#6F6F6F;
-}
-
-.navpath li.footer
-{
- list-style-type:none;
- float:right;
- padding-left:10px;
- padding-right:15px;
- background-image:none;
- background-repeat:no-repeat;
- background-position:right;
- color:#353535;
- font-size: 8pt;
-}
-
-
-div.summary
-{
- float: right;
- font-size: 8pt;
- padding-right: 5px;
- width: 50%;
- text-align: right;
-}
-
-div.summary a
-{
- white-space: nowrap;
-}
-
-table.classindex
-{
- margin: 10px;
- white-space: nowrap;
- margin-left: 3%;
- margin-right: 3%;
- width: 94%;
- border: 0;
- border-spacing: 0;
- padding: 0;
-}
-
-div.ingroups
-{
- font-size: 8pt;
- width: 50%;
- text-align: left;
-}
-
-div.ingroups a
-{
- white-space: nowrap;
-}
-
-div.header
-{
- background-color: #F9F9F9;
- margin: 0px;
- border-bottom: 1px solid #C3C3C3;
-}
-
-div.headertitle
-{
- padding: 5px 5px 5px 10px;
-}
-
-.PageDocRTL-title div.headertitle {
- text-align: right;
- direction: rtl;
-}
-
-dl {
- padding: 0 0 0 0;
-}
-
-/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */
-dl.section {
- margin-left: 0px;
- padding-left: 0px;
-}
-
-dl.section.DocNodeRTL {
- margin-right: 0px;
- padding-right: 0px;
-}
-
-dl.note {
- margin-left: -7px;
- padding-left: 3px;
- border-left: 4px solid;
- border-color: #D0C000;
-}
-
-dl.note.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #D0C000;
-}
-
-dl.warning, dl.attention {
- margin-left: -7px;
- padding-left: 3px;
- border-left: 4px solid;
- border-color: #FF0000;
-}
-
-dl.warning.DocNodeRTL, dl.attention.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #FF0000;
-}
-
-dl.pre, dl.post, dl.invariant {
- margin-left: -7px;
- padding-left: 3px;
- border-left: 4px solid;
- border-color: #00D000;
-}
-
-dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #00D000;
-}
-
-dl.deprecated {
- margin-left: -7px;
- padding-left: 3px;
- border-left: 4px solid;
- border-color: #505050;
-}
-
-dl.deprecated.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #505050;
-}
-
-dl.todo {
- margin-left: -7px;
- padding-left: 3px;
- border-left: 4px solid;
- border-color: #00C0E0;
-}
-
-dl.todo.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #00C0E0;
-}
-
-dl.test {
- margin-left: -7px;
- padding-left: 3px;
- border-left: 4px solid;
- border-color: #3030E0;
-}
-
-dl.test.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #3030E0;
-}
-
-dl.bug {
- margin-left: -7px;
- padding-left: 3px;
- border-left: 4px solid;
- border-color: #C08050;
-}
-
-dl.bug.DocNodeRTL {
- margin-left: 0;
- padding-left: 0;
- border-left: 0;
- margin-right: -7px;
- padding-right: 3px;
- border-right: 4px solid;
- border-color: #C08050;
-}
-
-dl.section dd {
- margin-bottom: 6px;
-}
-
-
-#projectlogo
-{
- text-align: center;
- vertical-align: bottom;
- border-collapse: separate;
-}
-
-#projectlogo img
-{
- border: 0px none;
-}
-
-#projectalign
-{
- vertical-align: middle;
-}
-
-#projectname
-{
- font: 300% Tahoma, Arial,sans-serif;
- margin: 0px;
- padding: 2px 0px;
-}
-
-#projectbrief
-{
- font: 120% Tahoma, Arial,sans-serif;
- margin: 0px;
- padding: 0px;
-}
-
-#projectnumber
-{
- font: 50% Tahoma, Arial,sans-serif;
- margin: 0px;
- padding: 0px;
-}
-
-#titlearea
-{
- padding: 0px;
- margin: 0px;
- width: 100%;
- border-bottom: 1px solid #5F5F5F;
-}
-
-.image
-{
- text-align: center;
-}
-
-.dotgraph
-{
- text-align: center;
-}
-
-.mscgraph
-{
- text-align: center;
-}
-
-.plantumlgraph
-{
- text-align: center;
-}
-
-.diagraph
-{
- text-align: center;
-}
-
-.caption
-{
- font-weight: bold;
-}
-
-div.zoom
-{
- border: 1px solid #919191;
-}
-
-dl.citelist {
- margin-bottom:50px;
-}
-
-dl.citelist dt {
- color:#303030;
- float:left;
- font-weight:bold;
- margin-right:10px;
- padding:5px;
- text-align:right;
- width:52px;
-}
-
-dl.citelist dd {
- margin:2px 0 2px 72px;
- padding:5px 0;
-}
-
-div.toc {
- padding: 14px 25px;
- background-color: #F4F4F4;
- border: 1px solid #D6D6D6;
- border-radius: 7px 7px 7px 7px;
- float: right;
- height: auto;
- margin: 0 8px 10px 10px;
- width: 200px;
-}
-
-.PageDocRTL-title div.toc {
- float: left !important;
- text-align: right;
-}
-
-div.toc li {
- background: url("bdwn.png") no-repeat scroll 0 5px transparent;
- font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
- margin-top: 5px;
- padding-left: 10px;
- padding-top: 2px;
-}
-
-.PageDocRTL-title div.toc li {
- background-position-x: right !important;
- padding-left: 0 !important;
- padding-right: 10px;
-}
-
-div.toc h3 {
- font: bold 12px/1.2 Arial,FreeSans,sans-serif;
- color: #4E4E4E;
- border-bottom: 0 none;
- margin: 0;
-}
-
-div.toc ul {
- list-style: none outside none;
- border: medium none;
- padding: 0px;
-}
-
-div.toc li.level1 {
- margin-left: 0px;
-}
-
-div.toc li.level2 {
- margin-left: 15px;
-}
-
-div.toc li.level3 {
- margin-left: 30px;
-}
-
-div.toc li.level4 {
- margin-left: 45px;
-}
-
-.PageDocRTL-title div.toc li.level1 {
- margin-left: 0 !important;
- margin-right: 0;
-}
-
-.PageDocRTL-title div.toc li.level2 {
- margin-left: 0 !important;
- margin-right: 15px;
-}
-
-.PageDocRTL-title div.toc li.level3 {
- margin-left: 0 !important;
- margin-right: 30px;
-}
-
-.PageDocRTL-title div.toc li.level4 {
- margin-left: 0 !important;
- margin-right: 45px;
-}
-
-.inherit_header {
- font-weight: bold;
- color: gray;
- cursor: pointer;
- -webkit-touch-callout: none;
- -webkit-user-select: none;
- -khtml-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-
-.inherit_header td {
- padding: 6px 0px 2px 5px;
-}
-
-.inherit {
- display: none;
-}
-
-tr.heading h2 {
- margin-top: 12px;
- margin-bottom: 4px;
-}
-
-/* tooltip related style info */
-
-.ttc {
- position: absolute;
- display: none;
-}
-
-#powerTip {
- cursor: default;
- white-space: nowrap;
- background-color: white;
- border: 1px solid gray;
- border-radius: 4px 4px 4px 4px;
- box-shadow: 1px 1px 7px gray;
- display: none;
- font-size: smaller;
- max-width: 80%;
- opacity: 0.9;
- padding: 1ex 1em 1em;
- position: absolute;
- z-index: 2147483647;
-}
-
-#powerTip div.ttdoc {
- color: grey;
- font-style: italic;
-}
-
-#powerTip div.ttname a {
- font-weight: bold;
-}
-
-#powerTip div.ttname {
- font-weight: bold;
-}
-
-#powerTip div.ttdeci {
- color: #006318;
-}
-
-#powerTip div {
- margin: 0px;
- padding: 0px;
- font: 12px/16px Roboto,sans-serif;
-}
-
-#powerTip:before, #powerTip:after {
- content: "";
- position: absolute;
- margin: 0px;
-}
-
-#powerTip.n:after, #powerTip.n:before,
-#powerTip.s:after, #powerTip.s:before,
-#powerTip.w:after, #powerTip.w:before,
-#powerTip.e:after, #powerTip.e:before,
-#powerTip.ne:after, #powerTip.ne:before,
-#powerTip.se:after, #powerTip.se:before,
-#powerTip.nw:after, #powerTip.nw:before,
-#powerTip.sw:after, #powerTip.sw:before {
- border: solid transparent;
- content: " ";
- height: 0;
- width: 0;
- position: absolute;
-}
-
-#powerTip.n:after, #powerTip.s:after,
-#powerTip.w:after, #powerTip.e:after,
-#powerTip.nw:after, #powerTip.ne:after,
-#powerTip.sw:after, #powerTip.se:after {
- border-color: rgba(255, 255, 255, 0);
-}
-
-#powerTip.n:before, #powerTip.s:before,
-#powerTip.w:before, #powerTip.e:before,
-#powerTip.nw:before, #powerTip.ne:before,
-#powerTip.sw:before, #powerTip.se:before {
- border-color: rgba(128, 128, 128, 0);
-}
-
-#powerTip.n:after, #powerTip.n:before,
-#powerTip.ne:after, #powerTip.ne:before,
-#powerTip.nw:after, #powerTip.nw:before {
- top: 100%;
-}
-
-#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {
- border-top-color: #FFFFFF;
- border-width: 10px;
- margin: 0px -10px;
-}
-#powerTip.n:before {
- border-top-color: #808080;
- border-width: 11px;
- margin: 0px -11px;
-}
-#powerTip.n:after, #powerTip.n:before {
- left: 50%;
-}
-
-#powerTip.nw:after, #powerTip.nw:before {
- right: 14px;
-}
-
-#powerTip.ne:after, #powerTip.ne:before {
- left: 14px;
-}
-
-#powerTip.s:after, #powerTip.s:before,
-#powerTip.se:after, #powerTip.se:before,
-#powerTip.sw:after, #powerTip.sw:before {
- bottom: 100%;
-}
-
-#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {
- border-bottom-color: #FFFFFF;
- border-width: 10px;
- margin: 0px -10px;
-}
-
-#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {
- border-bottom-color: #808080;
- border-width: 11px;
- margin: 0px -11px;
-}
-
-#powerTip.s:after, #powerTip.s:before {
- left: 50%;
-}
-
-#powerTip.sw:after, #powerTip.sw:before {
- right: 14px;
-}
-
-#powerTip.se:after, #powerTip.se:before {
- left: 14px;
-}
-
-#powerTip.e:after, #powerTip.e:before {
- left: 100%;
-}
-#powerTip.e:after {
- border-left-color: #FFFFFF;
- border-width: 10px;
- top: 50%;
- margin-top: -10px;
-}
-#powerTip.e:before {
- border-left-color: #808080;
- border-width: 11px;
- top: 50%;
- margin-top: -11px;
-}
-
-#powerTip.w:after, #powerTip.w:before {
- right: 100%;
-}
-#powerTip.w:after {
- border-right-color: #FFFFFF;
- border-width: 10px;
- top: 50%;
- margin-top: -10px;
-}
-#powerTip.w:before {
- border-right-color: #808080;
- border-width: 11px;
- top: 50%;
- margin-top: -11px;
-}
-
-@media print
-{
- #top { display: none; }
- #side-nav { display: none; }
- #nav-path { display: none; }
- body { overflow:visible; }
- h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
- .summary { display: none; }
- .memitem { page-break-inside: avoid; }
- #doc-content
- {
- margin-left:0 !important;
- height:auto !important;
- width:auto !important;
- overflow:inherit;
- display:inline;
- }
-}
-
-/* @group Markdown */
-
-table.markdownTable {
- border-collapse:collapse;
- margin-top: 4px;
- margin-bottom: 4px;
-}
-
-table.markdownTable td, table.markdownTable th {
- border: 1px solid #282828;
- padding: 3px 7px 2px;
-}
-
-table.markdownTable tr {
-}
-
-th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone {
- background-color: #363636;
- color: #FFFFFF;
- font-size: 110%;
- padding-bottom: 4px;
- padding-top: 5px;
-}
-
-th.markdownTableHeadLeft, td.markdownTableBodyLeft {
- text-align: left
-}
-
-th.markdownTableHeadRight, td.markdownTableBodyRight {
- text-align: right
-}
-
-th.markdownTableHeadCenter, td.markdownTableBodyCenter {
- text-align: center
-}
-
-.DocNodeRTL {
- text-align: right;
- direction: rtl;
-}
-
-.DocNodeLTR {
- text-align: left;
- direction: ltr;
-}
-
-table.DocNodeRTL {
- width: auto;
- margin-right: 0;
- margin-left: auto;
-}
-
-table.DocNodeLTR {
- width: auto;
- margin-right: auto;
- margin-left: 0;
-}
-
-tt, code, kbd, samp
-{
- display: inline-block;
- direction:ltr;
-}
-/* @end */
-
-u {
- text-decoration: underline;
-}
-
-
-a.el {
- font-weight: normal;
-}
-
-body, table, div, p, dl {
- color: #333333;
- font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol';
- font-size: 15px;
- font-style: normal;
- font-variant: normal;
- font-weight: normal;
- line-height: 25.5px;
-}
-
-body {
- background-color: #fcfcfc;
-}
-
-div.header {
- background-image: none;
- background-color: white;
- margin: 0px;
- border: 0px;
-}
-
-div.headertitle {
- width: 858px;
- margin: 30px;
- padding: 0px;
-}
-
-div.toc {
- background-color: #f8f8f8;
- border-color: #ddd;
- margin-right: 10px;
- margin-left: 20px;
-}
-div.toc h3 {
- color: #333333;
- font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol';
- font-size: 18px;
- font-style: normal;
- font-variant: normal;
- font-weight: normal;
-}
-div.toc li {
- color: #333333;
- font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol';
- font-size: 12px;
- font-style: normal;
- font-variant: normal;
- font-weight: normal;
-}
-
-.title {
- font-size: 2.5em;
- line-height: 63.75px;
- border-bottom: 1px solid #ddd;
- margin-bottom: 15px;
- margin-left: 0px;
- margin-right: 0px;
- margin-top: 0px;
-}
-
-.summary {
- float: none !important;
- width: auto !important;
- padding-top: 10px;
- padding-right: 10px !important;
-}
-
-.summary + .headertitle .title {
- font-size: 1.5em;
- line-height: 2.0em;
-}
-
-body h1 {
- font-size: 2em;
- line-height: 1.7;
- border-bottom: 1px solid #eee;
- margin: 1em 0 15px;
- padding: 0;
- overflow: hidden;
-}
-
-body h2 {
- font-size: 1.5em;
- line-height: 1.7;
- margin: 1em 0 15px;
- padding: 0;
-}
-
-pre.fragment {
- font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
- font-size: 13px;
- font-style: normal;
- font-variant: normal;
- font-weight: normal;
- line-height: 19px;
-}
-
-table.doxtable th {
- background-color: #f8f8f8;
- color: #333333;
- font-size: 15px;
-}
-
-table.doxtable td, table.doxtable th {
- border: 1px solid #ddd;
-}
-
-#doc-content {
- background-color: #fff;
- width: 918px;
- height: auto !important;
- margin-left: 270px !important;
-}
-
-div.contents {
- width: 858px;
- margin: 30px;
-}
-
-div.line {
- font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
- font-size: 13px;
- font-style: normal;
- font-variant: normal;
- font-weight: normal;
- line-height: 19px;
-}
-
-tt, code, pre {
- font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace;
- font-size: 12px;
-}
-
-div.fragment {
- background-color: #f8f8f8;
- border: 1px solid #ddd;
- font-size: 13px;
- line-height: 19px;
- overflow: auto;
- padding: 6px 10px;
- border-radius: 3px;
-}
-
-#topbanner {
- position: fixed;
- margin: 15px;
- z-index: 101;
-}
-
-#projectname
-{
- font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol';
- font-size: 38px;
- font-weight: bold;
- line-height: 63.75px;
- margin: 0px;
- padding: 2px 0px;
-}
-
-#projectbrief
-{
- font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol';
- font-size: 16px;
- line-height: 22.4px;
- margin: 0px 0px 13px 0px;
- padding: 2px;
-}
-
-/* side bar and search */
-
-#side-nav
-{
- padding: 10px 0px 10px 10px;
- border-top: 60px solid #d73726;
- background-color: #343131;
- width: 250px !important;
- height: 100% !important;
- position: fixed;
-}
-
-#nav-tree
-{
- background-color: transparent;
- background-image: none;
- height: 100% !important;
-}
-
-#nav-tree .label
-{
- font-family: Helvetica, arial, freesans, clean, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol';
- line-height: 25.5px;
- font-size: 15px;
-}
-
-#nav-tree
-{
- color: #b3b3b3;
-}
-
-#nav-tree .selected {
- text-shadow: none;
- background-image: none;
-}
-
-#github
-{
- position: fixed;
- left: auto;
- right: auto;
- width: 250px;
-}
-
-#MSearchBox
-{
- margin: 20px;
- left: 40px;
- right: auto;
- position: fixed;
- width: 180px;
-}
-
-#MSearchField
-{
- width: 121px;
-}
-
-#MSearchResultsWindow
-{
- left: 45px !important;
-}
-
-#nav-sync
-{
- display: none;
-}
-
-.ui-resizable .ui-resizable-handle
-{
- width: 0px;
-}
-
-#nav-path
-{
- display: none;
-}
-
-/* external link icon */
-div.contents a[href ^= "http"]:after {
- content: " " url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAVklEQVR4Xn3PgQkAMQhDUXfqTu7kTtkpd5RA8AInfArtQ2iRXFWT2QedAfttj2FsPIOE1eCOlEuoWWjgzYaB/IkeGOrxXhqB+uA9Bfcm0lAZuh+YIeAD+cAqSz4kCMUAAAAASUVORK5CYII=);
-}
-
-.githublogo {
- content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RERCMUIwOUY4NkNFMTFFM0FBNTJFRTMzNTJEMUJDNDYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RERCMUIwOUU4NkNFMTFFM0FBNTJFRTMzNTJEMUJDNDYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkU1MTc4QTJBOTlBMDExRTI5QTE1QkMxMDQ2QTg5MDREIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkU1MTc4QTJCOTlBMDExRTI5QTE1QkMxMDQ2QTg5MDREIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+jUqS1wAAApVJREFUeNq0l89rE1EQx3e3gVJoSPzZeNEWPKgHoa0HBak0iHiy/4C3WvDmoZ56qJ7txVsPQu8qlqqHIhRKJZceesmhioQEfxTEtsoSpdJg1u/ABJ7Pmc1m8zLwgWTmzcw3L+/te+tHUeQltONgCkyCi2AEDHLsJ6iBMlgHL8FeoqokoA2j4CloRMmtwTmj7erHBXPgCWhG6a3JNXKdCiDl1cidVbXZkJoXQRi5t5BrxwoY71FzU8S4JuAIqFkJ2+BFSlEh525b/hr3+k/AklDkNsf6wTT4yv46KIMNpsy+iMdMc47HNWxbsgVcUn7FmLAzzoFAWDsBx+wVP6bUpp5ewI+DOeUx0Wd9D8F70BTGNjkWtqnhmT1JQAHcUgZd8Lo3rQb1LAT8eJVUfgGvHQigGp+V2Z0iAUUl8QH47kAA1XioxIo+bRN8OG8F/oBjwv+Z1nJgX5jpdzQDw0LCjsPmrcW7I/iHScCAEDj03FtD8A0EyuChHgg4KTlJQF3wZ7WELppnBX+dBFSVpJsOBWi1qiRgSwnOgoyD5hmuJdkWCVhTgnTvW3AgYIFrSbZGh0UW/Io5Vp+DQoK7o80pztWMemZbgxeNwCNwDbw1fIfgGZjhU6xPaJgBV8BdsMw5cbZoHsenwYFxkZzl83xTSKTiviCAfCsJLysH3POfC8m8NegyGAGfLP/VmGmfSChgXroR0RSWjEFv2J/nG84cuKFMf4sTCZqXuJd4KaXFVjEG3+tw4eXbNK/YC9oXXs3O8NY8y99L4BXY5cvLY/Bb2VZ58EOJVcB18DHJq9lRsKr8inyKGVjlmh29mtHs3AHfuhCwy1vXT/Nu2GKQt+UHsGdctyX6eQyNvc+5sfX9Dl7Pe2J/BRgAl2CpwmrsHR0AAAAASUVORK5CYII=);
-}
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 692c6901..5930faef 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -703,12 +703,57 @@ namespace BinaryNinja {
*/
Ref<BinaryView> OpenView(Ref<BinaryView> rawData, bool updateAnalysis = true, std::function<bool(size_t, size_t)> progress = {}, Json::Value options = Json::Value(Json::objectValue), bool isDatabase = false);
+ /*!
+ DemangleMS demangles a Microsoft Visual Studio C++ name
+
+ \param arch Architecture for the symbol. Required for pointer and integer sizes.
+ \param mangledName a mangled Microsoft Visual Studio C++ name
+ \param outType Pointer to Type to output
+ \param outVarName QualifiedName reference to write the output name to.
+ \param simplify Whether to simplify demangled names.
+ */
bool DemangleMS(Architecture* arch, const std::string& mangledName, Type** outType, QualifiedName& outVarName,
const bool simplify = false);
+
+ /*!
+ DemangleMS demangles a Microsoft Visual Studio C++ name
+
+ This overload will use the view's "analysis.types.templateSimplifier" setting
+ to determine whether to simplify the mangled name.
+
+ \param arch Architecture for the symbol. Required for pointer and integer sizes.
+ \param mangledName a mangled Microsoft Visual Studio C++ name
+ \param outType Pointer to Type to output
+ \param outVarName QualifiedName reference to write the output name to.
+ \param view View to check the analysis.types.templateSimplifier for
+ */
bool DemangleMS(Architecture* arch, const std::string& mangledName, Type** outType, QualifiedName& outVarName,
const Ref<BinaryView>& view);
+
+ /*!
+ DemangleGNU3 demangles a GNU3 name
+
+ \param arch Architecture for the symbol. Required for pointer and integer sizes.
+ \param mangledName a mangled GNU3 name
+ \param outType Pointer to Type to output
+ \param outVarName QualifiedName reference to write the output name to.
+ \param simplify Whether to simplify demangled names.
+ */
bool DemangleGNU3(Ref<Architecture> arch, const std::string& mangledName, Type** outType, QualifiedName& outVarName,
const bool simplify = false);
+
+ /*!
+ DemangleGNU3 demangles a GNU3 name
+
+ This overload will use the view's "analysis.types.templateSimplifier" setting
+ to determine whether to simplify the mangled name.
+
+ \param arch Architecture for the symbol. Required for pointer and integer sizes.
+ \param mangledName a mangled GNU3 name
+ \param outType Pointer to Type to output
+ \param outVarName QualifiedName reference to write the output name to.
+ \param view View to check the analysis.types.templateSimplifier for
+ */
bool DemangleGNU3(Ref<Architecture> arch, const std::string& mangledName, Type** outType, QualifiedName& outVarName,
const Ref<BinaryView>& view);
@@ -842,16 +887,36 @@ namespace BinaryNinja {
bool ZlibDecompress(DataBuffer& output) const;
};
+ /*!
+ TemporaryFile is used for creating temporary files, stored (temporarily) in the system's default temporary file
+ directory.
+ */
class TemporaryFile : public CoreRefCountObject<BNTemporaryFile, BNNewTemporaryFileReference, BNFreeTemporaryFile>
{
public:
TemporaryFile();
+
+ /*! Create a new temporary file with BinaryNinja::DataBuffer contents.
+
+ \param contents DataBuffer with contents to write to the file.
+ */
TemporaryFile(const DataBuffer& contents);
+
+ /*! Create a new temporary file with string contents.
+
+ \param contents std::string with contents to write to the file.
+ */
TemporaryFile(const std::string& contents);
TemporaryFile(BNTemporaryFile* file);
bool IsValid() const { return m_object != nullptr; }
+
+ /*! Path to the TemporaryFile on the filesystem.
+ */
std::string GetPath() const;
+
+ /*! DataBuffer with contents of the file.
+ */
DataBuffer GetContents();
};
@@ -1023,32 +1088,121 @@ namespace BinaryNinja {
FileMetadata(const std::string& filename);
FileMetadata(BNFileMetadata* file);
+ /*!
+ Close the underlying file handle
+ */
void Close();
void SetNavigationHandler(NavigationHandler* handler);
+ /*!
+ \return The original name of the binary opened if a bndb, otherwise returns the current filename
+ */
std::string GetOriginalFilename() const;
+
+ /*!
+ If the filename is not open in a BNDB, sets the filename for the current file.
+
+ \param name New name
+ */
void SetOriginalFilename(const std::string& name);
+ /*!
+ \return The name of the open bndb or binary filename
+ */
std::string GetFilename() const;
+
+ /*!
+ \param name Set the filename for the currnt BNDB or binary.
+ */
void SetFilename(const std::string& name);
+ /*!
+ \return Whether the file has unsaved modifications
+ */
bool IsModified() const;
+
+ /*!
+ \return Whether auto-analysis results have changed.
+ */
bool IsAnalysisChanged() const;
+
+ /*!
+ Mark file as having unsaved changes
+ */
void MarkFileModified();
+
+ /*!
+ Mark file as having been saved (inverse of MarkFileModified)
+ */
void MarkFileSaved();
bool IsSnapshotDataAppliedWithoutError() const;
+ /*! Whether the FileMetadata is backed by a database, or if specified,
+ a specific BinaryView type
+
+ \param binaryViewType Type for the BinaryView
+ \return Whether the FileMetadata is backed by a database
+ */
bool IsBackedByDatabase(const std::string& binaryViewType = "") const;
+
+ /*! Writes the current database (.bndb) out to the specified file.
+
+ \param name path and filename to write the bndb to. Should have ".bndb" appended to it.
+ \param data BinaryView to save the database from
+ \param settings Special save options
+ \return Whether the save was successful
+ */
bool CreateDatabase(const std::string& name, BinaryView* data, Ref<SaveSettings> settings);
+
+ /*! Writes the current database (.bndb) out to the specified file.
+
+ \param name path and filename to write the bndb to. Should have ".bndb" appended to it.
+ \param data BinaryView to save the database from
+ \param progressCallback callback function to send save progress to.
+ \param settings Special save options
+ \return Whether the save was successful
+ */
bool CreateDatabase(const std::string& name, BinaryView* data,
const std::function<bool(size_t progress, size_t total)>& progressCallback, Ref<SaveSettings> settings);
+
+ /*! Open an existing database from a given path
+
+ \param path Path to the existing database
+ \return The resulting BinaryView, if the load was successful
+ */
Ref<BinaryView> OpenExistingDatabase(const std::string& path);
+
+ /*! Open an existing database from a given path with a progress callback
+
+ \param path Path to the existing database
+ \param progressCallback callback function to send load progress to.
+ \return The resulting BinaryView, if the load was successful
+ */
Ref<BinaryView> OpenExistingDatabase(
const std::string& path, const std::function<bool(size_t progress, size_t total)>& progressCallback);
Ref<BinaryView> OpenDatabaseForConfiguration(const std::string& path);
+
+ /*! Save the current database to the already created file.
+
+ Note: CreateDatabase should have been called prior to calling this.
+
+ \param data BinaryView to save the data of
+ \param settings Special save options
+ \return Whether the save was successful
+ */
bool SaveAutoSnapshot(BinaryView* data, Ref<SaveSettings> settings);
+
+ /*! Save the current database to the already created file.
+
+ Note: CreateDatabase should have been called prior to calling this.
+
+ \param data BinaryView to save the data of
+ \param settings Special save options
+ \param progressCallback callback function to send save progress to
+ \return Whether the save was successful
+ */
bool SaveAutoSnapshot(BinaryView* data,
const std::function<bool(size_t progress, size_t total)>& progressCallback, Ref<SaveSettings> settings);
void GetSnapshotData(
@@ -1058,7 +1212,21 @@ namespace BinaryNinja {
bool restoreRawView = true);
Ref<Database> GetDatabase();
+ /*! Rebase the given BinaryView to a new address
+
+ \param data BinaryView to rebase
+ \param address Address to rebase to
+ \return Whether the rebase was successful
+ */
bool Rebase(BinaryView* data, uint64_t address);
+
+ /*! Rebase the given BinaryView to a new address
+
+ \param data BinaryView to rebase
+ \param address Address to rebase to
+ \param progressCallback Callback function to pass rebase progress to
+ \return Whether the rebase was successful
+ */
bool Rebase(BinaryView* data, uint64_t address,
const std::function<bool(size_t progress, size_t total)>& progressCallback);
bool CreateSnapshotedView(BinaryView* data, const std::string& viewName);
@@ -1068,12 +1236,28 @@ namespace BinaryNinja {
MergeResult MergeUserAnalysis(const std::string& name, const std::function<bool(size_t, size_t)>& progress,
const std::vector<std::string> excludedHashes = {});
+ /*! Start recording actions taken so they can be undone at some point
+ */
void BeginUndoActions();
+
+ /*! Commit the actions taken since the last commit to the undo database.
+ */
void CommitUndoActions();
+ /*! \return Whether it is possible to perform an Undo
+ */
bool CanUndo();
+
+ /*! Undo the last committed action in the undo database.
+ */
bool Undo();
+
+ /*! \return Whether it is possible to perform a Redo
+ */
bool CanRedo();
+
+ /*! Redo the last committed action in the undo database.
+ */
bool Redo();
std::vector<Ref<User>> GetUsers();
@@ -1087,12 +1271,47 @@ namespace BinaryNinja {
void CloseProject();
bool IsProjectOpen();
+ /*!
+ Get the current View name, e.g. ``Linear:ELF``, ``Graph:PE``
+
+ \return The current view name
+ */
std::string GetCurrentView();
+
+ /*!
+ Get the current offset in the current view
+
+ \return The current offset
+ */
uint64_t GetCurrentOffset();
+
+ /*!
+ Navigate to the specified virtual address in the specified view
+
+ \param view View name. e.g. ``Linear:ELF``, ``Graph:PE``
+ \param offset Virtual address to navigate to
+ \return Whether the navigation was successful.
+ */
bool Navigate(const std::string& view, uint64_t offset);
+ /*!
+ Get the BinaryView for a specific View type
+
+ \param name View name. e.g. ``Linear:ELF``, ``Graph:PE``
+ \return The BinaryView, if it exists
+ */
BinaryNinja::Ref<BinaryNinja::BinaryView> GetViewOfType(const std::string& name);
+
+ /*!
+ List of View names that exist within the current file
+
+ \return List of View Names
+ */
std::vector<std::string> GetExistingViews() const;
+
+ /*!
+ \return Current Session ID
+ */
size_t GetSessionId() const;
};
@@ -1454,14 +1673,63 @@ namespace BinaryNinja {
const NameSpace& nameSpace = NameSpace(DEFAULT_INTERNAL_NAMESPACE), uint64_t ordinal = 0);
Symbol(BNSymbol* sym);
+ /*!
+ Symbols are defined as one of the following types:
+
+ =========================== ==============================================================
+ BNSymbolType Description
+ =========================== ==============================================================
+ FunctionSymbol Symbol for function that exists in the current binary
+ ImportAddressSymbol Symbol defined in the Import Address Table
+ ImportedFunctionSymbol Symbol for a function that is not defined in the current binary
+ DataSymbol Symbol for data in the current binary
+ ImportedDataSymbol Symbol for data that is not defined in the current binary
+ ExternalSymbol Symbols for data and code that reside outside the BinaryView
+ LibraryFunctionSymbol Symbols for external functions outside the library
+ =========================== ==============================================================
+
+ \return Symbol type
+ */
BNSymbolType GetType() const;
+
+ /*!
+ \return Symbol binding
+ */
BNSymbolBinding GetBinding() const;
+
+ /*!
+ \return Symbol short name
+ */
std::string GetShortName() const;
+
+ /*!
+ \return Symbol full name
+ */
std::string GetFullName() const;
+
+ /*!
+ \return Symbol raw name
+ */
std::string GetRawName() const;
+
+ /*!
+ \return Symbol Address
+ */
uint64_t GetAddress() const;
+
+ /*!
+ \return Symbol ordinal
+ */
uint64_t GetOrdinal() const;
+
+ /*!
+ \return Whether the symbol was auto-defined
+ */
bool IsAutoDefined() const;
+
+ /*!
+ \return Symbol NameSpace
+ */
NameSpace GetNameSpace() const;
static Ref<Symbol> ImportedFunctionFromImportAddressSymbol(Symbol* sym, uint64_t addr);
@@ -1677,15 +1945,62 @@ namespace BinaryNinja {
TagType(BinaryView* view, const std::string& name, const std::string& icon, bool visible = true,
Type type = UserTagType);
+ /*!
+ \return BinaryView for this TagType
+ */
BinaryView* GetView() const;
+
+ /*!
+ \return Unique ID of the TagType
+ */
std::string GetId() const;
+
+ /*!
+ \return Name of the TagType
+ */
std::string GetName() const;
+
+ /*!
+ Set the name of the TagType
+
+ \param name New name
+ */
void SetName(const std::string& name);
+
+ /*!
+ \return Unicode string containing an emoji to be used as an icon
+ */
std::string GetIcon() const;
+
+ /*!
+ Set the icon to be used for a TagType
+
+ \param icon Unicode string containing an emoji to be used as an icon
+ */
void SetIcon(const std::string& icon);
+
+ /*!
+ \return Whether the tags of this type are visible
+ */
bool GetVisible() const;
+
+ /*!
+ Set whether the tags of this type are visible
+
+ \param visible Whether the tags of this type are visible
+ */
void SetVisible(bool visible);
+
+ /*!
+ One of: UserTagType, NotificationTagType, BookmarksTagType
+
+ \return Tag Type.
+ */
Type GetType() const;
+
+ /*!
+ \param type Tag Type. One of: UserTagType, NotificationTagType, BookmarksTagType
+ */
void SetType(Type type);
};
@@ -1695,7 +2010,14 @@ namespace BinaryNinja {
Tag(BNTag* tag);
Tag(Ref<TagType> type, const std::string& data = "");
+ /*!
+ \return Unique ID of the Tag
+ */
std::string GetId() const;
+
+ /*!
+ \return TagType of this tag
+ */
Ref<TagType> GetType() const;
std::string GetData() const;
void SetData(const std::string& data);
@@ -1821,6 +2143,14 @@ namespace BinaryNinja {
(void)len;
return 0;
}
+
+ /*! PerformWrite provides a mapping between the flat file and virtual offsets in the file.
+
+ \param offset the virtual offset to find and write len bytes to
+ \param data the address to read len number of bytes from
+ \param len the number of bytes to read from data and write to offset
+ \return length of data written, 0 on error
+ */
virtual size_t PerformWrite(uint64_t offset, const void* data, size_t len)
{
(void)offset;
@@ -1828,6 +2158,15 @@ namespace BinaryNinja {
(void)len;
return 0;
}
+
+ /*! PerformInsert provides a mapping between the flat file and virtual offsets in the file,
+ inserting `len` bytes from `data` to virtual address `offset`
+
+ \param offset the virtual offset to find and insert len bytes into
+ \param data the address to read len number of bytes from
+ \param len the number of bytes to read from data and insert at offset
+ \return length of data inserted, 0 on error
+ */
virtual size_t PerformInsert(uint64_t offset, const void* data, size_t len)
{
(void)offset;
@@ -1835,6 +2174,14 @@ namespace BinaryNinja {
(void)len;
return 0;
}
+
+ /*! PerformRemove provides a mapping between the flat file and virtual offsets in the file,
+ removing `len` bytes from virtual address `offset`
+
+ \param offset the virtual offset to find and remove bytes from
+ \param len the number of bytes to be removed
+ \return length of data removed, 0 on error
+ */
virtual size_t PerformRemove(uint64_t offset, uint64_t len)
{
(void)offset;
@@ -1842,23 +2189,89 @@ namespace BinaryNinja {
return 0;
}
+ /*! PerformGetModification implements a query as to whether the virtual address `offset` is modified.
+
+ \param offset a virtual address to be checked
+ \return one of Original, Changed, Inserted
+ */
virtual BNModificationStatus PerformGetModification(uint64_t offset)
{
(void)offset;
return Original;
}
+
+ /*! PerformIsValidOffset implements a check as to whether a virtual address `offset` is valid
+
+ \param offset the virtual address to check
+ \return whether the offset is valid
+ */
virtual bool PerformIsValidOffset(uint64_t offset);
+
+ /*! PerformIsOffsetReadable implements a check as to whether a virtual address is readable
+
+ \param offset the virtual address to check
+ \return whether the offset is readable
+ */
virtual bool PerformIsOffsetReadable(uint64_t offset);
+
+ /*! PerformIsOffsetWritable implements a check as to whether a virtual address is writable
+
+ \param offset the virtual address to check
+ \return whether the offset is writable
+ */
virtual bool PerformIsOffsetWritable(uint64_t offset);
+
+ /*! PerformIsOffsetExecutable implements a check as to whether a virtual address is executable
+
+ \param offset the virtual address to check
+ \return whether the offset is executable
+ */
virtual bool PerformIsOffsetExecutable(uint64_t offset);
+
+ /*! PerformIsOffsetBackedByFile implements a check as to whether a virtual address is backed by a file
+
+ \param offset the virtual address to check
+ \return whether the offset is backed by a file
+ */
virtual bool PerformIsOffsetBackedByFile(uint64_t offset);
+
+ /*! PerformGetNextValidOffset implements a query for the next valid readable, writable, or executable virtual memory address after `offset`
+
+ \param offset a virtual address to start checking from
+ \return the next valid address
+ */
virtual uint64_t PerformGetNextValidOffset(uint64_t offset);
+
+ /*! PerformGetStart implements a query for the first readable, writable, or executable virtual address in the BinaryView
+
+ \return the first virtual address in the BinaryView
+ */
virtual uint64_t PerformGetStart() const { return 0; }
virtual uint64_t PerformGetLength() const { return 0; }
virtual uint64_t PerformGetEntryPoint() const { return 0; }
+
+ /*! PerformIsExecutable implements a check which returns true if the BinaryView is executable.
+
+ \return whether the BinaryView is executable
+ */
virtual bool PerformIsExecutable() const { return false; }
+
+ /*! PerformGetDefaultEndianness implements a check which returns the Endianness of the BinaryView
+
+ \return either LittleEndian or BigEndian
+ */
virtual BNEndianness PerformGetDefaultEndianness() const;
+
+ /*! PerformIsRelocatable implements a check which returns true if the BinaryView is relocatable.
+
+ \return whether the BinaryView is relocatable
+ */
virtual bool PerformIsRelocatable() const;
+
+ /*! PerformGetAddressSize implements a query for the address size for this BinaryView
+
+ \return the address size for this BinaryView
+ */
virtual size_t PerformGetAddressSize() const;
virtual bool PerformSave(FileAccessor* file);
@@ -1896,13 +2309,43 @@ namespace BinaryNinja {
virtual bool Init() { return true; }
+
+ /*!
+ \return FileMetadata for this BinaryView
+ */
FileMetadata* GetFile() const { return m_file; }
+
+ /*!
+ \return View that contains the raw data used by this view
+ */
Ref<BinaryView> GetParentView() const;
std::string GetTypeName() const;
+ /*!
+ \return Whether the file has unsaved modifications
+ */
bool IsModified() const;
+
+ /*!
+ \return Whether auto-analysis results have changed.
+ */
bool IsAnalysisChanged() const;
+
+ /*! Writes the current database (.bndb) out to the specified file.
+
+ \param path path and filename to write the bndb to. Should have ".bndb" appended to it.
+ \param settings Special save options
+ \return Whether the save was successful
+ */
bool CreateDatabase(const std::string& path, Ref<SaveSettings> settings = new SaveSettings());
+
+ /*! Writes the current database (.bndb) out to the specified file.
+
+ \param path path and filename to write the bndb to. Should have ".bndb" appended to it.
+ \param progressCallback callback function to send save progress to.
+ \param settings Special save options
+ \return Whether the save was successful
+ */
bool CreateDatabase(const std::string& path,
const std::function<bool(size_t progress, size_t total)>& progressCallback,
Ref<SaveSettings> settings = new SaveSettings());
@@ -1910,62 +2353,254 @@ namespace BinaryNinja {
bool SaveAutoSnapshot(const std::function<bool(size_t progress, size_t total)>& progressCallback,
Ref<SaveSettings> settings = new SaveSettings());
+ /*! Start recording actions taken so they can be undone at some point
+ */
void BeginUndoActions();
void AddUndoAction(UndoAction* action);
+
+ /*! Commit the actions taken since the last commit to the undo database.
+ */
void CommitUndoActions();
+ /*!
+ \return Whether it is possible to perform an Undo
+ */
bool CanUndo();
+
+ /*! Undo the last committed action in the undo database.
+ */
bool Undo();
+
+ /*!
+ \return Whether it is possible to perform a Redo
+ */
bool CanRedo();
+
+ /*! Redo the last committed action in the undo database.
+ */
bool Redo();
+ /*!
+ Get the current View name, e.g. ``Linear:ELF``, ``Graph:PE``
+
+ \return The current view name
+ */
std::string GetCurrentView();
+
+ /*!
+ Get the current offset in the current view
+
+ \return The current offset
+ */
uint64_t GetCurrentOffset();
+
+ /*!
+ Navigate to the specified virtual address in the specified view
+
+ \param view View name. e.g. ``Linear:ELF``, ``Graph:PE``
+ \param offset Virtual address to navigate to
+ \return Whether the navigation was successful.
+ */
bool Navigate(const std::string& view, uint64_t offset);
+ /*! Read writes `len` bytes at virtual address `offset` to address `dest`
+
+ \param dest Virtual address to write to
+ \param offset virtual address to read from
+ \param len number of bytes to read
+ \return amount of bytes read
+ */
size_t Read(void* dest, uint64_t offset, size_t len);
+
+ /*! ReadBuffer reads len bytes from a virtual address into a DataBuffer
+
+ \param offset virtual address to read from
+ \param len number of bytes to read
+ \return DataBuffer containing the read bytes
+ */
DataBuffer ReadBuffer(uint64_t offset, size_t len);
+ /*! Write writes `len` bytes data at address `dest` to virtual address `offset`
+
+ \param offset virtual address to write to
+ \param data address to read from
+ \param len number of bytes to write
+ \return amount of bytes written
+ */
size_t Write(uint64_t offset, const void* data, size_t len);
+
+ /*! WriteBuffer writes the contents of a DataBuffer into a virtual address
+
+ \param offset virtual address to write to
+ \param data DataBuffer containing the bytes to write
+ \return amount of bytes written
+ */
size_t WriteBuffer(uint64_t offset, const DataBuffer& data);
+ /*! Insert inserts `len` bytes data at address `dest` starting from virtual address `offset`
+
+ \param offset virtual address to start inserting from
+ \param data address to read from
+ \param len number of bytes to write
+ \return amount of bytes written
+ */
size_t Insert(uint64_t offset, const void* data, size_t len);
+
+ /*! InsertBuffer inserts the contents of a DataBuffer starting from a virtual address
+
+ \param offset virtual address to start inserting from
+ \param data DataBuffer containing the bytes to write
+ \return amount of bytes written
+ */
size_t InsertBuffer(uint64_t offset, const DataBuffer& data);
+ /*! PerformRemove removes `len` bytes from virtual address `offset`
+
+ \param offset the virtual offset to find and remove bytes from
+ \param len the number of bytes to be removed
+ \return length of data removed, 0 on error
+ */
size_t Remove(uint64_t offset, uint64_t len);
std::vector<float> GetEntropy(uint64_t offset, size_t len, size_t blockSize);
+ /*! GetModification checks whether the virtual address `offset` is modified.
+
+ \param offset a virtual address to be checked
+ \return one of Original, Changed, Inserted
+ */
BNModificationStatus GetModification(uint64_t offset);
std::vector<BNModificationStatus> GetModification(uint64_t offset, size_t len);
+ /*! IsValidOffset checks whether a virtual address `offset` is valid
+
+ \param offset the virtual address to check
+ \return whether the offset is valid
+ */
bool IsValidOffset(uint64_t offset) const;
+
+ /*! IsOffsetReadable checks whether a virtual address is readable
+
+ \param offset the virtual address to check
+ \return whether the offset is readable
+ */
bool IsOffsetReadable(uint64_t offset) const;
+
+ /*! IsOffsetWritable checks whether a virtual address is writable
+
+ \param offset the virtual address to check
+ \return whether the offset is writable
+ */
bool IsOffsetWritable(uint64_t offset) const;
+
+ /*! IsOffsetExecutable checks whether a virtual address is executable
+
+ \param offset the virtual address to check
+ \return whether the offset is executable
+ */
bool IsOffsetExecutable(uint64_t offset) const;
+
+ /*! IsOffsetBackedByFile checks whether a virtual address is backed by a file
+
+ \param offset the virtual address to check
+ \return whether the offset is backed by a file
+ */
bool IsOffsetBackedByFile(uint64_t offset) const;
bool IsOffsetCodeSemantics(uint64_t offset) const;
bool IsOffsetWritableSemantics(uint64_t offset) const;
bool IsOffsetExternSemantics(uint64_t offset) const;
+
+ /*! GetNextValidOffset implements a query for the next valid readable, writable, or executable virtual memory address after `offset`
+
+ \param offset a virtual address to start checking from
+ \return the next valid address
+ */
uint64_t GetNextValidOffset(uint64_t offset) const;
+ /*! GetStart queries for the first valid virtual address in the BinaryView
+
+ \return the start of the BinaryView
+ */
uint64_t GetStart() const;
+
+ /*! GetEnd queries for the first valid virtual address in the BinaryView
+
+ \return the end of the BinaryView
+ */
uint64_t GetEnd() const;
+
+ /*! GetLength queries for the total length of the BinaryView from start to end
+
+ \return the length of the BinaryView
+ */
uint64_t GetLength() const;
+
+ /*! GetEntryPoint returns the entry point of the executable in the BinaryView
+ *
+ \return the entry point
+ */
uint64_t GetEntryPoint() const;
+ /*! GetDefaultArchitecture returns the current "default architecture" for the BinaryView
+
+ \return the current default architecture
+ */
Ref<Architecture> GetDefaultArchitecture() const;
+
+ /*! SetDefaultArchitecture allows setting the default architecture for the BinaryView
+
+ \param arch the new default architecture
+ */
void SetDefaultArchitecture(Architecture* arch);
+
+ /*! GetDefaultPlatform returns the current default platform for the BinaryView
+
+ \return the current default Platform
+ */
Ref<Platform> GetDefaultPlatform() const;
+
+ /*! SetDefaultPlatform allows setting the default platform for the BinaryView
+
+ \param arch the new default platform
+ */
void SetDefaultPlatform(Platform* platform);
+ /*! GetDefaultEndianness returns the default endianness for the BinaryView
+
+ \return the current default Endianness, one of LittleEndian, BigEndian
+ */
BNEndianness GetDefaultEndianness() const;
+
+ /*! Whether the binary is relocatable
+
+ \return Whether the binary is relocatable
+ */
bool IsRelocatable() const;
+
+ /*! Address size of the binary
+
+ \return Address size of the binary
+ */
size_t GetAddressSize() const;
+ /*! Whether the binary is an executable
+
+ \return Whether the binary is an executable
+ */
bool IsExecutable() const;
+ /*! Save the original binary file to a FileAccessor
+
+ \param file a FileAccessor pointing to the location to save the binary
+ \return Whether the save was successful
+ */
bool Save(FileAccessor* file);
+
+ /*! Save the original binary file to the provided destination
+
+ \param path destination path and filename of the file to be written
+ \return Whether the save was successful
+ */
bool Save(const std::string& path);
void DefineRelocation(Architecture* arch, BNRelocationInfo& info, uint64_t target, uint64_t reloc);
@@ -1974,56 +2609,297 @@ namespace BinaryNinja {
std::vector<std::pair<uint64_t, uint64_t>> GetRelocationRangesAtAddress(uint64_t addr) const;
bool RangeContainsRelocation(uint64_t addr, size_t size) const;
+ /*! Provides a mechanism for receiving callbacks for various analysis events.
+
+ \param notify An instance of a class Subclassing BinaryDataNotification
+ */
void RegisterNotification(BinaryDataNotification* notify);
+
+ /*! Unregister a notification passed to RegisterNotification
+
+ \param notify An instance of a class Subclassing BinaryDataNotification
+ */
void UnregisterNotification(BinaryDataNotification* notify);
+ /*! Adds an analysis option. Analysis options elaborate the analysis phase. The user must start analysis by calling either UpdateAnalysis or UpdateAnalysisAndWait
+
+ \param name Name of the analysis option. Available options are "linearsweep" and "signaturematcher"
+ */
void AddAnalysisOption(const std::string& name);
+
+ /*! Add a new function of the given platform at the virtual address
+
+ \param platform Platform for the function to be loaded
+ \param addr Virtual adddress of the function to be loaded
+ */
void AddFunctionForAnalysis(Platform* platform, uint64_t addr);
+
+ /*! adds an virtual address to start analysis from for a given platform
+
+ \param platform Platform for the entry point analysis
+ \param start virtual address to start analysis from
+ */
void AddEntryPointForAnalysis(Platform* platform, uint64_t start);
+
+ /*! removes a function from the list of functions
+
+ \param func Function to be removed
+ */
void RemoveAnalysisFunction(Function* func);
+
+ /*! Add a new user function of the given platform at the virtual address
+
+ \param platform Platform for the function to be loaded
+ \param addr Virtual adddress of the function to be loaded
+ */
void CreateUserFunction(Platform* platform, uint64_t start);
+
+ /*! removes a user function from the list of functions
+
+ \param func Function to be removed
+ */
void RemoveUserFunction(Function* func);
+
+ /*! check for the presence of an initial analysis in this BinaryView.
+
+ \return Whether the BinaryView has an initial analysis
+ */
bool HasInitialAnalysis();
+
+ /*! Controls the analysis hold for this BinaryView. Enabling analysis hold defers all future
+ analysis updates, therefore causing UpdateAnalysis and UpdateAnalysisAndWait to take no action.
+
+ \param enable Whether to enable or disable the analysis hold
+ */
void SetAnalysisHold(bool enable);
+
+ /*! start the analysis running and dont return till it is complete
+
+ Analysis of BinaryViews does not occur automatically, the user must start analysis by calling either
+ UpdateAnalysis or UpdateAnalysisAndWait. An analysis update **must** be run after changes are made which could change
+ analysis results such as adding functions.
+ */
void UpdateAnalysisAndWait();
+
+ /*! asynchronously starts the analysis running and returns immediately.
+
+ Analysis of BinaryViews does not occur automatically, the user must start analysis by calling either
+ UpdateAnalysis or UpdateAnalysisAndWait. An analysis update **must** be run after changes are made which could change
+ analysis results such as adding functions.
+ */
void UpdateAnalysis();
+
+ /*! Abort the currently running analysis
+
+ This method should be considered non-recoverable and generally only used when shutdown is imminent after stopping.
+ */
void AbortAnalysis();
+ /*! Define a DataVariable at a given address with a set type
+
+ \param addr virtual address to define the DataVariable at
+ \param type Type for the DataVariable
+ */
void DefineDataVariable(uint64_t addr, const Confidence<Ref<Type>>& type);
+
+ /*! Define a user DataVariable at a given address with a set type
+
+ \param addr virtual address to define the DataVariable at
+ \param type Type for the DataVariable
+ */
void DefineUserDataVariable(uint64_t addr, const Confidence<Ref<Type>>& type);
+
+ /*! Undefine a DataVariable at a given address
+
+ \param addr virtual address of the DataVariable
+ */
void UndefineDataVariable(uint64_t addr);
+
+ /*! Undefine a user DataVariable at a given address
+
+ \param addr virtual address of the DataVariable
+ */
void UndefineUserDataVariable(uint64_t addr);
+ /*! Get a map of DataVariables defined in the current BinaryView
+
+ \return A map of addresses to the DataVariables defined at them
+ */
std::map<uint64_t, DataVariable> GetDataVariables();
+
+ /*! Get a DataVariable at a given address
+
+ \param addr Address for the DataVariable
+ \param var Reference to a DataVariable class to write to
+ \return Whether a DataVariable was successfully retrieved
+ */
bool GetDataVariableAtAddress(uint64_t addr, DataVariable& var);
+ /*! Get a list of functions within this BinaryView
+
+ \return vector of Functions within the BinaryView
+ */
std::vector<Ref<Function>> GetAnalysisFunctionList();
+
+ /*! Check whether the BinaryView has any functions defined
+
+ \return Whether the BinaryView has any functions defined
+ */
bool HasFunctions() const;
+
+
+ /*! Gets a function object for the function starting at a virtual address
+
+ \param platform Platform for the desired function
+ \param addr Starting virtual address for the function
+ \return the Function, if it exists
+ */
Ref<Function> GetAnalysisFunction(Platform* platform, uint64_t addr);
+
+ /*! Get the most recently used Function starting at a virtual address
+
+ \param addr Starting virtual address for the function
+ \return the Function, if it exists
+ */
Ref<Function> GetRecentAnalysisFunctionForAddress(uint64_t addr);
+
+ /*! Get a list of functions defined at an address
+
+ \param addr Starting virtual address for the function
+ \return vector of functions
+ */
std::vector<Ref<Function>> GetAnalysisFunctionsForAddress(uint64_t addr);
+
+ /*! Get a list of functions containing an address
+
+ \param addr Address to check
+ \return vector of Functions
+ */
std::vector<Ref<Function>> GetAnalysisFunctionsContainingAddress(uint64_t addr);
+
+ /*! Get the function defined as the Analysis entry point for the view
+
+ \return The analysis entry point function
+ */
Ref<Function> GetAnalysisEntryPoint();
+
+ /*! Get most recently used Basic Block containing a virtual address
+
+ \param addr Address within the BasicBlock
+ \return The BasicBlock if it exists
+ */
Ref<BasicBlock> GetRecentBasicBlockForAddress(uint64_t addr);
+
+ /*! Get a list of Basic Blocks containing a virtual address
+
+ \param addr Address to check
+ \return vector of basic blocks containing that address
+ */
std::vector<Ref<BasicBlock>> GetBasicBlocksForAddress(uint64_t addr);
+
+ /*! Get a list of basic blocks starting at a virtual address
+
+ \param addr Address to check
+ \return vector of basic blocks starting at that address
+ */
std::vector<Ref<BasicBlock>> GetBasicBlocksStartingAtAddress(uint64_t addr);
+ /*! Get Code References to a virtual address
+
+ \param addr Address to check
+ \return vector of ReferenceSources referencing the virtual address
+ */
std::vector<ReferenceSource> GetCodeReferences(uint64_t addr);
+
+ /*! Get Code References to a virtual address
+
+ \param addr Address to check
+ \param len Length of query
+ \return vector of ReferenceSources referencing the virtual address range
+ */
std::vector<ReferenceSource> GetCodeReferences(uint64_t addr, uint64_t len);
+
+ /*! Get code references from a ReferenceSource
+
+ \param src reference source
+ \return List of virtual addresses referenced by this source
+ */
std::vector<uint64_t> GetCodeReferencesFrom(ReferenceSource src);
+
+ /*! Get code references from a ReferenceSource
+
+ \param src reference source
+ \param len Length of query
+ \return List of virtual addresses referenced by this source
+ */
std::vector<uint64_t> GetCodeReferencesFrom(ReferenceSource src, uint64_t len);
+ /*! Get Data References to a virtual address
+
+ \param addr Address to check
+ \return vector of virtual addresses referencing the virtual address
+ */
std::vector<uint64_t> GetDataReferences(uint64_t addr);
+
+ /*! Get Data References to a virtual address
+
+ \param addr Address to check
+ \param len Length of query
+ \return vector of virtual addresses referencing the virtual address range
+ */
std::vector<uint64_t> GetDataReferences(uint64_t addr, uint64_t len);
+
+ /*! Get Data references from a virtual address
+
+ \param src reference source
+ \return List of virtual addresses referenced by this address
+ */
std::vector<uint64_t> GetDataReferencesFrom(uint64_t addr);
+
+ /*! Get Data references from a virtual address
+
+ \param src reference source
+ \param len Length of query
+ \return List of virtual addresses referenced by this address
+ */
std::vector<uint64_t> GetDataReferencesFrom(uint64_t addr, uint64_t len);
+
+ /*! Add a user Data Reference from a virtual address to another virtual address
+
+ \param fromAddr Address referencing the toAddr value
+ \param toAddr virtual address being referenced
+ */
void AddUserDataReference(uint64_t fromAddr, uint64_t toAddr);
+
+ /*! Remove a user Data Reference from a virtual address to another virtual address
+
+ \param fromAddr Address referencing the toAddr value
+ \param toAddr virtual address being referenced
+ */
void RemoveUserDataReference(uint64_t fromAddr, uint64_t toAddr);
// References to type
+
+ /*! Get code references to a Type
+
+ \param type QualifiedName for a Type
+ \return vector of ReferenceSources
+ */
std::vector<ReferenceSource> GetCodeReferencesForType(const QualifiedName& type);
+
+ /*! Get data references to a Type
+
+ \param type QualifiedName for a Type
+ \return vector of virtual addresses referencing this Type
+ */
std::vector<uint64_t> GetDataReferencesForType(const QualifiedName& type);
+
+ /*! Get Type references to a Type
+
+ \param type QualifiedName for a Type
+ \return vector of TypeReferenceSources to this Type
+ */
std::vector<TypeReferenceSource> GetTypeReferencesForType(const QualifiedName& type);
// References to type field
@@ -3121,24 +3997,101 @@ namespace BinaryNinja {
bool operator==(const Type& other);
bool operator!=(const Type& other);
+
+ /*! Retrieve the Type Class for this Structure
+
+ One of:
+ VoidTypeClass
+ BoolTypeClass
+ IntegerTypeClass
+ FloatTypeClass
+ StructureTypeClass
+ EnumerationTypeClass
+ PointerTypeClass
+ ArrayTypeClass
+ FunctionTypeClass
+ VarArgsTypeClass
+ ValueTypeClass
+ NamedTypeReferenceClass
+ WideCharTypeClass
+
+ \return The type class
+ */
BNTypeClass GetClass() const;
+
+ /*! Get the width in bytes of the Type
+
+ \return The type width
+ */
uint64_t GetWidth() const;
size_t GetAlignment() const;
+
+ /*! Get the QualifiedName for the Type
+
+ \return The QualifiedName for the type
+ */
QualifiedName GetTypeName() const;
+
+ /*! Whether the type is signed
+ */
Confidence<bool> IsSigned() const;
+
+ /*! Whether the type is constant
+
+ */
Confidence<bool> IsConst() const;
- Confidence<bool> IsVolatile() const;
+ Confidence<bool> IsVolatile() const; // Unimplemented!
bool IsSystemCall() const;
+
+ /*! Get the child type for this Type if one exists
+
+ \return The child type
+ */
Confidence<Ref<Type>> GetChildType() const;
+
+ /*! For Function Types, get the calling convention
+
+ \return The CallingConvention
+ */
Confidence<Ref<CallingConvention>> GetCallingConvention() const;
+
+ /*! For Function Types, get a list of parameters
+
+ \return A vector of FunctionParameters
+ */
std::vector<FunctionParameter> GetParameters() const;
+
+ /*! For Function Types, whether the Function has variadic arguments
+
+ \return Whether the function has variable arguments
+ */
Confidence<bool> HasVariableArguments() const;
+
+ /*! For Function Types, whether a function can return (is not marked noreturn)
+
+ \return Whether the function can return
+ */
Confidence<bool> CanReturn() const;
+
+ /*! For Structure Types, the underlying Structure
+
+ \return The underlying structure
+ */
Ref<Structure> GetStructure() const;
+
+ /*! For Enumeration Types, the underlying Enumeration
+
+ \return The underlying enumeration
+ */
Ref<Enumeration> GetEnumeration() const;
+
+ /*! For NamedTypeReference Types, the underlying NamedTypeReference
+
+ \return The underlying NamedTypeReference
+ */
Ref<NamedTypeReference> GetNamedTypeReference() const;
- Confidence<BNMemberScope> GetScope() const;
+ Confidence<BNMemberScope> GetScope() const; // Unimplemented!
Confidence<int64_t> GetStackAdjustment() const;
QualifiedName GetStructureName() const;
Ref<NamedTypeReference> GetRegisteredName() const;
@@ -3165,11 +4118,44 @@ namespace BinaryNinja {
Ref<Type> Duplicate() const;
+
+ /*! Create a "void" type
+
+ \return The created Type object
+ */
static Ref<Type> VoidType();
+
+ /*! Create a "bool" type
+
+ \return The created Type object
+ */
static Ref<Type> BoolType();
+
+ /*! Create a signed or unsigned integer with a set width
+
+ \param width Width of the Type in bytes
+ \param sign Whether the integer is a signed or unsigned type
+ \param altName Alternative name for the type
+ \return The created Type object
+ */
static Ref<Type> IntegerType(size_t width, const Confidence<bool>& sign, const std::string& altName = "");
+
+ /*! Create a float or double Type with a specified width
+
+ \param width Width of the Type in bytes
+ \param altName Alternative name for the type
+ \return The created Type object
+ */
static Ref<Type> FloatType(size_t width, const std::string& altName = "");
static Ref<Type> WideCharType(size_t width, const std::string& altName = "");
+
+ /*! Create a Type object from a Structure object
+
+ Structure objects can be generated using the StructureBuilder class.
+
+ \param strct Structure object
+ \return The created Type object
+ */
static Ref<Type> StructureType(Structure* strct);
static Ref<Type> NamedType(NamedTypeReference* ref, size_t width = 0, size_t align = 1,
const Confidence<bool>& cnst = Confidence<bool>(false, 0),
@@ -3181,17 +4167,105 @@ namespace BinaryNinja {
const Confidence<bool>& isSigned = Confidence<bool>(false, 0));
static Ref<Type> EnumerationType(
Enumeration* enm, size_t width, const Confidence<bool>& isSigned = Confidence<bool>(false, 0));
+
+ /*! Create a Pointer type, which points to another Type
+
+ \code{.cpp}
+ // Creating a "char *" type
+ auto arch = bv->GetDefaultArchitecture();
+ auto charPointerType = Type::PointerType(arch, Type::IntegerType(1, false));
+ \endcode
+
+ \param arch Architecture, used to calculate the proper pointer width
+ \param type Type that this Type points to
+ \param cnst Whether this type is const
+ \param vltl Whether this type is volatile
+ \param refType Reference Type, one of "PointerReferenceType", "ReferenceReferenceType", "RValueReferenceType", "NoReference"
+ \return The created type
+ */
static Ref<Type> PointerType(Architecture* arch, const Confidence<Ref<Type>>& type,
const Confidence<bool>& cnst = Confidence<bool>(false, 0),
const Confidence<bool>& vltl = Confidence<bool>(false, 0), BNReferenceType refType = PointerReferenceType);
+
+ /*! Create a Pointer type, which points to another Type
+
+ \code{.cpp}
+ // Creating a "char *" type in a binary compiled for 64 bit address spaces
+ auto charPointerType = Type::PointerType(8, Type::IntegerType(1, false));
+ \endcode
+
+ \param width Width of the pointer in bytes
+ \param type Type that this type points to
+ \param cnst Whether this type is const
+ \param vltl Whether this type is volatile
+ \param refType Reference Type, one of "PointerReferenceType", "ReferenceReferenceType", "RValueReferenceType", "NoReference"
+ \return The created type
+ */
static Ref<Type> PointerType(size_t width, const Confidence<Ref<Type>>& type,
const Confidence<bool>& cnst = Confidence<bool>(false, 0),
const Confidence<bool>& vltl = Confidence<bool>(false, 0), BNReferenceType refType = PointerReferenceType);
+
+ /*! Create an Array Type
+
+ \param type Type for Elements contained in this Array
+ \param elem Number of elements
+ \return The created Type
+ */
static Ref<Type> ArrayType(const Confidence<Ref<Type>>& type, uint64_t elem);
+
+ /*! Create a Function Type
+
+ \code{.cpp}
+ Ref<Type> retType = Type::VoidType();
+
+ std::vector<FunctionParameter> params
+ auto cc = bv->GetDefaultPlatform()->GetDefaultCallingConvention();
+
+ params.push_back({"arg0",
+ Type::IntegerType(8, false),
+ true,
+ Variable()});
+
+ auto functionType = Type::FunctionType(retType, cc, params);
+ \endcode
+
+ \param returnValue Return value Type
+ \param callingConvention Calling convention for the function
+ \param params list of FunctionParameter s
+ \param varArg Whether this function has variadic arguments, default false
+ \param stackAdjust Stack adjustment for this function, default 0
+ \return The created function types
+ */
static Ref<Type> FunctionType(const Confidence<Ref<Type>>& returnValue,
const Confidence<Ref<CallingConvention>>& callingConvention, const std::vector<FunctionParameter>& params,
const Confidence<bool>& varArg = Confidence<bool>(false, 0),
const Confidence<int64_t>& stackAdjust = Confidence<int64_t>(0, 0));
+
+ /*! Create a Function Type
+
+ \code{.cpp}
+ Ref<Type> retType = Type::VoidType();
+
+ std::vector<FunctionParameter> params
+ auto cc = bv->GetDefaultPlatform()->GetDefaultCallingConvention();
+
+ params.push_back({"arg0",
+ Type::IntegerType(8, false),
+ true,
+ Variable()});
+
+ auto functionType = Type::FunctionType(retType, cc, params);
+ \endcode
+
+ \param returnValue Return value Type
+ \param callingConvention Calling convention for the function
+ \param params list of FunctionParameters
+ \param varArg Whether this function has variadic arguments, default false
+ \param stackAdjust Stack adjustment for this function, default 0
+ \param regStackAdjust Register stack adjustmemt
+ \param returnRegs Return registers
+ \return The created function types
+ */
static Ref<Type> FunctionType(const Confidence<Ref<Type>>& returnValue,
const Confidence<Ref<CallingConvention>>& callingConvention,
const std::vector<FunctionParameter>& params,
@@ -3208,31 +4282,136 @@ namespace BinaryNinja {
static std::string GenerateAutoDebugTypeId(const QualifiedName& name);
static std::string GetAutoDebugTypeIdSource();
+ /*! Get this type wrapped in a Confidence template
+
+ \param conf Confidence value between 0 and 255
+ \return Confidence-wrapped Type
+ */
Confidence<Ref<Type>> WithConfidence(uint8_t conf);
+ /*! If this Type is a NamedTypeReference, check whether it is reference to a specific Type
+
+ \param refType BNNamedTypeReference to check it against
+ \return Whether it is a reference of this type
+ */
bool IsReferenceOfType(BNNamedTypeReferenceClass refType);
+
+ /*! If this Type is a NamedTypeReference, check whether it refers to a Struct Type
+
+ \return Whether it refers to a struct type.
+ */
bool IsStructReference() { return IsReferenceOfType(StructNamedTypeClass); }
+
+ /*! If this Type is a NamedTypeReference, check whether it refers to an Enum Type
+
+ \return Whether it refers to an Enum type.
+ */
bool IsEnumReference() { return IsReferenceOfType(EnumNamedTypeClass); }
+
+ /*! If this Type is a NamedTypeReference, check whether it refers to a Union Type
+
+ \return Whether it refers to a union type.
+ */
bool IsUnionReference() { return IsReferenceOfType(UnionNamedTypeClass); }
+
+ /*! If this Type is a NamedTypeReference, check whether it refers to a Class Type
+
+ \return Whether it refers to a class type.
+ */
bool IsClassReference() { return IsReferenceOfType(ClassNamedTypeClass); }
+
+ /*! If this Type is a NamedTypeReference, check whether it refers to a Typedef type
+
+ \return Whether it refers to a typedef type.
+ */
+
bool IsTypedefReference() { return IsReferenceOfType(TypedefNamedTypeClass); }
+
+ /*! If this Type is a NamedTypeReference, check whether it refers to a Struct or Class Type
+
+ \return Whether it refers to a struct or class type.
+ */
bool IsStructOrClassReference()
{
return IsReferenceOfType(StructNamedTypeClass) || IsReferenceOfType(ClassNamedTypeClass);
}
+ /*! Check whether this type is a Void type.
+
+ \return Whether this->GetClass() == VoidTypeClass
+ */
bool IsVoid() const { return GetClass() == VoidTypeClass; }
+
+ /*! Check whether this type is a Boolean type.
+
+ \return Whether this->GetClass() == BoolTypeClass
+ */
bool IsBool() const { return GetClass() == BoolTypeClass; }
+
+ /*! Check whether this type is an Integer type.
+
+ \return Whether this->GetClass() == IntegerTypeClass
+ */
bool IsInteger() const { return GetClass() == IntegerTypeClass; }
+
+ /*! Check whether this type is a Float type.
+
+ \return Whether this->GetClass() == FloatTypeClass
+ */
bool IsFloat() const { return GetClass() == FloatTypeClass; }
+
+ /*! Check whether this type is a Structure type.
+
+ \return Whether this->GetClass() == StructureTypeClass
+ */
bool IsStructure() const { return GetClass() == StructureTypeClass; }
+
+ /*! Check whether this type is an Enumeration type.
+
+ \return Whether this->GetClass() == EnumerationTypeClass
+ */
bool IsEnumeration() const { return GetClass() == EnumerationTypeClass; }
+
+ /*! Check whether this type is a Pointer type.
+
+ \return Whether this->GetClass() == PointerTypeClass
+ */
bool IsPointer() const { return GetClass() == PointerTypeClass; }
+
+ /*! Check whether this type is an Array type.
+
+ \return Whether this->GetClass() == ArrayTypeClass
+ */
bool IsArray() const { return GetClass() == ArrayTypeClass; }
+
+ /*! Check whether this type is a Function type.
+
+ \return Whether this->GetClass() == FunctionTypeClass
+ */
bool IsFunction() const { return GetClass() == FunctionTypeClass; }
+
+ /*! Check whether this type is a Variadic Arguments type.
+
+ \return Whether this->GetClass() == VarArgsTypeClass
+ */
bool IsVarArgs() const { return GetClass() == VarArgsTypeClass; }
+
+ /*! Check whether this type is a Value type.
+
+ \return Whether this->GetClass() == ValueTypeClass
+ */
bool IsValue() const { return GetClass() == ValueTypeClass; }
+
+ /*! Check whether this type is a Named Type Reference type.
+
+ \return Whether this->GetClass() == NamedTypeReferenceClass
+ */
bool IsNamedTypeRefer() const { return GetClass() == NamedTypeReferenceClass; }
+
+ /*! Check whether this type is a Wide Char type.
+
+ \return Whether this->GetClass() == WideCharTypeClass
+ */
bool IsWideChar() const { return GetClass() == WideCharTypeClass; }
Ref<Type> WithReplacedStructure(Structure* from, Structure* to);
@@ -3468,9 +4647,24 @@ namespace BinaryNinja {
StructureBuilder& operator=(Structure* s);
BNStructureBuilder* GetObject() { return m_object; };
+ /*! Complete the structure building process and return a Structure object
+
+ \return a built Structure object
+ */
Ref<Structure> Finalize() const;
+ /*! GetMembers returns a list of structure members
+
+ \return vector of StructureMember objects
+ */
std::vector<StructureMember> GetMembers() const;
+
+ /*! GetMemberByName retrieves a structure member by name
+
+ \param name Name of the member (field)
+ \param result Reference to a StructureMember object the field will be passed to
+ \return Whether a StructureMember was successfully retrieved
+ */
bool GetMemberByName(const std::string& name, StructureMember& result) const;
bool GetMemberAtOffset(int64_t offset, StructureMember& result) const;
bool GetMemberAtOffset(int64_t offset, StructureMember& result, size_t& idx) const;
@@ -3481,13 +4675,59 @@ namespace BinaryNinja {
bool IsPacked() const;
StructureBuilder& SetPacked(bool packed);
bool IsUnion() const;
+
+ /*! Set the structure type
+
+ \param type One of: ClassStructureType, StructStructureType, UnionStructureType
+ \return reference to this StructureBuilder
+ */
StructureBuilder& SetStructureType(BNStructureVariant type);
+
+ /*! Get the Structure Type
+
+ \return One of: ClassStructureType, StructStructureType, UnionStructureType
+ */
BNStructureVariant GetStructureType() const;
+
+ /*! AddMember adds a member (field) to a structure
+
+ \param type Type of the Field
+ \param name Name of the field
+ \param access Optional, One of NoAccess, PrivateAccess, ProtectedAccess, PublicAccess
+ \param scope Optional, One of NoScope, StaticScope, VirtualScope, ThunkScope, FriendScope
+ \return reference to the Structure Builder
+ */
StructureBuilder& AddMember(const Confidence<Ref<Type>>& type, const std::string& name,
BNMemberAccess access = NoAccess, BNMemberScope scope = NoScope);
+
+ /*! AddMemberAtOffset adds a member at a specific offset within the struct
+
+ \param type Type of the Field
+ \param name Name of the field
+ \param offset Offset to add the member within the struct
+ \param overwriteExisting Whether to overwrite an existing member at that offset, Optional, default true
+ \param access One of NoAccess, PrivateAccess, ProtectedAccess, PublicAccess
+ \param scope One of NoScope, StaticScope, VirtualScope, ThunkScope, FriendScope
+ \return Reference to the StructureBuilder
+ */
StructureBuilder& AddMemberAtOffset(const Confidence<Ref<Type>>& type, const std::string& name, uint64_t offset,
bool overwriteExisting = true, BNMemberAccess access = NoAccess, BNMemberScope scope = NoScope);
+
+ /*! RemoveMember removes a member at a specified index
+
+ \param idx Index to remove
+ \return Reference to the StructureBuilder
+ */
StructureBuilder& RemoveMember(size_t idx);
+
+ /*! ReplaceMember replaces a member at an index
+
+ \param idx Index of the StructureMember to be replaced
+ \param type Type of the new Member
+ \param name Name of the new Member
+ \param overwriteExisting Whether to overwrite the existing member, default true
+ \return Reference to the StructureBuilder
+ */
StructureBuilder& ReplaceMember(
size_t idx, const Confidence<Ref<Type>>& type, const std::string& name, bool overwriteExisting = true);
};
@@ -3523,13 +4763,49 @@ namespace BinaryNinja {
EnumerationBuilder& operator=(EnumerationBuilder&& e);
EnumerationBuilder& operator=(Enumeration* e);
+ /*! Finalize the building process and return the built Enumeration
+
+ \return the Enumeration
+ */
Ref<Enumeration> Finalize() const;
+ /*! Get a list of members in this enum
+
+ \return list of EnumerationMember
+ */
std::vector<EnumerationMember> GetMembers() const;
+ /*! Add a member to the enum.
+
+ \note If there is already a member in the Enum, the value of newly added ones will be the value of the previously added one + 1
+
+ \param name Name of the enum member
+ \return A reference to this EnumerationBuilder
+ */
EnumerationBuilder& AddMember(const std::string& name);
+
+ /*! Add a member to the enum with a set value
+
+ \param name Name of the enum member
+ \param value Value of th enum member
+ \return A reference to this EnumerationBuilder
+ */
EnumerationBuilder& AddMemberWithValue(const std::string& name, uint64_t value);
+
+ /*! Remove a member from the enum
+
+ \param idx Index to remove
+ \return A reference to this EnumerationBuilder
+ */
EnumerationBuilder& RemoveMember(size_t idx);
+
+ /*! Replace a member at an index
+
+ \param idx Index to replace
+ \param name Name of the new member
+ \param value Value of the new member
+ \return A reference to this EnumerationBuilder
+ */
EnumerationBuilder& ReplaceMember(size_t idx, const std::string& name, uint64_t value);
};
@@ -3834,27 +5110,119 @@ namespace BinaryNinja {
Function(BNFunction* func);
virtual ~Function();
+ /*! Get the BinaryView this Function is defined in
+
+ \return a BinaryView reference
+ */
Ref<BinaryView> GetView() const;
+
+ /*! Get the architecture this function was defined with
+
+ \return an Architecture reference
+ */
Ref<Architecture> GetArchitecture() const;
+
+ /*! Get the platform this function was defined with
+
+ \return a Platform reference
+ */
Ref<Platform> GetPlatform() const;
+
+ /*! Get the starting virtual address of this function
+
+ \return the start address
+ */
uint64_t GetStart() const;
+
+ /*! Get the Symbol for this function
+
+ \return a Symbol reference
+ */
Ref<Symbol> GetSymbol() const;
+
+ /*! Whether this function was automatically discovered by analysis
+
+ \return Whether the function was automatically discovered
+ */
bool WasAutomaticallyDiscovered() const;
+
+ /*! Whether this function has user annotations
+
+ \return Whether this function has user annotations
+ */
bool HasUserAnnotations() const;
+
+ /*! Whether this function can return
+
+ \return Whether this function can return
+ */
Confidence<bool> CanReturn() const;
+
+ /*! Whether this function has an explicitly defined type
+
+ \return Whether this function has an explicitly defined type
+ */
bool HasExplicitlyDefinedType() const;
+
+ /*! Whether this function needs update
+
+ \return Whether this function needs update
+ */
bool NeedsUpdate() const;
+ /*! Get a list of Basic Blocks for this function
+
+ \return a list of BasicBlock references for this function
+ */
std::vector<Ref<BasicBlock>> GetBasicBlocks() const;
+
+ /*! Get the basic block an address is located in
+
+ \param arch Architecture for the basic block
+ \param addr Address to check
+ \return
+ */
Ref<BasicBlock> GetBasicBlockAtAddress(Architecture* arch, uint64_t addr) const;
+
+ /*! Mark this function as recently used
+ */
void MarkRecentUse();
+ /*! Get the function comment
+
+ \return The function comment
+ */
std::string GetComment() const;
+
+ /*! Get a comment located at an address
+
+ \return The comment at an address
+ */
std::string GetCommentForAddress(uint64_t addr) const;
+
+ /*! Get a list of addresses with comments
+
+ \return A list of virtual addresses with comments
+ */
std::vector<uint64_t> GetCommentedAddresses() const;
+
+ /*! Set the comment for the function
+
+ \param comment The new function comment
+ */
void SetComment(const std::string& comment);
+
+ /*! Set the comment at an address
+
+ \param addr Address for the comment
+ \param comment Text of the comment
+ */
void SetCommentForAddress(uint64_t addr, const std::string& comment);
+ /*! Get a list of callsites for this function
+
+ \return a list of ReferenceSource
+ */
std::vector<ReferenceSource> GetCallSites() const;
void AddUserCodeReference(Architecture* fromArch, uint64_t fromAddr, uint64_t toAddr);
@@ -3866,8 +5234,24 @@ namespace BinaryNinja {
void RemoveUserTypeFieldReference(
Architecture* fromArch, uint64_t fromAddr, const QualifiedName& name, uint64_t offset, size_t size = 0);
+ /*! Get the LLIL for this function
+
+ \return a LowLevelILFunction reference
+ */
Ref<LowLevelILFunction> GetLowLevelIL() const;
+
+ /*! Get the LLIL for this function if it is available
+
+ \return a LowLevelILFunction reference
+ */
Ref<LowLevelILFunction> GetLowLevelILIfAvailable() const;
+
+ /*! Get the Low Level IL Instruction start for an instruction at an address
+
+ \param arch Architecture for the instruction
+ \param addr Address of the instruction
+ \return Start address of the instruction
+ */
size_t GetLowLevelILForInstruction(Architecture* arch, uint64_t addr);
std::set<size_t> GetLowLevelILInstructionsForAddress(Architecture* arch, uint64_t addr);
std::vector<size_t> GetLowLevelILExitsForInstruction(Architecture* arch, uint64_t addr);
diff --git a/python/binaryview.py b/python/binaryview.py
index fe182925..d8a5d387 100644
--- a/python/binaryview.py
+++ b/python/binaryview.py
@@ -3138,7 +3138,7 @@ class BinaryView:
def perform_get_default_endianness(self) -> Endianness:
"""
- ``perform_get_default_endianness`` implements a check which returns true if the BinaryView is executable.
+ ``perform_get_default_endianness`` implements a check which returns the Endianness of the BinaryView
.. note:: This method **may** be implemented for custom BinaryViews that are not LittleEndian.
@@ -3303,18 +3303,25 @@ class BinaryView:
def navigate(self, view_name: str, offset: int) -> bool:
"""
- ``navigate`` navigates the UI to the specified virtual address
+ ``navigate`` navigates the UI to the specified virtual address in the specified View
- .. note:: Despite the confusing name, ``view`` in this context is not a BinaryView but rather a string describing the different UI Views. Check :py:attr:`view` while in different views to see examples such as ``Linear:ELF``, ``Graph:PE``.
+ The View name is created by combining a View type (e.g. "Graph") with a BinaryView type (e.g. "Mach-O"),
+ seperated by a colon, resulting in something like "Graph:Mach-O".
- :param str view: virtual address to read from.
+ :param str view_name: View name.
:param int offset: address to navigate to
- :return: whether or not navigation succeeded
+ :return: whether navigation succeeded
:rtype: bool
:Example:
- >>> import random
- >>> bv.navigate(bv.view, random.choice(list(bv.functions)).start)
+ >>> bv.navigate(bv.view, bv.start)
+ True
+ >>> bv.file.existing_views
+ ['Mach-O', 'Raw']
+ >>> import binaryninjaui
+ >>> [i.getName() for i in binaryninjaui.ViewType.getTypes()]
+ ['Graph', 'Hex', 'Linear', 'Strings', 'Types', 'Triage', 'Bytes']
+ >>> bv.navigate('Graph:Mach-O', bv.entry_point)
True
"""
return self._file.navigate(view_name, offset)
@@ -3598,7 +3605,7 @@ class BinaryView:
def add_entry_point(self, addr: int, plat: Optional['_platform.Platform'] = None) -> None:
"""
- ``add_entry_point`` adds an virtual address to start analysis from for a given plat.
+ ``add_entry_point`` adds a virtual address to start analysis from for a given plat.
:param int addr: virtual address to start analysis from
:param Platform plat: Platform for the entry point analysis
@@ -3912,7 +3919,7 @@ class BinaryView:
``get_function_at`` gets a Function object for the function that starts at virtual address ``addr``:
:param int addr: starting virtual address of the desired function
- :param Platform plat: plat of the desired function
+ :param Platform plat: platform of the desired function
:return: returns a Function object or None for the function at the virtual address provided
:rtype: Function
:Example:
diff --git a/python/filemetadata.py b/python/filemetadata.py
index bd9a9954..6b655fee 100644
--- a/python/filemetadata.py
+++ b/python/filemetadata.py
@@ -165,6 +165,7 @@ class FileMetadata:
@property
def nav(self) -> Optional[NavigationHandler]:
+ """Navigation handler for this FileMetadata (read/write)"""
return self._nav
@nav.setter
@@ -304,7 +305,7 @@ class FileMetadata:
def begin_undo_actions(self) -> None:
"""
- ``begin_undo_actions`` start recording actions taken so the can be undone at some point.
+ ``begin_undo_actions`` start recording actions taken so they can be undone at some point.
:rtype: None
:Example:
@@ -502,7 +503,7 @@ class FileMetadata:
if view_type is None:
return None
- assert self.raw is not None, "BinaryView.save_auto_snapshot called when raw view is None"
+ assert self.raw is not None, "BinaryView.get_view_of_type called when raw view is None"
view = core.BNCreateBinaryViewOfType(view_type, self.raw.handle)
if view is None:
return None
diff --git a/python/types.py b/python/types.py
index ea70a6c5..2734f0a9 100644
--- a/python/types.py
+++ b/python/types.py
@@ -336,6 +336,7 @@ class CoreSymbol:
@property
def auto(self) -> bool:
+ """Whether the symbol was auto-defined"""
return core.BNIsSymbolAutoDefined(self._handle)
@property