From ac9ce67100986de601b31ac17f38147421c03c6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mazzucotelli?= Date: Mon, 8 Jan 2024 17:35:42 +0100 Subject: [PATCH] Deployed 1460cfb with MkDocs version: 1.5.3 --- 404.html | 2 +- assets/_markdown_exec_ansi.css | 266 ------------------ assets/javascripts/bundle.8e8db93a.min.js | 3 + assets/javascripts/bundle.a5ca32a6.min.js | 3 - assets/stylesheets/main.382dd0b9.min.css | 1 - assets/stylesheets/main.67c3bdf0.min.css | 1 + changelog/index.html | 2 +- code_of_conduct/index.html | 2 +- contributing/index.html | 4 +- credits/index.html | 2 +- index.html | 8 +- insiders/changelog/index.html | 2 +- insiders/index.html | 4 +- insiders/installation/index.html | 4 +- license/index.html | 4 +- reference/SUMMARY/index.html | 2 +- .../python/debug/index.html | 4 +- .../python/handler/index.html | 4 +- .../mkdocstrings_handlers/python/index.html | 4 +- .../python/rendering/index.html | 4 +- search/search_index.json | 2 +- sitemap.xml | 50 ++-- sitemap.xml.gz | Bin 423 -> 424 bytes usage/configuration/docstrings/index.html | 4 +- usage/configuration/general/index.html | 4 +- usage/configuration/headings/index.html | 8 +- usage/configuration/members/index.html | 6 +- usage/configuration/signatures/index.html | 6 +- usage/customization/index.html | 4 +- usage/docstrings/google/index.html | 4 +- usage/docstrings/numpy/index.html | 2 +- usage/docstrings/sphinx/index.html | 2 +- usage/extensions/index.html | 4 +- usage/index.html | 8 +- 34 files changed, 82 insertions(+), 348 deletions(-) delete mode 100644 assets/_markdown_exec_ansi.css create mode 100644 assets/javascripts/bundle.8e8db93a.min.js delete mode 100644 assets/javascripts/bundle.a5ca32a6.min.js delete mode 100644 assets/stylesheets/main.382dd0b9.min.css create mode 100644 assets/stylesheets/main.67c3bdf0.min.css diff --git a/404.html b/404.html index 9b14e7bb..4ed6b670 100644 --- a/404.html +++ b/404.html @@ -1 +1 @@ - mkdocstrings-python

404 - Not found

\ No newline at end of file + mkdocstrings-python

404 - Not found

\ No newline at end of file diff --git a/assets/_markdown_exec_ansi.css b/assets/_markdown_exec_ansi.css deleted file mode 100644 index 4c1b8a56..00000000 --- a/assets/_markdown_exec_ansi.css +++ /dev/null @@ -1,266 +0,0 @@ -/* - Inspired by https://spec.draculatheme.com/ specification, they should work - decently with both dark and light themes. - */ -:root { - --ansi-red: #ff5555; - --ansi-green: #50fa7b; - --ansi-blue: #265285; - --ansi-yellow: #ffb86c; - --ansi-magenta: #bd93f9; - --ansi-cyan: #8be9fd; - --ansi-black: #282a36; - --ansi-white: #f8f8f2; -} - -.-Color-Green, -.-Color-Faint-Green, -.-Color-Bold-Green { - color: var(--ansi-green); -} - -.-Color-Red, -.-Color-Faint-Red, -.-Color-Bold-Red { - color: var(--ansi-red); -} - -.-Color-Yellow, -.-Color-Faint-Yellow, -.-Color-Bold-Yellow { - color: var(--ansi-yellow); -} - -.-Color-Blue, -.-Color-Faint-Blue, -.-Color-Bold-Blue { - color: var(--ansi-blue); -} - -.-Color-Magenta, -.-Color-Faint-Magenta, -.-Color-Bold-Magenta { - color: var(--ansi-magenta); -} - -.-Color-Cyan, -.-Color-Faint-Cyan, -.-Color-Bold-Cyan { - color: var(--ansi-cyan); -} - -.-Color-White, -.-Color-Faint-White, -.-Color-Bold-White { - color: var(--ansi-white); -} - -.-Color-Black, -.-Color-Faint-Black, -.-Color-Bold-Black { - color: var(--ansi-black); -} - -.-Color-Faint { - opacity: 0.5; -} - -.-Color-Bold { - font-weight: bold; -} - -.-Color-BGBlack, -.-Color-Black-BGBlack, -.-Color-Blue-BGBlack, -.-Color-Bold-BGBlack, -.-Color-Bold-Black-BGBlack, -.-Color-Bold-Green-BGBlack, -.-Color-Bold-Cyan-BGBlack, -.-Color-Bold-Blue-BGBlack, -.-Color-Bold-Magenta-BGBlack, -.-Color-Bold-Red-BGBlack, -.-Color-Bold-White-BGBlack, -.-Color-Bold-Yellow-BGBlack, -.-Color-Cyan-BGBlack, -.-Color-Green-BGBlack, -.-Color-Magenta-BGBlack, -.-Color-Red-BGBlack, -.-Color-White-BGBlack, -.-Color-Yellow-BGBlack { - background-color: var(--ansi-black); -} - -.-Color-BGRed, -.-Color-Black-BGRed, -.-Color-Blue-BGRed, -.-Color-Bold-BGRed, -.-Color-Bold-Black-BGRed, -.-Color-Bold-Green-BGRed, -.-Color-Bold-Cyan-BGRed, -.-Color-Bold-Blue-BGRed, -.-Color-Bold-Magenta-BGRed, -.-Color-Bold-Red-BGRed, -.-Color-Bold-White-BGRed, -.-Color-Bold-Yellow-BGRed, -.-Color-Cyan-BGRed, -.-Color-Green-BGRed, -.-Color-Magenta-BGRed, -.-Color-Red-BGRed, -.-Color-White-BGRed, -.-Color-Yellow-BGRed { - background-color: var(--ansi-red); -} - -.-Color-BGGreen, -.-Color-Black-BGGreen, -.-Color-Blue-BGGreen, -.-Color-Bold-BGGreen, -.-Color-Bold-Black-BGGreen, -.-Color-Bold-Green-BGGreen, -.-Color-Bold-Cyan-BGGreen, -.-Color-Bold-Blue-BGGreen, -.-Color-Bold-Magenta-BGGreen, -.-Color-Bold-Red-BGGreen, -.-Color-Bold-White-BGGreen, -.-Color-Bold-Yellow-BGGreen, -.-Color-Cyan-BGGreen, -.-Color-Green-BGGreen, -.-Color-Magenta-BGGreen, -.-Color-Red-BGGreen, -.-Color-White-BGGreen, -.-Color-Yellow-BGGreen { - background-color: var(--ansi-green); -} - -.-Color-BGYellow, -.-Color-Black-BGYellow, -.-Color-Blue-BGYellow, -.-Color-Bold-BGYellow, -.-Color-Bold-Black-BGYellow, -.-Color-Bold-Green-BGYellow, -.-Color-Bold-Cyan-BGYellow, -.-Color-Bold-Blue-BGYellow, -.-Color-Bold-Magenta-BGYellow, -.-Color-Bold-Red-BGYellow, -.-Color-Bold-White-BGYellow, -.-Color-Bold-Yellow-BGYellow, -.-Color-Cyan-BGYellow, -.-Color-Green-BGYellow, -.-Color-Magenta-BGYellow, -.-Color-Red-BGYellow, -.-Color-White-BGYellow, -.-Color-Yellow-BGYellow { - background-color: var(--ansi-yellow); -} - -.-Color-BGBlue, -.-Color-Black-BGBlue, -.-Color-Blue-BGBlue, -.-Color-Bold-BGBlue, -.-Color-Bold-Black-BGBlue, -.-Color-Bold-Green-BGBlue, -.-Color-Bold-Cyan-BGBlue, -.-Color-Bold-Blue-BGBlue, -.-Color-Bold-Magenta-BGBlue, -.-Color-Bold-Red-BGBlue, -.-Color-Bold-White-BGBlue, -.-Color-Bold-Yellow-BGBlue, -.-Color-Cyan-BGBlue, -.-Color-Green-BGBlue, -.-Color-Magenta-BGBlue, -.-Color-Red-BGBlue, -.-Color-White-BGBlue, -.-Color-Yellow-BGBlue { - background-color: var(--ansi-blue); -} - -.-Color-BGMagenta, -.-Color-Black-BGMagenta, -.-Color-Blue-BGMagenta, -.-Color-Bold-BGMagenta, -.-Color-Bold-Black-BGMagenta, -.-Color-Bold-Green-BGMagenta, -.-Color-Bold-Cyan-BGMagenta, -.-Color-Bold-Blue-BGMagenta, -.-Color-Bold-Magenta-BGMagenta, -.-Color-Bold-Red-BGMagenta, -.-Color-Bold-White-BGMagenta, -.-Color-Bold-Yellow-BGMagenta, -.-Color-Cyan-BGMagenta, -.-Color-Green-BGMagenta, -.-Color-Magenta-BGMagenta, -.-Color-Red-BGMagenta, -.-Color-White-BGMagenta, -.-Color-Yellow-BGMagenta { - background-color: var(--ansi-magenta); -} - -.-Color-BGCyan, -.-Color-Black-BGCyan, -.-Color-Blue-BGCyan, -.-Color-Bold-BGCyan, -.-Color-Bold-Black-BGCyan, -.-Color-Bold-Green-BGCyan, -.-Color-Bold-Cyan-BGCyan, -.-Color-Bold-Blue-BGCyan, -.-Color-Bold-Magenta-BGCyan, -.-Color-Bold-Red-BGCyan, -.-Color-Bold-White-BGCyan, -.-Color-Bold-Yellow-BGCyan, -.-Color-Cyan-BGCyan, -.-Color-Green-BGCyan, -.-Color-Magenta-BGCyan, -.-Color-Red-BGCyan, -.-Color-White-BGCyan, -.-Color-Yellow-BGCyan { - background-color: var(--ansi-cyan); -} - -.-Color-BGWhite, -.-Color-Black-BGWhite, -.-Color-Blue-BGWhite, -.-Color-Bold-BGWhite, -.-Color-Bold-Black-BGWhite, -.-Color-Bold-Green-BGWhite, -.-Color-Bold-Cyan-BGWhite, -.-Color-Bold-Blue-BGWhite, -.-Color-Bold-Magenta-BGWhite, -.-Color-Bold-Red-BGWhite, -.-Color-Bold-White-BGWhite, -.-Color-Bold-Yellow-BGWhite, -.-Color-Cyan-BGWhite, -.-Color-Green-BGWhite, -.-Color-Magenta-BGWhite, -.-Color-Red-BGWhite, -.-Color-White-BGWhite, -.-Color-Yellow-BGWhite { - background-color: var(--ansi-white); -} - -.-Color-Black, -.-Color-Bold-Black, -.-Color-Black-BGBlack, -.-Color-Bold-Black-BGBlack, -.-Color-Black-BGGreen, -.-Color-Red-BGRed, -.-Color-Bold-Red-BGRed, -.-Color-Bold-Blue-BGBlue, -.-Color-Blue-BGBlue { - text-shadow: 0 0 1px var(--ansi-white); -} - -.-Color-Bold-Cyan-BGCyan, -.-Color-Bold-Magenta-BGMagenta, -.-Color-Bold-White, -.-Color-Bold-Yellow-BGYellow, -.-Color-Bold-Green-BGGreen, -.-Color-Cyan-BGCyan, -.-Color-Cyan-BGGreen, -.-Color-Green-BGCyan, -.-Color-Green-BGGreen, -.-Color-Magenta-BGMagenta, -.-Color-White, -.-Color-White-BGWhite, -.-Color-Yellow-BGYellow { - text-shadow: 0 0 1px var(--ansi-black); -} \ No newline at end of file diff --git a/assets/javascripts/bundle.8e8db93a.min.js b/assets/javascripts/bundle.8e8db93a.min.js new file mode 100644 index 00000000..2a803d19 --- /dev/null +++ b/assets/javascripts/bundle.8e8db93a.min.js @@ -0,0 +1,3 @@ +"use strict";(()=>{var Ri=Object.create;var Or=Object.defineProperty;var Pi=Object.getOwnPropertyDescriptor;var Ii=Object.getOwnPropertyNames,zt=Object.getOwnPropertySymbols,Fi=Object.getPrototypeOf,Mr=Object.prototype.hasOwnProperty,po=Object.prototype.propertyIsEnumerable;var co=(e,t,r)=>t in e?Or(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,W=(e,t)=>{for(var r in t||(t={}))Mr.call(t,r)&&co(e,r,t[r]);if(zt)for(var r of zt(t))po.call(t,r)&&co(e,r,t[r]);return e};var lo=(e,t)=>{var r={};for(var o in e)Mr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&zt)for(var o of zt(e))t.indexOf(o)<0&&po.call(e,o)&&(r[o]=e[o]);return r};var Lr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ji=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ii(t))!Mr.call(e,n)&&n!==r&&Or(e,n,{get:()=>t[n],enumerable:!(o=Pi(t,n))||o.enumerable});return e};var qt=(e,t,r)=>(r=e!=null?Ri(Fi(e)):{},ji(t||!e||!e.__esModule?Or(r,"default",{value:e,enumerable:!0}):r,e));var mo=(e,t,r)=>new Promise((o,n)=>{var i=c=>{try{s(r.next(c))}catch(p){n(p)}},a=c=>{try{s(r.throw(c))}catch(p){n(p)}},s=c=>c.done?o(c.value):Promise.resolve(c.value).then(i,a);s((r=r.apply(e,t)).next())});var uo=Lr((_r,fo)=>{(function(e,t){typeof _r=="object"&&typeof fo!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(_r,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(C){return!!(C&&C!==document&&C.nodeName!=="HTML"&&C.nodeName!=="BODY"&&"classList"in C&&"contains"in C.classList)}function c(C){var pt=C.type,Ie=C.tagName;return!!(Ie==="INPUT"&&a[pt]&&!C.readOnly||Ie==="TEXTAREA"&&!C.readOnly||C.isContentEditable)}function p(C){C.classList.contains("focus-visible")||(C.classList.add("focus-visible"),C.setAttribute("data-focus-visible-added",""))}function l(C){C.hasAttribute("data-focus-visible-added")&&(C.classList.remove("focus-visible"),C.removeAttribute("data-focus-visible-added"))}function f(C){C.metaKey||C.altKey||C.ctrlKey||(s(r.activeElement)&&p(r.activeElement),o=!0)}function u(C){o=!1}function d(C){s(C.target)&&(o||c(C.target))&&p(C.target)}function v(C){s(C.target)&&(C.target.classList.contains("focus-visible")||C.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(C.target))}function b(C){document.visibilityState==="hidden"&&(n&&(o=!0),I())}function I(){document.addEventListener("mousemove",X),document.addEventListener("mousedown",X),document.addEventListener("mouseup",X),document.addEventListener("pointermove",X),document.addEventListener("pointerdown",X),document.addEventListener("pointerup",X),document.addEventListener("touchmove",X),document.addEventListener("touchstart",X),document.addEventListener("touchend",X)}function Y(){document.removeEventListener("mousemove",X),document.removeEventListener("mousedown",X),document.removeEventListener("mouseup",X),document.removeEventListener("pointermove",X),document.removeEventListener("pointerdown",X),document.removeEventListener("pointerup",X),document.removeEventListener("touchmove",X),document.removeEventListener("touchstart",X),document.removeEventListener("touchend",X)}function X(C){C.target.nodeName&&C.target.nodeName.toLowerCase()==="html"||(o=!1,Y())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",b,!0),I(),r.addEventListener("focus",d,!0),r.addEventListener("blur",v,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var eo=Lr((jt,Zr)=>{(function(t,r){typeof jt=="object"&&typeof Zr=="object"?Zr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof jt=="object"?jt.ClipboardJS=r():t.ClipboardJS=r()})(jt,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return $i}});var a=i(279),s=i.n(a),c=i(370),p=i.n(c),l=i(817),f=i.n(l);function u(q){try{return document.execCommand(q)}catch(_){return!1}}var d=function(_){var L=f()(_);return u("cut"),L},v=d;function b(q){var _=document.documentElement.getAttribute("dir")==="rtl",L=document.createElement("textarea");L.style.fontSize="12pt",L.style.border="0",L.style.padding="0",L.style.margin="0",L.style.position="absolute",L.style[_?"right":"left"]="-9999px";var j=window.pageYOffset||document.documentElement.scrollTop;return L.style.top="".concat(j,"px"),L.setAttribute("readonly",""),L.value=q,L}var I=function(_,L){var j=b(_);L.container.appendChild(j);var V=f()(j);return u("copy"),j.remove(),V},Y=function(_){var L=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},j="";return typeof _=="string"?j=I(_,L):_ instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(_==null?void 0:_.type)?j=I(_.value,L):(j=f()(_),u("copy")),j},X=Y;function C(q){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?C=function(L){return typeof L}:C=function(L){return L&&typeof Symbol=="function"&&L.constructor===Symbol&&L!==Symbol.prototype?"symbol":typeof L},C(q)}var pt=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},L=_.action,j=L===void 0?"copy":L,V=_.container,B=_.target,je=_.text;if(j!=="copy"&&j!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(B!==void 0)if(B&&C(B)==="object"&&B.nodeType===1){if(j==="copy"&&B.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(j==="cut"&&(B.hasAttribute("readonly")||B.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(je)return X(je,{container:V});if(B)return j==="cut"?v(B):X(B,{container:V})},Ie=pt;function H(q){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?H=function(L){return typeof L}:H=function(L){return L&&typeof Symbol=="function"&&L.constructor===Symbol&&L!==Symbol.prototype?"symbol":typeof L},H(q)}function ie(q,_){if(!(q instanceof _))throw new TypeError("Cannot call a class as a function")}function ae(q,_){for(var L=0;L<_.length;L++){var j=_[L];j.enumerable=j.enumerable||!1,j.configurable=!0,"value"in j&&(j.writable=!0),Object.defineProperty(q,j.key,j)}}function he(q,_,L){return _&&ae(q.prototype,_),L&&ae(q,L),q}function we(q,_){if(typeof _!="function"&&_!==null)throw new TypeError("Super expression must either be null or a function");q.prototype=Object.create(_&&_.prototype,{constructor:{value:q,writable:!0,configurable:!0}}),_&&Fe(q,_)}function Fe(q,_){return Fe=Object.setPrototypeOf||function(j,V){return j.__proto__=V,j},Fe(q,_)}function _i(q){var _=ki();return function(){var j=Dt(q),V;if(_){var B=Dt(this).constructor;V=Reflect.construct(j,arguments,B)}else V=j.apply(this,arguments);return Ai(this,V)}}function Ai(q,_){return _&&(H(_)==="object"||typeof _=="function")?_:Ci(q)}function Ci(q){if(q===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return q}function ki(){if(typeof Reflect=="undefined"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(q){return!1}}function Dt(q){return Dt=Object.setPrototypeOf?Object.getPrototypeOf:function(L){return L.__proto__||Object.getPrototypeOf(L)},Dt(q)}function Sr(q,_){var L="data-clipboard-".concat(q);if(_.hasAttribute(L))return _.getAttribute(L)}var Hi=function(q){we(L,q);var _=_i(L);function L(j,V){var B;return ie(this,L),B=_.call(this),B.resolveOptions(V),B.listenClick(j),B}return he(L,[{key:"resolveOptions",value:function(){var V=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof V.action=="function"?V.action:this.defaultAction,this.target=typeof V.target=="function"?V.target:this.defaultTarget,this.text=typeof V.text=="function"?V.text:this.defaultText,this.container=H(V.container)==="object"?V.container:document.body}},{key:"listenClick",value:function(V){var B=this;this.listener=p()(V,"click",function(je){return B.onClick(je)})}},{key:"onClick",value:function(V){var B=V.delegateTarget||V.currentTarget,je=this.action(B)||"copy",Vt=Ie({action:je,container:this.container,target:this.target(B),text:this.text(B)});this.emit(Vt?"success":"error",{action:je,text:Vt,trigger:B,clearSelection:function(){B&&B.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(V){return Sr("action",V)}},{key:"defaultTarget",value:function(V){var B=Sr("target",V);if(B)return document.querySelector(B)}},{key:"defaultText",value:function(V){return Sr("text",V)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(V){var B=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return X(V,B)}},{key:"cut",value:function(V){return v(V)}},{key:"isSupported",value:function(){var V=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],B=typeof V=="string"?[V]:V,je=!!document.queryCommandSupported;return B.forEach(function(Vt){je=je&&!!document.queryCommandSupported(Vt)}),je}}]),L}(s()),$i=Hi},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,c){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(c))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(l,f,u,d,v){var b=p.apply(this,arguments);return l.addEventListener(u,b,v),{destroy:function(){l.removeEventListener(u,b,v)}}}function c(l,f,u,d,v){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(b){return s(b,f,u,d,v)}))}function p(l,f,u,d){return function(v){v.delegateTarget=a(v.target,f),v.delegateTarget&&d.call(l,v)}}o.exports=c},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function c(u,d,v){if(!u&&!d&&!v)throw new Error("Missing required arguments");if(!a.string(d))throw new TypeError("Second argument must be a String");if(!a.fn(v))throw new TypeError("Third argument must be a Function");if(a.node(u))return p(u,d,v);if(a.nodeList(u))return l(u,d,v);if(a.string(u))return f(u,d,v);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function p(u,d,v){return u.addEventListener(d,v),{destroy:function(){u.removeEventListener(d,v)}}}function l(u,d,v){return Array.prototype.forEach.call(u,function(b){b.addEventListener(d,v)}),{destroy:function(){Array.prototype.forEach.call(u,function(b){b.removeEventListener(d,v)})}}}function f(u,d,v){return s(document.body,u,d,v)}o.exports=c},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),p=document.createRange();p.selectNodeContents(i),c.removeAllRanges(),c.addRange(p),a=c.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var c=this;function p(){c.off(i,p),a.apply(s,arguments)}return p._=a,this.on(i,p,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),c=0,p=s.length;for(c;c{"use strict";var Ka=/["'&<>]/;ei.exports=Qa;function Qa(e){var t=""+e,r=Ka.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i0&&i[i.length-1])&&(p[0]===6||p[0]===2)){r=0;continue}if(p[0]===3&&(!i||p[1]>i[0]&&p[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function K(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function Q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||s(u,d)})})}function s(u,d){try{c(o[u](d))}catch(v){f(i[0][3],v)}}function c(u){u.value instanceof lt?Promise.resolve(u.value.v).then(p,l):f(i[0][2],u)}function p(u){s("next",u)}function l(u){s("throw",u)}function f(u,d){u(d),i.shift(),i.length&&s(i[0][0],i[0][1])}}function vo(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof Te=="function"?Te(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(a){return new Promise(function(s,c){a=e[i](a),n(s,c,a.done,a.value)})}}function n(i,a,s,c){Promise.resolve(c).then(function(p){i({value:p,done:s})},a)}}function $(e){return typeof e=="function"}function dt(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var Qt=dt(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Ge(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var ze=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=Te(a),c=s.next();!c.done;c=s.next()){var p=c.value;p.remove(this)}}catch(b){t={error:b}}finally{try{c&&!c.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if($(l))try{l()}catch(b){i=b instanceof Qt?b.errors:[b]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=Te(f),d=u.next();!d.done;d=u.next()){var v=d.value;try{go(v)}catch(b){i=i!=null?i:[],b instanceof Qt?i=Q(Q([],K(i)),K(b.errors)):i.push(b)}}}catch(b){o={error:b}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new Qt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)go(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Ge(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ge(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Cr=ze.EMPTY;function Yt(e){return e instanceof ze||e&&"closed"in e&&$(e.remove)&&$(e.add)&&$(e.unsubscribe)}function go(e){$(e)?e():e.unsubscribe()}var We={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var ht={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Cr:(this.currentObservers=null,s.push(r),new ze(function(){o.currentObservers=null,Ge(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new D;return r.source=this,r},t.create=function(r,o){return new Mo(r,o)},t}(D);var Mo=function(e){me(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Cr},t}(w);var Ct={now:function(){return(Ct.delegate||Date).now()},delegate:void 0};var kt=function(e){me(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=Ct);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,c=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),c=0;c0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=gt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(gt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(Jt);var Ao=function(e){me(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(Xt);var Se=new Ao(_o);var T=new D(function(e){return e.complete()});function Zt(e){return e&&$(e.schedule)}function Fr(e){return e[e.length-1]}function ot(e){return $(Fr(e))?e.pop():void 0}function Re(e){return Zt(Fr(e))?e.pop():void 0}function er(e,t){return typeof Fr(e)=="number"?e.pop():t}var xt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function tr(e){return $(e==null?void 0:e.then)}function rr(e){return $(e[vt])}function or(e){return Symbol.asyncIterator&&$(e==null?void 0:e[Symbol.asyncIterator])}function nr(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Qi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var ir=Qi();function ar(e){return $(e==null?void 0:e[ir])}function sr(e){return bo(this,arguments,function(){var r,o,n,i;return Kt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,lt(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,lt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,lt(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function cr(e){return $(e==null?void 0:e.getReader)}function P(e){if(e instanceof D)return e;if(e!=null){if(rr(e))return Yi(e);if(xt(e))return Bi(e);if(tr(e))return Gi(e);if(or(e))return Co(e);if(ar(e))return Ji(e);if(cr(e))return Xi(e)}throw nr(e)}function Yi(e){return new D(function(t){var r=e[vt]();if($(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Bi(e){return new D(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?g(function(n,i){return e(n,i,o)}):be,ve(1),r?Ue(t):Qo(function(){return new lr}))}}function Vr(e){return e<=0?function(){return T}:x(function(t,r){var o=[];t.subscribe(y(r,function(n){o.push(n),e=2,!0))}function ge(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new w}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,c=s===void 0?!0:s;return function(p){var l,f,u,d=0,v=!1,b=!1,I=function(){f==null||f.unsubscribe(),f=void 0},Y=function(){I(),l=u=void 0,v=b=!1},X=function(){var C=l;Y(),C==null||C.unsubscribe()};return x(function(C,pt){d++,!b&&!v&&I();var Ie=u=u!=null?u:r();pt.add(function(){d--,d===0&&!b&&!v&&(f=qr(X,c))}),Ie.subscribe(pt),!l&&d>0&&(l=new ft({next:function(H){return Ie.next(H)},error:function(H){b=!0,I(),f=qr(Y,n,H),Ie.error(H)},complete:function(){v=!0,I(),f=qr(Y,a),Ie.complete()}}),P(C).subscribe(l))})(p)}}function qr(e,t){for(var r=[],o=2;oe.next(document)),e}function k(e,t=document){return Array.from(t.querySelectorAll(e))}function F(e,t=document){let r=le(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function le(e,t=document){return t.querySelector(e)||void 0}function Ve(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}var ba=S(h(document.body,"focusin"),h(document.body,"focusout")).pipe(Ee(1),z(void 0),m(()=>Ve()||document.body),Z(1));function wt(e){return ba.pipe(m(t=>e.contains(t)),te())}function ur(e,t){return S(h(e,"mouseenter").pipe(m(()=>!0)),h(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ee(t):be,z(!1))}function Ke(e){return{x:e.offsetLeft,y:e.offsetTop}}function Xo(e){return S(h(window,"load"),h(window,"resize")).pipe(He(0,Se),m(()=>Ke(e)),z(Ke(e)))}function dr(e){return{x:e.scrollLeft,y:e.scrollTop}}function st(e){return S(h(e,"scroll"),h(window,"resize")).pipe(He(0,Se),m(()=>dr(e)),z(dr(e)))}function Zo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Zo(e,r)}function O(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Zo(o,n);return o}function hr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function Tt(e){let t=O("script",{src:e});return R(()=>(document.head.appendChild(t),S(h(t,"load"),h(t,"error").pipe(E(()=>jr(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),A(()=>document.head.removeChild(t)),ve(1))))}var en=new w,va=R(()=>typeof ResizeObserver=="undefined"?Tt("https://unpkg.com/resize-observer-polyfill/dist/ResizeObserver.js"):U(void 0)).pipe(m(()=>new ResizeObserver(e=>{for(let t of e)en.next(t)})),E(e=>S(Xe,U(e)).pipe(A(()=>e.disconnect()))),Z(1));function xe(e){return{width:e.offsetWidth,height:e.offsetHeight}}function Ce(e){return va.pipe(M(t=>t.observe(e)),E(t=>en.pipe(g(({target:r})=>r===e),A(()=>t.unobserve(e)),m(()=>xe(e)))),z(xe(e)))}function St(e){return{width:e.scrollWidth,height:e.scrollHeight}}function br(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var tn=new w,ga=R(()=>U(new IntersectionObserver(e=>{for(let t of e)tn.next(t)},{threshold:0}))).pipe(E(e=>S(Xe,U(e)).pipe(A(()=>e.disconnect()))),Z(1));function Ot(e){return ga.pipe(M(t=>t.observe(e)),E(t=>tn.pipe(g(({target:r})=>r===e),A(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function rn(e,t=16){return st(e).pipe(m(({y:r})=>{let o=xe(e),n=St(e);return r>=n.height-o.height-t}),te())}var vr={drawer:F("[data-md-toggle=drawer]"),search:F("[data-md-toggle=search]")};function on(e){return vr[e].checked}function et(e,t){vr[e].checked!==t&&vr[e].click()}function Qe(e){let t=vr[e];return h(t,"change").pipe(m(()=>t.checked),z(t.checked))}function xa(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function ya(){return S(h(window,"compositionstart").pipe(m(()=>!0)),h(window,"compositionend").pipe(m(()=>!1))).pipe(z(!1))}function nn(){let e=h(window,"keydown").pipe(g(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:on("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),g(({mode:t,type:r})=>{if(t==="global"){let o=Ve();if(typeof o!="undefined")return!xa(o,r)}return!0}),ge());return ya().pipe(E(t=>t?T:e))}function ue(){return new URL(location.href)}function tt(e,t=!1){if(G("navigation.instant")&&!t){let r=O("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function an(){return new w}function sn(){return location.hash.slice(1)}function gr(e){let t=O("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Br(e){return S(h(window,"hashchange"),e).pipe(m(sn),z(sn()),g(t=>t.length>0),Z(1))}function cn(e){return Br(e).pipe(m(t=>le(`[id="${t}"]`)),g(t=>typeof t!="undefined"))}function It(e){let t=matchMedia(e);return mr(r=>t.addListener(()=>r(t.matches))).pipe(z(t.matches))}function pn(){let e=matchMedia("print");return S(h(window,"beforeprint").pipe(m(()=>!0)),h(window,"afterprint").pipe(m(()=>!1))).pipe(z(e.matches))}function Gr(e,t){return e.pipe(E(r=>r?t():T))}function xr(e,t){return new D(r=>{let o=new XMLHttpRequest;o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network Error"))}),o.addEventListener("abort",()=>{r.error(new Error("Request aborted"))}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let i=Number(o.getResponseHeader("Content-Length"))||0;t.progress$.next(n.loaded/i*100)}}),t.progress$.next(5)),o.send()})}function Ye(e,t){return xr(e,t).pipe(E(r=>r.text()),m(r=>JSON.parse(r)),Z(1))}function ln(e,t){let r=new DOMParser;return xr(e,t).pipe(E(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),Z(1))}function mn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function fn(){return S(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(m(mn),z(mn()))}function un(){return{width:innerWidth,height:innerHeight}}function dn(){return h(window,"resize",{passive:!0}).pipe(m(un),z(un()))}function hn(){return J([fn(),dn()]).pipe(m(([e,t])=>({offset:e,size:t})),Z(1))}function yr(e,{viewport$:t,header$:r}){let o=t.pipe(oe("size")),n=J([o,r]).pipe(m(()=>Ke(e)));return J([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:c,y:p}])=>({offset:{x:a.x-c,y:a.y-p+i},size:s})))}function Ea(e){return h(e,"message",t=>t.data)}function wa(e){let t=new w;return t.subscribe(r=>e.postMessage(r)),t}function bn(e,t=new Worker(e)){let r=Ea(t),o=wa(t),n=new w;n.subscribe(o);let i=o.pipe(re(),ce(!0));return n.pipe(re(),De(r.pipe(N(i))),ge())}var Ta=F("#__config"),Mt=JSON.parse(Ta.textContent);Mt.base=`${new URL(Mt.base,ue())}`;function de(){return Mt}function G(e){return Mt.features.includes(e)}function _e(e,t){return typeof t!="undefined"?Mt.translations[e].replace("#",t.toString()):Mt.translations[e]}function ke(e,t=document){return F(`[data-md-component=${e}]`,t)}function pe(e,t=document){return k(`[data-md-component=${e}]`,t)}function Sa(e){let t=F(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(m(()=>F(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function vn(e){if(!G("announce.dismiss")||!e.childElementCount)return T;if(!e.hidden){let t=F(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return R(()=>{let t=new w;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),Sa(e).pipe(M(r=>t.next(r)),A(()=>t.complete()),m(r=>W({ref:e},r)))})}function Oa(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function gn(e,t){let r=new w;return r.subscribe(({hidden:o})=>{e.hidden=o}),Oa(e,t).pipe(M(o=>r.next(o)),A(()=>r.complete()),m(o=>W({ref:e},o)))}function Ft(e,t){return t==="inline"?O("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},O("div",{class:"md-tooltip__inner md-typeset"})):O("div",{class:"md-tooltip",id:e,role:"tooltip"},O("div",{class:"md-tooltip__inner md-typeset"}))}function xn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return O("aside",{class:"md-annotation",tabIndex:0},Ft(t),O("a",{href:r,class:"md-annotation__index",tabIndex:-1},O("span",{"data-md-annotation-id":e})))}else return O("aside",{class:"md-annotation",tabIndex:0},Ft(t),O("span",{class:"md-annotation__index",tabIndex:-1},O("span",{"data-md-annotation-id":e})))}function yn(e){return O("button",{class:"md-code__button",title:_e("clipboard.copy"),"data-clipboard-target":`#${e} > code`,"data-md-type":"copy"})}function En(){return O("button",{class:"md-code__button",title:"Toggle line selection","data-md-type":"select"})}function wn(){return O("nav",{class:"md-code__nav"})}function Jr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(c=>!e.terms[c]).reduce((c,p)=>[...c,O("del",null,p)," "],[]).slice(0,-1),i=de(),a=new URL(e.location,i.base);G("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,c])=>c).reduce((c,[p])=>`${c} ${p}`.trim(),""));let{tags:s}=de();return O("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},O("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&O("div",{class:"md-search-result__icon md-icon"}),r>0&&O("h1",null,e.title),r<=0&&O("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(c=>{let p=s?c in s?`md-tag-icon md-tag--${s[c]}`:"md-tag-icon":"";return O("span",{class:`md-tag ${p}`},c)}),o>0&&n.length>0&&O("p",{class:"md-search-result__terms"},_e("search.result.term.missing"),": ",...n)))}function Tn(e){let t=e[0].score,r=[...e],o=de(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreJr(l,1)),...c.length?[O("details",{class:"md-search-result__more"},O("summary",{tabIndex:-1},O("div",null,c.length>0&&c.length===1?_e("search.result.more.one"):_e("search.result.more.other",c.length))),...c.map(l=>Jr(l,1)))]:[]];return O("li",{class:"md-search-result__item"},p)}function Sn(e){return O("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>O("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?hr(r):r)))}function Xr(e){let t=`tabbed-control tabbed-control--${e}`;return O("div",{class:t,hidden:!0},O("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function On(e){return O("div",{class:"md-typeset__scrollwrap"},O("div",{class:"md-typeset__table"},e))}function Ma(e){let t=de(),r=new URL(`../${e.version}/`,t.base);return O("li",{class:"md-version__item"},O("a",{href:`${r}`,class:"md-version__link"},e.title))}function Mn(e,t){return O("div",{class:"md-version"},O("button",{class:"md-version__current","aria-label":_e("select.version")},t.title),O("ul",{class:"md-version__list"},e.map(Ma)))}var La=0;function _a(e,t){document.body.append(e);let{width:r}=xe(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=br(t),n=typeof o!="undefined"?st(o):U({x:0,y:0}),i=S(wt(t),ur(t)).pipe(te());return J([i,n]).pipe(m(([a,s])=>{let{x:c,y:p}=Ke(t),l=xe(t),f=t.closest("table");return f&&t.parentElement&&(c+=f.offsetLeft+t.parentElement.offsetLeft,p+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:c-s.x+l.width/2-r/2,y:p-s.y+l.height+8}}}))}function Be(e){let t=e.title;if(!t.length)return T;let r=`__tooltip_${La++}`,o=Ft(r,"inline"),n=F(".md-typeset",o);return n.innerHTML=t,R(()=>{let i=new w;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),S(i.pipe(g(({active:a})=>a)),i.pipe(Ee(250),g(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(He(16,Se)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(Pt(125,Se),g(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),_a(o,e).pipe(M(a=>i.next(a)),A(()=>i.complete()),m(a=>W({ref:e},a)))}).pipe(Je(se))}function Aa(e,t){let r=R(()=>J([Xo(e),st(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=xe(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return wt(e).pipe(E(o=>r.pipe(m(n=>({active:o,offset:n})),ve(+!o||1/0))))}function Ln(e,t,{target$:r}){let[o,n]=Array.from(e.children);return R(()=>{let i=new w,a=i.pipe(re(),ce(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),Ot(e).pipe(N(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),S(i.pipe(g(({active:s})=>s)),i.pipe(Ee(250),g(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(He(16,Se)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(Pt(125,Se),g(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(N(a),g(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),h(n,"mousedown").pipe(N(a),ne(i)).subscribe(([s,{active:c}])=>{var p;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(c){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(p=Ve())==null||p.blur()}}),r.pipe(N(a),g(s=>s===o),Ze(125)).subscribe(()=>e.focus()),Aa(e,t).pipe(M(s=>i.next(s)),A(()=>i.complete()),m(s=>W({ref:e},s)))})}function Ca(e){let t=de();if(e.tagName!=="CODE")return[e];let r=[".c",".c1",".cm"];if(typeof t.annotate!="undefined"){let o=e.closest("[class|=language]");if(o)for(let n of Array.from(o.classList)){if(!n.startsWith("language-"))continue;let[,i]=n.split("-");i in t.annotate&&r.push(...t.annotate[i])}}return k(r.join(", "),e)}function ka(e){let t=[];for(let r of Ca(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,c]=a;if(typeof c=="undefined"){let p=i.splitText(a.index);i=p.splitText(s.length),t.push(p)}else{i.textContent=s,t.push(i);break}}}}return t}function _n(e,t){t.append(...Array.from(e.childNodes))}function Er(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of ka(t)){let[,c]=s.textContent.match(/\((\d+)\)/);le(`:scope > li:nth-child(${c})`,e)&&(a.set(c,xn(c,i)),s.replaceWith(a.get(c)))}return a.size===0?T:R(()=>{let s=new w,c=s.pipe(re(),ce(!0)),p=[];for(let[l,f]of a)p.push([F(".md-typeset",f),F(`:scope > li:nth-child(${l})`,e)]);return o.pipe(N(c)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of p)l?_n(f,u):_n(u,f)}),S(...[...a].map(([,l])=>Ln(l,t,{target$:r}))).pipe(A(()=>s.complete()),ge())})}function An(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return An(t)}}function Cn(e,t){return R(()=>{let r=An(e);return typeof r!="undefined"?Er(r,e,t):T})}var Hn=qt(eo());var Ha=0,kn=S(h(window,"keydown").pipe(m(()=>!0)),S(h(window,"keyup"),h(window,"contextmenu")).pipe(m(()=>!1))).pipe(z(!1),Z(1));function $n(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return $n(t)}}function $a(e){return Ce(e).pipe(m(({width:t})=>({scrollable:St(e).width>t})),oe("scrollable"))}function Rn(e,t){let{matches:r}=matchMedia("(hover)"),o=R(()=>{let n=new w,i=n.pipe(Vr(1));n.subscribe(({scrollable:d})=>{d&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=[],s=e.closest("pre"),c=s.closest("[id]"),p=c?c.id:Ha++;s.id=`__code_${p}`;let l=[],f=e.closest(".highlight");if(f instanceof HTMLElement){let d=$n(f);if(typeof d!="undefined"&&(f.classList.contains("annotate")||G("content.code.annotate"))){let v=Er(d,e,t);l.push(Ce(f).pipe(N(i),m(({width:b,height:I})=>b&&I),te(),E(b=>b?v:T)))}}let u=k(":scope > span[id]",e);if(u.length&&(e.classList.add("md-code__content"),e.closest(".select")||G("content.code.select")&&!e.closest(".no-select"))){let d=+u[0].id.split("-").pop(),v=En();a.push(v),G("content.tooltips")&&l.push(Be(v));let b=h(v,"click").pipe(Rt(H=>!H,!1),M(()=>v.blur()),ge());b.subscribe(H=>{v.classList.toggle("md-code__button--active",H)});let I=fe(u).pipe(ee(H=>ur(H).pipe(m(ie=>[H,ie]))));b.pipe(E(H=>H?I:T)).subscribe(([H,ie])=>{let ae=le(".hll.select",H);if(ae&&!ie)ae.replaceWith(...Array.from(ae.childNodes));else if(!ae&&ie){let he=document.createElement("span");he.className="hll select",he.append(...Array.from(H.childNodes).slice(1)),H.append(he)}});let Y=fe(u).pipe(ee(H=>h(H,"mousedown").pipe(M(ie=>ie.preventDefault()),m(()=>H)))),X=b.pipe(E(H=>H?Y:T),ne(kn),m(([H,ie])=>{var he;let ae=u.indexOf(H)+d;if(ie===!1)return[ae,ae];{let we=k(".hll",e).map(Fe=>u.indexOf(Fe.parentElement)+d);return(he=window.getSelection())==null||he.removeAllRanges(),[Math.min(ae,...we),Math.max(ae,...we)]}})),C=Br(T).pipe(g(H=>H.startsWith(`__codelineno-${p}-`)));C.subscribe(H=>{let[,,ie]=H.split("-"),ae=ie.split(":").map(we=>+we-d+1);ae.length===1&&ae.push(ae[0]);for(let we of k(".hll:not(.select)",e))we.replaceWith(...Array.from(we.childNodes));let he=u.slice(ae[0]-1,ae[1]);for(let we of he){let Fe=document.createElement("span");Fe.className="hll",Fe.append(...Array.from(we.childNodes).slice(1)),we.append(Fe)}}),C.pipe(ve(1),Oe(se)).subscribe(H=>{if(H.includes(":")){let ie=document.getElementById(H.split(":")[0]);ie&&setTimeout(()=>{let ae=ie,he=-64;for(;ae!==document.body;)he+=ae.offsetTop,ae=ae.offsetParent;window.scrollTo({top:he})},1)}});let Ie=fe(k('a[href^="#__codelineno"]',f)).pipe(ee(H=>h(H,"click").pipe(M(ie=>ie.preventDefault()),m(()=>H)))).pipe(N(i),ne(kn),m(([H,ie])=>{let he=+F(`[id="${H.hash.slice(1)}"]`).parentElement.id.split("-").pop();if(ie===!1)return[he,he];{let we=k(".hll",e).map(Fe=>+Fe.parentElement.id.split("-").pop());return[Math.min(he,...we),Math.max(he,...we)]}}));S(X,Ie).subscribe(H=>{let ie=`#__codelineno-${p}-`;H[0]===H[1]?ie+=H[0]:ie+=`${H[0]}:${H[1]}`,history.replaceState({},"",ie),window.dispatchEvent(new HashChangeEvent("hashchange",{newURL:window.location.origin+window.location.pathname+ie,oldURL:window.location.href}))})}if(Hn.default.isSupported()&&(e.closest(".copy")||G("content.code.copy")&&!e.closest(".no-copy"))){let d=yn(s.id);a.push(d),G("content.tooltips")&&l.push(Be(d))}if(a.length){let d=wn();d.append(...a),s.insertBefore(d,e)}return $a(e).pipe(M(d=>n.next(d)),A(()=>n.complete()),m(d=>W({ref:e},d)),De(...l))});return G("content.lazy")?Ot(e).pipe(g(n=>n),ve(1),E(()=>o)):o}function Ra(e,{target$:t,print$:r}){let o=!0;return S(t.pipe(m(n=>n.closest("details:not([open])")),g(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(g(n=>n||!o),M(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Pn(e,t){return R(()=>{let r=new w;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Ra(e,t).pipe(M(o=>r.next(o)),A(()=>r.complete()),m(o=>W({ref:e},o)))})}var In=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var to,Ia=0;function Fa(){return typeof mermaid=="undefined"||mermaid instanceof Element?Tt("https://unpkg.com/mermaid@10.6.1/dist/mermaid.min.js"):U(void 0)}function Fn(e){return e.classList.remove("mermaid"),to||(to=Fa().pipe(M(()=>mermaid.initialize({startOnLoad:!1,themeCSS:In,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),Z(1))),to.subscribe(()=>mo(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${Ia++}`,r=O("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})),to.pipe(m(()=>({ref:e})))}var jn=O("table");function Wn(e){return e.replaceWith(jn),jn.replaceWith(On(e)),U({ref:e})}function ja(e){let t=e.find(r=>r.checked)||e[0];return S(...e.map(r=>h(r,"change").pipe(m(()=>F(`label[for="${r.id}"]`))))).pipe(z(F(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Un(e,{viewport$:t,target$:r}){let o=F(".tabbed-labels",e),n=k(":scope > input",e),i=Xr("prev");e.append(i);let a=Xr("next");return e.append(a),R(()=>{let s=new w,c=s.pipe(re(),ce(!0));J([s,Ce(e)]).pipe(N(c),He(1,Se)).subscribe({next([{active:p},l]){let f=Ke(p),{width:u}=xe(p);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let d=dr(o);(f.xd.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),J([st(o),Ce(o)]).pipe(N(c)).subscribe(([p,l])=>{let f=St(o);i.hidden=p.x<16,a.hidden=p.x>f.width-l.width-16}),S(h(i,"click").pipe(m(()=>-1)),h(a,"click").pipe(m(()=>1))).pipe(N(c)).subscribe(p=>{let{width:l}=xe(o);o.scrollBy({left:l*p,behavior:"smooth"})}),r.pipe(N(c),g(p=>n.includes(p))).subscribe(p=>p.click()),o.classList.add("tabbed-labels--linked");for(let p of n){let l=F(`label[for="${p.id}"]`);l.replaceChildren(O("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),h(l.firstElementChild,"click").pipe(N(c),g(f=>!(f.metaKey||f.ctrlKey)),M(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return G("content.tabs.link")&&s.pipe(Le(1),ne(t)).subscribe(([{active:p},{offset:l}])=>{let f=p.innerText.trim();if(p.hasAttribute("data-md-switching"))p.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let v of k("[data-tabs]"))for(let b of k(":scope > input",v)){let I=F(`label[for="${b.id}"]`);if(I!==p&&I.innerText.trim()===f){I.setAttribute("data-md-switching",""),b.click();break}}window.scrollTo({top:e.offsetTop-u});let d=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...d])])}}),s.pipe(N(c)).subscribe(()=>{for(let p of k("audio, video",e))p.pause()}),ja(n).pipe(M(p=>s.next(p)),A(()=>s.complete()),m(p=>W({ref:e},p)))}).pipe(Je(se))}function Nn(e,{viewport$:t,target$:r,print$:o}){return S(...k(".annotate:not(.highlight)",e).map(n=>Cn(n,{target$:r,print$:o})),...k("pre:not(.mermaid) > code",e).map(n=>Rn(n,{target$:r,print$:o})),...k("pre.mermaid",e).map(n=>Fn(n)),...k("table:not([class])",e).map(n=>Wn(n)),...k("details",e).map(n=>Pn(n,{target$:r,print$:o})),...k("[data-tabs]",e).map(n=>Un(n,{viewport$:t,target$:r})),...k("[title]",e).filter(()=>G("content.tooltips")).map(n=>Be(n)))}function Wa(e,{alert$:t}){return t.pipe(E(r=>S(U(!0),U(!1).pipe(Ze(2e3))).pipe(m(o=>({message:r,active:o})))))}function Dn(e,t){let r=F(".md-typeset",e);return R(()=>{let o=new w;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Wa(e,t).pipe(M(n=>o.next(n)),A(()=>o.complete()),m(n=>W({ref:e},n)))})}function Ua({viewport$:e}){if(!G("header.autohide"))return U(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Pe(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),te()),o=Qe("search");return J([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),te(),E(n=>n?r:U(!1)),z(!1))}function Vn(e,t){return R(()=>J([Ce(e),Ua(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),te((r,o)=>r.height===o.height&&r.hidden===o.hidden),Z(1))}function zn(e,{header$:t,main$:r}){return R(()=>{let o=new w,n=o.pipe(re(),ce(!0));o.pipe(oe("active"),at(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=fe(k("[title]",e)).pipe(g(()=>G("content.tooltips")),ee(a=>Be(a)));return r.subscribe(o),t.pipe(N(n),m(a=>W({ref:e},a)),De(i.pipe(N(n))))})}function Na(e,{viewport$:t,header$:r}){return yr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=xe(e);return{active:o>=n}}),oe("active"))}function qn(e,t){return R(()=>{let r=new w;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=le(".md-content h1");return typeof o=="undefined"?T:Na(o,t).pipe(M(n=>r.next(n)),A(()=>r.complete()),m(n=>W({ref:e},n)))})}function Kn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),te()),n=o.pipe(E(()=>Ce(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),oe("bottom"))));return J([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:c},size:{height:p}}])=>(p=Math.max(0,p-Math.max(0,a-c,i)-Math.max(0,p+c-s)),{offset:a-i,height:p,active:a-i<=c})),te((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function Da(e){let t=__md_get("__palette")||{index:e.findIndex(r=>matchMedia(r.getAttribute("data-md-color-media")).matches)};return U(...e).pipe(ee(r=>h(r,"change").pipe(m(()=>r))),z(e[Math.max(0,t.index)]),m(r=>({index:e.indexOf(r),color:{media:r.getAttribute("data-md-color-media"),scheme:r.getAttribute("data-md-color-scheme"),primary:r.getAttribute("data-md-color-primary"),accent:r.getAttribute("data-md-color-accent")}})),Z(1))}function Qn(e){let t=k("input",e),r=O("meta",{name:"theme-color"});document.head.appendChild(r);let o=O("meta",{name:"color-scheme"});document.head.appendChild(o);let n=It("(prefers-color-scheme: light)");return R(()=>{let i=new w;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),c=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=c.getAttribute("data-md-color-scheme"),a.color.primary=c.getAttribute("data-md-color-primary"),a.color.accent=c.getAttribute("data-md-color-accent")}for(let[s,c]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,c);for(let s=0;s{let a=ke("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(c=>(+c).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(Oe(se)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),Da(t).pipe(N(n.pipe(Le(1))),ut(),M(a=>i.next(a)),A(()=>i.complete()),m(a=>W({ref:e},a)))})}function Yn(e,{progress$:t}){return R(()=>{let r=new w;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(M(o=>r.next({value:o})),A(()=>r.complete()),m(o=>({ref:e,value:o})))})}function Va(e){if(e.length<2)return[""];let[t,r]=[...e].sort((n,i)=>n.length-i.length).map(n=>n.replace(/[^/]+$/,"")),o=0;if(t===r)o=t.length;else for(;t.charCodeAt(o)===r.charCodeAt(o);)o++;return e.map(n=>n.replace(t.slice(0,o),""))}function Lt(e){let t=de();return ln(new URL("sitemap.xml",e||t.base)).pipe(m(r=>Va(k("loc",r).map(o=>o.textContent))),Me(()=>T),Ue([]))}function Bn({document$:e}){let t=new Map;e.pipe(E(()=>k("link[rel=alternate]")),m(r=>new URL(r.href)),g(r=>!t.has(r.toString())),ee(r=>Lt(r).pipe(m(o=>[r,o])))).subscribe(([r,o])=>t.set(r.toString().replace(/\/$/,""),o)),h(document.body,"click").pipe(g(r=>!r.metaKey&&!r.ctrlKey),E(r=>{if(r.target instanceof Element){let o=r.target.closest("a");if(o&&!o.target){let n=[...t].find(([f])=>o.href.startsWith(f));if(typeof n=="undefined")return T;let[i,a]=n,s=ue();if(s.href.startsWith(i))return T;let c=de(),p=s.href.replace(c.base,""),l=a.includes(p.split("#")[0])?new URL(`${i}/${p}`,c.base):new URL(i);return r.preventDefault(),U(l)}}return T})).subscribe(r=>tt(r,!0))}var ro=qt(eo());function za(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Gn({alert$:e}){ro.default.isSupported()&&new D(t=>{new ro.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||za(F(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(M(t=>{t.trigger.focus()}),m(()=>_e("clipboard.copied"))).subscribe(e)}function Jn(e,t){if(!(e.target instanceof Element))return T;let r=e.target.closest("a");if(r===null)return T;if(r.target||e.metaKey||e.ctrlKey)return T;let o=new URL(r.href);return o.search=o.hash="",t.includes(`${o}`)?(e.preventDefault(),U(new URL(r.href))):T}function Xn(e){let t=le("[rel=canonical]",e);typeof t!="undefined"&&(t.href=t.href.replace("//localhost:","//127.0.0.1:"));let r=new Map;for(let o of k(":scope > *",e)){let n=o.outerHTML;for(let i of["href","src"]){let a=o.getAttribute(i);if(a===null)continue;let s=new URL(a,t==null?void 0:t.href),c=o.cloneNode();c.setAttribute(i,`${s}`),n=c.outerHTML;break}r.set(n,o)}return r}function Zn({location$:e,viewport$:t,progress$:r}){let o=de();if(location.protocol==="file:")return T;let n=Lt().pipe(m(l=>l.map(f=>`${new URL(f,o.base)}`))),i=h(document.body,"click").pipe(ne(n),E(([l,f])=>Jn(l,f)),ge());G("navigation.instant.prefetch")&&S(h(document.body,"mousemove"),h(document.body,"focusin")).pipe(ne(n),E(([l,f])=>Jn(l,f)),Ee(25),Dr(({href:l})=>l),fr(l=>{let f=document.createElement("link");return f.rel="prefetch",f.href=l.toString(),document.head.appendChild(f),h(f,"load").pipe(m(()=>f),ve(1))})).subscribe(l=>l.remove()),i.pipe(ve(1)).subscribe(()=>{let l=le("link[rel=icon]");typeof l!="undefined"&&(l.href=l.href)}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),i.pipe(ne(t)).subscribe(([l,{offset:f}])=>{history.scrollRestoration="manual",history.replaceState(f,""),history.pushState(null,"",l)}),i.subscribe(e);let a=e.pipe(z(ue()),oe("pathname"),Le(1),E(l=>xr(l,{progress$:r}).pipe(Me(()=>(tt(l,!0),T))))),s=new DOMParser,c=a.pipe(E(l=>l.text()),E(l=>{let f=s.parseFromString(l,"text/html");for(let b of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...G("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let I=le(b),Y=le(b,f);typeof I!="undefined"&&typeof Y!="undefined"&&I.replaceWith(Y)}let u=Xn(document.head),d=Xn(f.head);for(let[b,I]of d)I.getAttribute("rel")==="stylesheet"||I.hasAttribute("src")||(u.has(b)?u.delete(b):document.head.appendChild(I));for(let b of u.values())b.getAttribute("rel")==="stylesheet"||b.hasAttribute("src")||b.remove();let v=ke("container");return qe(k("script",v)).pipe(E(b=>{let I=f.createElement("script");if(b.src){for(let Y of b.getAttributeNames())I.setAttribute(Y,b.getAttribute(Y));return b.replaceWith(I),new D(Y=>{I.onload=()=>Y.complete()})}else return I.textContent=b.textContent,b.replaceWith(I),T}),re(),ce(f))}),ge());return h(window,"popstate").pipe(m(ue)).subscribe(e),e.pipe(z(ue()),Pe(2,1),g(([l,f])=>l.pathname===f.pathname&&l.hash!==f.hash),m(([,l])=>l)).subscribe(l=>{var f,u;history.state!==null||!l.hash?window.scrollTo(0,(u=(f=history.state)==null?void 0:f.y)!=null?u:0):(history.scrollRestoration="auto",gr(l.hash),history.scrollRestoration="manual")}),e.pipe(zr(i),z(ue()),Pe(2,1),g(([l,f])=>l.pathname===f.pathname&&l.hash===f.hash),m(([,l])=>l)).subscribe(l=>{history.scrollRestoration="auto",gr(l.hash),history.scrollRestoration="manual",history.back()}),c.pipe(ne(e)).subscribe(([,l])=>{var f,u;history.state!==null||!l.hash?window.scrollTo(0,(u=(f=history.state)==null?void 0:f.y)!=null?u:0):gr(l.hash)}),t.pipe(oe("offset"),Ee(100)).subscribe(({offset:l})=>{history.replaceState(l,"")}),c}var ri=qt(ti());function oi(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,ri.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function Wt(e){return e.type===1}function wr(e){return e.type===3}function ni(e,t){let r=bn(e);return S(U(location.protocol!=="file:"),Qe("search")).pipe(Ne(o=>o),E(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:G("search.suggest")}}})),r}function ii({document$:e}){let t=de(),r=Ye(new URL("../versions.json",t.base)).pipe(Me(()=>T)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),E(n=>h(document.body,"click").pipe(g(i=>!i.metaKey&&!i.ctrlKey),ne(o),E(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let c=s.href;return!i.target.closest(".md-version")&&n.get(c)===a?T:(i.preventDefault(),U(c))}}return T}),E(i=>{let{version:a}=n.get(i);return Lt(new URL(i)).pipe(m(s=>{let p=ue().href.replace(t.base,"");return s.includes(p.split("#")[0])?new URL(`../${a}/${p}`,t.base):new URL(i)}))})))).subscribe(n=>tt(n,!0)),J([r,o]).subscribe(([n,i])=>{F(".md-header__topic").appendChild(Mn(n,i))}),e.pipe(E(()=>o)).subscribe(n=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let s=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(s)||(s=[s]);e:for(let c of s)for(let p of n.aliases.concat(n.version))if(new RegExp(c,"i").test(p)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let s of pe("outdated"))s.hidden=!1})}function Ba(e,{worker$:t}){let{searchParams:r}=ue();r.has("q")&&(et("search",!0),e.value=r.get("q"),e.focus(),Qe("search").pipe(Ne(i=>!i)).subscribe(()=>{let i=ue();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=wt(e),n=S(t.pipe(Ne(Wt)),h(e,"keyup"),o).pipe(m(()=>e.value),te());return J([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),Z(1))}function ai(e,{worker$:t}){let r=new w,o=r.pipe(re(),ce(!0));J([t.pipe(Ne(Wt)),r],(i,a)=>a).pipe(oe("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(oe("focus")).subscribe(({focus:i})=>{i&&et("search",i)}),h(e.form,"reset").pipe(N(o)).subscribe(()=>e.focus());let n=F("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),Ba(e,{worker$:t}).pipe(M(i=>r.next(i)),A(()=>r.complete()),m(i=>W({ref:e},i)),Z(1))}function si(e,{worker$:t,query$:r}){let o=new w,n=rn(e.parentElement).pipe(g(Boolean)),i=e.parentElement,a=F(":scope > :first-child",e),s=F(":scope > :last-child",e);Qe("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(ne(r),Kr(t.pipe(Ne(Wt)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?_e("search.result.none"):_e("search.result.placeholder");break;case 1:a.textContent=_e("search.result.one");break;default:let u=hr(l.length);a.textContent=_e("search.result.other",u)}});let c=o.pipe(M(()=>s.innerHTML=""),E(({items:l})=>S(U(...l.slice(0,10)),U(...l.slice(10)).pipe(Pe(4),Yr(n),E(([f])=>f)))),m(Tn),ge());return c.subscribe(l=>s.appendChild(l)),c.pipe(ee(l=>{let f=le("details",l);return typeof f=="undefined"?T:h(f,"toggle").pipe(N(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(g(wr),m(({data:l})=>l)).pipe(M(l=>o.next(l)),A(()=>o.complete()),m(l=>W({ref:e},l)))}function Ga(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=ue();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function ci(e,t){let r=new w,o=r.pipe(re(),ce(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(N(o)).subscribe(n=>n.preventDefault()),Ga(e,t).pipe(M(n=>r.next(n)),A(()=>r.complete()),m(n=>W({ref:e},n)))}function pi(e,{worker$:t,keyboard$:r}){let o=new w,n=ke("search-query"),i=S(h(n,"keydown"),h(n,"focus")).pipe(Oe(se),m(()=>n.value),te());return o.pipe(at(i),m(([{suggest:s},c])=>{let p=c.split(/([\s-]+)/);if(s!=null&&s.length&&p[p.length-1]){let l=s[s.length-1];l.startsWith(p[p.length-1])&&(p[p.length-1]=l)}else p.length=0;return p})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(g(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(g(wr),m(({data:s})=>s)).pipe(M(s=>o.next(s)),A(()=>o.complete()),m(()=>({ref:e})))}function li(e,{index$:t,keyboard$:r}){let o=de();try{let n=ni(o.search,t),i=ke("search-query",e),a=ke("search-result",e);h(e,"click").pipe(g(({target:c})=>c instanceof Element&&!!c.closest("a"))).subscribe(()=>et("search",!1)),r.pipe(g(({mode:c})=>c==="search")).subscribe(c=>{let p=Ve();switch(c.type){case"Enter":if(p===i){let l=new Map;for(let f of k(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,d])=>d-u);f.click()}c.claim()}break;case"Escape":case"Tab":et("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof p=="undefined")i.focus();else{let l=[i,...k(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(p))+l.length+(c.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}c.claim();break;default:i!==Ve()&&i.focus()}}),r.pipe(g(({mode:c})=>c==="global")).subscribe(c=>{switch(c.type){case"f":case"s":case"/":i.focus(),i.select(),c.claim();break}});let s=ai(i,{worker$:n});return S(s,si(a,{worker$:n,query$:s})).pipe(De(...pe("search-share",e).map(c=>ci(c,{query$:s})),...pe("search-suggest",e).map(c=>pi(c,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Xe}}function mi(e,{index$:t,location$:r}){return J([t,r.pipe(z(ue()),g(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>oi(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let c=s.textContent,p=o(c);p.length>c.length&&n.set(s,p)}for(let[s,c]of n){let{childNodes:p}=O("span",null,c);s.replaceWith(...Array.from(p))}return{ref:e,nodes:n}}))}function Ja(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return J([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),te((i,a)=>i.height===a.height&&i.locked===a.locked))}function oo(e,o){var n=o,{header$:t}=n,r=lo(n,["header$"]);let i=F(".md-sidebar__scrollwrap",e),{y:a}=Ke(i);return R(()=>{let s=new w,c=s.pipe(re(),ce(!0)),p=s.pipe(He(0,Se));return p.pipe(ne(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),p.pipe(Ne()).subscribe(()=>{for(let l of k(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=xe(f);f.scrollTo({top:u-d/2})}}}),fe(k("label[tabindex]",e)).pipe(ee(l=>h(l,"click").pipe(Oe(se),m(()=>l),N(c)))).subscribe(l=>{let f=F(`[id="${l.htmlFor}"]`);F(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),Ja(e,r).pipe(M(l=>s.next(l)),A(()=>s.complete()),m(l=>W({ref:e},l)))})}function fi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return $t(Ye(`${r}/releases/latest`).pipe(Me(()=>T),m(o=>({version:o.tag_name})),Ue({})),Ye(r).pipe(Me(()=>T),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),Ue({}))).pipe(m(([o,n])=>W(W({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Ye(r).pipe(m(o=>({repositories:o.public_repos})),Ue({}))}}function ui(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ye(r).pipe(Me(()=>T),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Ue({}))}function di(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return fi(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return ui(r,o)}return T}var Xa;function Za(e){return Xa||(Xa=R(()=>{let t=__md_get("__source",sessionStorage);if(t)return U(t);if(pe("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return T}return di(e.href).pipe(M(o=>__md_set("__source",o,sessionStorage)))}).pipe(Me(()=>T),g(t=>Object.keys(t).length>0),m(t=>({facts:t})),Z(1)))}function hi(e){let t=F(":scope > :last-child",e);return R(()=>{let r=new w;return r.subscribe(({facts:o})=>{t.appendChild(Sn(o)),t.classList.add("md-source__repository--active")}),Za(e).pipe(M(o=>r.next(o)),A(()=>r.complete()),m(o=>W({ref:e},o)))})}function es(e,{viewport$:t,header$:r}){return Ce(document.body).pipe(E(()=>yr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),oe("hidden"))}function bi(e,t){return R(()=>{let r=new w;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(G("navigation.tabs.sticky")?U({hidden:!1}):es(e,t)).pipe(M(o=>r.next(o)),A(()=>r.complete()),m(o=>W({ref:e},o)))})}function ts(e,{viewport$:t,header$:r}){let o=new Map,n=k("[href^=\\#]",e);for(let s of n){let c=decodeURIComponent(s.hash.substring(1)),p=le(`[id="${c}"]`);typeof p!="undefined"&&o.set(s,p)}let i=r.pipe(oe("height"),m(({height:s})=>{let c=ke("main"),p=F(":scope > :first-child",c);return s+.8*(p.offsetTop-c.offsetTop)}),ge());return Ce(document.body).pipe(oe("height"),E(s=>R(()=>{let c=[];return U([...o].reduce((p,[l,f])=>{for(;c.length&&o.get(c[c.length-1]).tagName>=f.tagName;)c.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let d=f.offsetParent;for(;d;d=d.offsetParent)u+=d.offsetTop;return p.set([...c=[...c,l]].reverse(),u)},new Map))}).pipe(m(c=>new Map([...c].sort(([,p],[,l])=>p-l))),at(i),E(([c,p])=>t.pipe(Rt(([l,f],{offset:{y:u},size:d})=>{let v=u+d.height>=Math.floor(s.height);for(;f.length;){let[,b]=f[0];if(b-p=u&&!v)f=[l.pop(),...f];else break}return[l,f]},[[],[...c]]),te((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,c])=>({prev:s.map(([p])=>p),next:c.map(([p])=>p)})),z({prev:[],next:[]}),Pe(2,1),m(([s,c])=>s.prev.length{let i=new w,a=i.pipe(re(),ce(!0));if(i.subscribe(({prev:s,next:c})=>{for(let[p]of c)p.classList.remove("md-nav__link--passed"),p.classList.remove("md-nav__link--active");for(let[p,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",p===s.length-1)}),G("toc.follow")){let s=S(t.pipe(Ee(1),m(()=>{})),t.pipe(Ee(250),m(()=>"smooth")));i.pipe(g(({prev:c})=>c.length>0),at(o.pipe(Oe(se))),ne(s)).subscribe(([[{prev:c}],p])=>{let[l]=c[c.length-1];if(l.offsetHeight){let f=br(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=xe(f);f.scrollTo({top:u-d/2,behavior:p})}}})}return G("navigation.tracking")&&t.pipe(N(a),oe("offset"),Ee(250),Le(1),N(n.pipe(Le(1))),ut({delay:250}),ne(i)).subscribe(([,{prev:s}])=>{let c=ue(),p=s[s.length-1];if(p&&p.length){let[l]=p,{hash:f}=new URL(l.href);c.hash!==f&&(c.hash=f,history.replaceState({},"",`${c}`))}else c.hash="",history.replaceState({},"",`${c}`)}),ts(e,{viewport$:t,header$:r}).pipe(M(s=>i.next(s)),A(()=>i.complete()),m(s=>W({ref:e},s)))})}function rs(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Pe(2,1),m(([a,s])=>a>s&&s>0),te()),i=r.pipe(m(({active:a})=>a));return J([i,n]).pipe(m(([a,s])=>!(a&&s)),te(),N(o.pipe(Le(1))),ce(!0),ut({delay:250}),m(a=>({hidden:a})))}function gi(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new w,a=i.pipe(re(),ce(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(N(a),oe("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),h(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),rs(e,{viewport$:t,main$:o,target$:n}).pipe(M(s=>i.next(s)),A(()=>i.complete()),m(s=>W({ref:e},s)))}function xi({document$:e}){e.pipe(E(()=>k(".md-ellipsis")),ee(t=>Ot(t).pipe(N(e.pipe(Le(1))),g(r=>r),m(()=>t),ve(1))),g(t=>t.offsetWidth{let r=t.innerText,o=t.closest("a")||t;return o.title=r,Be(o).pipe(N(e.pipe(Le(1))),A(()=>o.removeAttribute("title")))})).subscribe(),e.pipe(E(()=>k(".md-status")),ee(t=>Be(t))).subscribe()}function yi({document$:e,tablet$:t}){e.pipe(E(()=>k(".md-toggle--indeterminate")),M(r=>{r.indeterminate=!0,r.checked=!1}),ee(r=>h(r,"change").pipe(Qr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ne(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function os(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Ei({document$:e}){e.pipe(E(()=>k("[data-md-scrollfix]")),M(t=>t.removeAttribute("data-md-scrollfix")),g(os),ee(t=>h(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function wi({viewport$:e,tablet$:t}){J([Qe("search"),t]).pipe(m(([r,o])=>r&&!o),E(r=>U(r).pipe(Ze(r?400:100))),ne(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function ns(){return location.protocol==="file:"?Tt(`${new URL("search/search_index.js",no.base)}`).pipe(m(()=>__index),Z(1)):Ye(new URL("search/search_index.json",no.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var rt=Jo(),Nt=an(),_t=cn(Nt),io=nn(),$e=hn(),Tr=It("(min-width: 960px)"),Si=It("(min-width: 1220px)"),Oi=pn(),no=de(),Mi=document.forms.namedItem("search")?ns():Xe,ao=new w;Gn({alert$:ao});Bn({document$:rt});var so=new w;G("navigation.instant")&&Zn({location$:Nt,viewport$:$e,progress$:so}).subscribe(rt);var Ti;((Ti=no.version)==null?void 0:Ti.provider)==="mike"&&ii({document$:rt});S(Nt,_t).pipe(Ze(125)).subscribe(()=>{et("drawer",!1),et("search",!1)});io.pipe(g(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=le("link[rel=prev]");typeof t!="undefined"&&tt(t);break;case"n":case".":let r=le("link[rel=next]");typeof r!="undefined"&&tt(r);break;case"Enter":let o=Ve();o instanceof HTMLLabelElement&&o.click()}});xi({document$:rt});yi({document$:rt,tablet$:Tr});Ei({document$:rt});wi({viewport$:$e,tablet$:Tr});var ct=Vn(ke("header"),{viewport$:$e}),Ut=rt.pipe(m(()=>ke("main")),E(e=>Kn(e,{viewport$:$e,header$:ct})),Z(1)),is=S(...pe("consent").map(e=>gn(e,{target$:_t})),...pe("dialog").map(e=>Dn(e,{alert$:ao})),...pe("header").map(e=>zn(e,{viewport$:$e,header$:ct,main$:Ut})),...pe("palette").map(e=>Qn(e)),...pe("progress").map(e=>Yn(e,{progress$:so})),...pe("search").map(e=>li(e,{index$:Mi,keyboard$:io})),...pe("source").map(e=>hi(e))),as=R(()=>S(...pe("announce").map(e=>vn(e)),...pe("content").map(e=>Nn(e,{viewport$:$e,target$:_t,print$:Oi})),...pe("content").map(e=>G("search.highlight")?mi(e,{index$:Mi,location$:Nt}):T),...pe("header-title").map(e=>qn(e,{viewport$:$e,header$:ct})),...pe("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Gr(Si,()=>oo(e,{viewport$:$e,header$:ct,main$:Ut})):Gr(Tr,()=>oo(e,{viewport$:$e,header$:ct,main$:Ut}))),...pe("tabs").map(e=>bi(e,{viewport$:$e,header$:ct})),...pe("toc").map(e=>vi(e,{viewport$:$e,header$:ct,main$:Ut,target$:_t})),...pe("top").map(e=>gi(e,{viewport$:$e,header$:ct,main$:Ut,target$:_t})))),Li=rt.pipe(E(()=>as),De(is),Z(1));Li.subscribe();window.document$=rt;window.location$=Nt;window.target$=_t;window.keyboard$=io;window.viewport$=$e;window.tablet$=Tr;window.screen$=Si;window.print$=Oi;window.alert$=ao;window.progress$=so;window.component$=Li;})(); diff --git a/assets/javascripts/bundle.a5ca32a6.min.js b/assets/javascripts/bundle.a5ca32a6.min.js deleted file mode 100644 index 7ba44c99..00000000 --- a/assets/javascripts/bundle.a5ca32a6.min.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict";(()=>{var Hi=Object.create;var Or=Object.defineProperty;var $i=Object.getOwnPropertyDescriptor;var Ri=Object.getOwnPropertyNames,Dt=Object.getOwnPropertySymbols,Pi=Object.getPrototypeOf,Mr=Object.prototype.hasOwnProperty,po=Object.prototype.propertyIsEnumerable;var co=(e,t,r)=>t in e?Or(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,j=(e,t)=>{for(var r in t||(t={}))Mr.call(t,r)&&co(e,r,t[r]);if(Dt)for(var r of Dt(t))po.call(t,r)&&co(e,r,t[r]);return e};var lo=(e,t)=>{var r={};for(var o in e)Mr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Dt)for(var o of Dt(e))t.indexOf(o)<0&&po.call(e,o)&&(r[o]=e[o]);return r};var Lr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Ii=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ri(t))!Mr.call(e,n)&&n!==r&&Or(e,n,{get:()=>t[n],enumerable:!(o=$i(t,n))||o.enumerable});return e};var Vt=(e,t,r)=>(r=e!=null?Hi(Pi(e)):{},Ii(t||!e||!e.__esModule?Or(r,"default",{value:e,enumerable:!0}):r,e));var fo=Lr((_r,mo)=>{(function(e,t){typeof _r=="object"&&typeof mo!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(_r,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(C){return!!(C&&C!==document&&C.nodeName!=="HTML"&&C.nodeName!=="BODY"&&"classList"in C&&"contains"in C.classList)}function c(C){var et=C.type,H=C.tagName;return!!(H==="INPUT"&&a[et]&&!C.readOnly||H==="TEXTAREA"&&!C.readOnly||C.isContentEditable)}function p(C){C.classList.contains("focus-visible")||(C.classList.add("focus-visible"),C.setAttribute("data-focus-visible-added",""))}function l(C){C.hasAttribute("data-focus-visible-added")&&(C.classList.remove("focus-visible"),C.removeAttribute("data-focus-visible-added"))}function f(C){C.metaKey||C.altKey||C.ctrlKey||(s(r.activeElement)&&p(r.activeElement),o=!0)}function u(C){o=!1}function h(C){s(C.target)&&(o||c(C.target))&&p(C.target)}function v(C){s(C.target)&&(C.target.classList.contains("focus-visible")||C.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(C.target))}function b(C){document.visibilityState==="hidden"&&(n&&(o=!0),U())}function U(){document.addEventListener("mousemove",X),document.addEventListener("mousedown",X),document.addEventListener("mouseup",X),document.addEventListener("pointermove",X),document.addEventListener("pointerdown",X),document.addEventListener("pointerup",X),document.addEventListener("touchmove",X),document.addEventListener("touchstart",X),document.addEventListener("touchend",X)}function Y(){document.removeEventListener("mousemove",X),document.removeEventListener("mousedown",X),document.removeEventListener("mouseup",X),document.removeEventListener("pointermove",X),document.removeEventListener("pointerdown",X),document.removeEventListener("pointerup",X),document.removeEventListener("touchmove",X),document.removeEventListener("touchstart",X),document.removeEventListener("touchend",X)}function X(C){C.target.nodeName&&C.target.nodeName.toLowerCase()==="html"||(o=!1,Y())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",b,!0),U(),r.addEventListener("focus",h,!0),r.addEventListener("blur",v,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var eo=Lr((It,Zr)=>{(function(t,r){typeof It=="object"&&typeof Zr=="object"?Zr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof It=="object"?It.ClipboardJS=r():t.ClipboardJS=r()})(It,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return ki}});var a=i(279),s=i.n(a),c=i(370),p=i.n(c),l=i(817),f=i.n(l);function u(q){try{return document.execCommand(q)}catch(_){return!1}}var h=function(_){var L=f()(_);return u("cut"),L},v=h;function b(q){var _=document.documentElement.getAttribute("dir")==="rtl",L=document.createElement("textarea");L.style.fontSize="12pt",L.style.border="0",L.style.padding="0",L.style.margin="0",L.style.position="absolute",L.style[_?"right":"left"]="-9999px";var F=window.pageYOffset||document.documentElement.scrollTop;return L.style.top="".concat(F,"px"),L.setAttribute("readonly",""),L.value=q,L}var U=function(_,L){var F=b(_);L.container.appendChild(F);var V=f()(F);return u("copy"),F.remove(),V},Y=function(_){var L=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},F="";return typeof _=="string"?F=U(_,L):_ instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(_==null?void 0:_.type)?F=U(_.value,L):(F=f()(_),u("copy")),F},X=Y;function C(q){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?C=function(L){return typeof L}:C=function(L){return L&&typeof Symbol=="function"&&L.constructor===Symbol&&L!==Symbol.prototype?"symbol":typeof L},C(q)}var et=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},L=_.action,F=L===void 0?"copy":L,V=_.container,G=_.target,Ie=_.text;if(F!=="copy"&&F!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(G!==void 0)if(G&&C(G)==="object"&&G.nodeType===1){if(F==="copy"&&G.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(F==="cut"&&(G.hasAttribute("readonly")||G.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Ie)return X(Ie,{container:V});if(G)return F==="cut"?v(G):X(G,{container:V})},H=et;function B(q){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?B=function(L){return typeof L}:B=function(L){return L&&typeof Symbol=="function"&&L.constructor===Symbol&&L!==Symbol.prototype?"symbol":typeof L},B(q)}function ce(q,_){if(!(q instanceof _))throw new TypeError("Cannot call a class as a function")}function ue(q,_){for(var L=0;L<_.length;L++){var F=_[L];F.enumerable=F.enumerable||!1,F.configurable=!0,"value"in F&&(F.writable=!0),Object.defineProperty(q,F.key,F)}}function we(q,_,L){return _&&ue(q.prototype,_),L&&ue(q,L),q}function Ye(q,_){if(typeof _!="function"&&_!==null)throw new TypeError("Super expression must either be null or a function");q.prototype=Object.create(_&&_.prototype,{constructor:{value:q,writable:!0,configurable:!0}}),_&&Tr(q,_)}function Tr(q,_){return Tr=Object.setPrototypeOf||function(F,V){return F.__proto__=V,F},Tr(q,_)}function Mi(q){var _=Ai();return function(){var F=Nt(q),V;if(_){var G=Nt(this).constructor;V=Reflect.construct(F,arguments,G)}else V=F.apply(this,arguments);return Li(this,V)}}function Li(q,_){return _&&(B(_)==="object"||typeof _=="function")?_:_i(q)}function _i(q){if(q===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return q}function Ai(){if(typeof Reflect=="undefined"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(q){return!1}}function Nt(q){return Nt=Object.setPrototypeOf?Object.getPrototypeOf:function(L){return L.__proto__||Object.getPrototypeOf(L)},Nt(q)}function Sr(q,_){var L="data-clipboard-".concat(q);if(_.hasAttribute(L))return _.getAttribute(L)}var Ci=function(q){Ye(L,q);var _=Mi(L);function L(F,V){var G;return ce(this,L),G=_.call(this),G.resolveOptions(V),G.listenClick(F),G}return we(L,[{key:"resolveOptions",value:function(){var V=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof V.action=="function"?V.action:this.defaultAction,this.target=typeof V.target=="function"?V.target:this.defaultTarget,this.text=typeof V.text=="function"?V.text:this.defaultText,this.container=B(V.container)==="object"?V.container:document.body}},{key:"listenClick",value:function(V){var G=this;this.listener=p()(V,"click",function(Ie){return G.onClick(Ie)})}},{key:"onClick",value:function(V){var G=V.delegateTarget||V.currentTarget,Ie=this.action(G)||"copy",Ut=H({action:Ie,container:this.container,target:this.target(G),text:this.text(G)});this.emit(Ut?"success":"error",{action:Ie,text:Ut,trigger:G,clearSelection:function(){G&&G.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(V){return Sr("action",V)}},{key:"defaultTarget",value:function(V){var G=Sr("target",V);if(G)return document.querySelector(G)}},{key:"defaultText",value:function(V){return Sr("text",V)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(V){var G=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return X(V,G)}},{key:"cut",value:function(V){return v(V)}},{key:"isSupported",value:function(){var V=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],G=typeof V=="string"?[V]:V,Ie=!!document.queryCommandSupported;return G.forEach(function(Ut){Ie=Ie&&!!document.queryCommandSupported(Ut)}),Ie}}]),L}(s()),ki=Ci},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,c){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(c))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(l,f,u,h,v){var b=p.apply(this,arguments);return l.addEventListener(u,b,v),{destroy:function(){l.removeEventListener(u,b,v)}}}function c(l,f,u,h,v){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(b){return s(b,f,u,h,v)}))}function p(l,f,u,h){return function(v){v.delegateTarget=a(v.target,f),v.delegateTarget&&h.call(l,v)}}o.exports=c},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function c(u,h,v){if(!u&&!h&&!v)throw new Error("Missing required arguments");if(!a.string(h))throw new TypeError("Second argument must be a String");if(!a.fn(v))throw new TypeError("Third argument must be a Function");if(a.node(u))return p(u,h,v);if(a.nodeList(u))return l(u,h,v);if(a.string(u))return f(u,h,v);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function p(u,h,v){return u.addEventListener(h,v),{destroy:function(){u.removeEventListener(h,v)}}}function l(u,h,v){return Array.prototype.forEach.call(u,function(b){b.addEventListener(h,v)}),{destroy:function(){Array.prototype.forEach.call(u,function(b){b.removeEventListener(h,v)})}}}function f(u,h,v){return s(document.body,u,h,v)}o.exports=c},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),p=document.createRange();p.selectNodeContents(i),c.removeAllRanges(),c.addRange(p),a=c.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var c=this;function p(){c.off(i,p),a.apply(s,arguments)}return p._=a,this.on(i,p,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),c=0,p=s.length;for(c;c{"use strict";var za=/["'&<>]/;Xn.exports=qa;function qa(e){var t=""+e,r=za.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i0&&i[i.length-1])&&(p[0]===6||p[0]===2)){r=0;continue}if(p[0]===3&&(!i||p[1]>i[0]&&p[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function K(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function Q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||s(u,h)})})}function s(u,h){try{c(o[u](h))}catch(v){f(i[0][3],v)}}function c(u){u.value instanceof ct?Promise.resolve(u.value.v).then(p,l):f(i[0][2],u)}function p(u){s("next",u)}function l(u){s("throw",u)}function f(u,h){u(h),i.shift(),i.length&&s(i[0][0],i[0][1])}}function bo(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof Te=="function"?Te(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(a){return new Promise(function(s,c){a=e[i](a),n(s,c,a.done,a.value)})}}function n(i,a,s,c){Promise.resolve(c).then(function(p){i({value:p,done:s})},a)}}function k(e){return typeof e=="function"}function ut(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var qt=ut(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: -`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` - `):"",this.name="UnsubscriptionError",this.errors=r}});function Be(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var De=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=Te(a),c=s.next();!c.done;c=s.next()){var p=c.value;p.remove(this)}}catch(b){t={error:b}}finally{try{c&&!c.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(k(l))try{l()}catch(b){i=b instanceof qt?b.errors:[b]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=Te(f),h=u.next();!h.done;h=u.next()){var v=h.value;try{vo(v)}catch(b){i=i!=null?i:[],b instanceof qt?i=Q(Q([],K(i)),K(b.errors)):i.push(b)}}}catch(b){o={error:b}}finally{try{h&&!h.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new qt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)vo(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Be(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Be(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Cr=De.EMPTY;function Kt(e){return e instanceof De||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function vo(e){k(e)?e():e.unsubscribe()}var Fe={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var dt={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Cr:(this.currentObservers=null,s.push(r),new De(function(){o.currentObservers=null,Be(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new D;return r.source=this,r},t.create=function(r,o){return new Oo(r,o)},t}(D);var Oo=function(e){me(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Cr},t}(w);var _t={now:function(){return(_t.delegate||Date).now()},delegate:void 0};var At=function(e){me(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=_t);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,c=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),c=0;c0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=vt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(vt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(Bt);var _o=function(e){me(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(Gt);var Se=new _o(Lo);var M=new D(function(e){return e.complete()});function Jt(e){return e&&k(e.schedule)}function Fr(e){return e[e.length-1]}function tt(e){return k(Fr(e))?e.pop():void 0}function Re(e){return Jt(Fr(e))?e.pop():void 0}function Xt(e,t){return typeof Fr(e)=="number"?e.pop():t}var gt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Zt(e){return k(e==null?void 0:e.then)}function er(e){return k(e[bt])}function tr(e){return Symbol.asyncIterator&&k(e==null?void 0:e[Symbol.asyncIterator])}function rr(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function qi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var or=qi();function nr(e){return k(e==null?void 0:e[or])}function ir(e){return ho(this,arguments,function(){var r,o,n,i;return zt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,ct(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,ct(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,ct(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function ar(e){return k(e==null?void 0:e.getReader)}function P(e){if(e instanceof D)return e;if(e!=null){if(er(e))return Ki(e);if(gt(e))return Qi(e);if(Zt(e))return Yi(e);if(tr(e))return Ao(e);if(nr(e))return Bi(e);if(ar(e))return Gi(e)}throw rr(e)}function Ki(e){return new D(function(t){var r=e[bt]();if(k(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Qi(e){return new D(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?y(function(n,i){return e(n,i,o)}):de,he(1),r?je(t):Ko(function(){return new cr}))}}function Vr(e){return e<=0?function(){return M}:g(function(t,r){var o=[];t.subscribe(x(r,function(n){o.push(n),e=2,!0))}function be(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new w}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,c=s===void 0?!0:s;return function(p){var l,f,u,h=0,v=!1,b=!1,U=function(){f==null||f.unsubscribe(),f=void 0},Y=function(){U(),l=u=void 0,v=b=!1},X=function(){var C=l;Y(),C==null||C.unsubscribe()};return g(function(C,et){h++,!b&&!v&&U();var H=u=u!=null?u:r();et.add(function(){h--,h===0&&!b&&!v&&(f=qr(X,c))}),H.subscribe(et),!l&&h>0&&(l=new lt({next:function(B){return H.next(B)},error:function(B){b=!0,U(),f=qr(Y,n,B),H.error(B)},complete:function(){v=!0,U(),f=qr(Y,a),H.complete()}}),P(C).subscribe(l))})(p)}}function qr(e,t){for(var r=[],o=2;oe.next(document)),e}function R(e,t=document){return Array.from(t.querySelectorAll(e))}function I(e,t=document){let r=le(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function le(e,t=document){return t.querySelector(e)||void 0}function Ue(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}var da=S(d(document.body,"focusin"),d(document.body,"focusout")).pipe(Ee(1),z(void 0),m(()=>Ue()||document.body),ee(1));function Et(e){return da.pipe(m(t=>e.contains(t)),te())}function mr(e,t){return S(d(e,"mouseenter").pipe(m(()=>!0)),d(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ee(t):de,z(!1))}function ze(e){return{x:e.offsetLeft,y:e.offsetTop}}function Jo(e){return S(d(window,"load"),d(window,"resize")).pipe(He(0,Se),m(()=>ze(e)),z(ze(e)))}function fr(e){return{x:e.scrollLeft,y:e.scrollTop}}function it(e){return S(d(e,"scroll"),d(window,"resize")).pipe(He(0,Se),m(()=>fr(e)),z(fr(e)))}function Xo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Xo(e,r)}function O(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Xo(o,n);return o}function ur(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function wt(e){let t=O("script",{src:e});return $(()=>(document.head.appendChild(t),S(d(t,"load"),d(t,"error").pipe(E(()=>jr(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),A(()=>document.head.removeChild(t)),he(1))))}var Zo=new w,ha=$(()=>typeof ResizeObserver=="undefined"?wt("https://unpkg.com/resize-observer-polyfill/dist/ResizeObserver.js"):W(void 0)).pipe(m(()=>new ResizeObserver(e=>{for(let t of e)Zo.next(t)})),E(e=>S(Je,W(e)).pipe(A(()=>e.disconnect()))),ee(1));function ve(e){return{width:e.offsetWidth,height:e.offsetHeight}}function Ce(e){return ha.pipe(T(t=>t.observe(e)),E(t=>Zo.pipe(y(({target:r})=>r===e),A(()=>t.unobserve(e)),m(()=>ve(e)))),z(ve(e)))}function Tt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function dr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var en=new w,ba=$(()=>W(new IntersectionObserver(e=>{for(let t of e)en.next(t)},{threshold:0}))).pipe(E(e=>S(Je,W(e)).pipe(A(()=>e.disconnect()))),ee(1));function St(e){return ba.pipe(T(t=>t.observe(e)),E(t=>en.pipe(y(({target:r})=>r===e),A(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function tn(e,t=16){return it(e).pipe(m(({y:r})=>{let o=ve(e),n=Tt(e);return r>=n.height-o.height-t}),te())}var hr={drawer:I("[data-md-toggle=drawer]"),search:I("[data-md-toggle=search]")};function rn(e){return hr[e].checked}function Ze(e,t){hr[e].checked!==t&&hr[e].click()}function qe(e){let t=hr[e];return d(t,"change").pipe(m(()=>t.checked),z(t.checked))}function va(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function ga(){return S(d(window,"compositionstart").pipe(m(()=>!0)),d(window,"compositionend").pipe(m(()=>!1))).pipe(z(!1))}function on(){let e=d(window,"keydown").pipe(y(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:rn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),y(({mode:t,type:r})=>{if(t==="global"){let o=Ue();if(typeof o!="undefined")return!va(o,r)}return!0}),be());return ga().pipe(E(t=>t?M:e))}function ge(){return new URL(location.href)}function ft(e,t=!1){if(J("navigation.instant")&&!t){let r=O("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function nn(){return new w}function an(){return location.hash.slice(1)}function br(e){let t=O("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Br(e){return S(d(window,"hashchange"),e).pipe(m(an),z(an()),y(t=>t.length>0),ee(1))}function sn(e){return Br(e).pipe(m(t=>le(`[id="${t}"]`)),y(t=>typeof t!="undefined"))}function Rt(e){let t=matchMedia(e);return pr(r=>t.addListener(()=>r(t.matches))).pipe(z(t.matches))}function cn(){let e=matchMedia("print");return S(d(window,"beforeprint").pipe(m(()=>!0)),d(window,"afterprint").pipe(m(()=>!1))).pipe(z(e.matches))}function Gr(e,t){return e.pipe(E(r=>r?t():M))}function vr(e,t){return new D(r=>{let o=new XMLHttpRequest;o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network Error"))}),o.addEventListener("abort",()=>{r.error(new Error("Request aborted"))}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{t.progress$.next(n.loaded/n.total*100)}),t.progress$.next(5)),o.send()})}function Ke(e,t){return vr(e,t).pipe(E(r=>r.text()),m(r=>JSON.parse(r)),ee(1))}function pn(e,t){let r=new DOMParser;return vr(e,t).pipe(E(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),ee(1))}function ln(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function mn(){return S(d(window,"scroll",{passive:!0}),d(window,"resize",{passive:!0})).pipe(m(ln),z(ln()))}function fn(){return{width:innerWidth,height:innerHeight}}function un(){return d(window,"resize",{passive:!0}).pipe(m(fn),z(fn()))}function dn(){return Z([mn(),un()]).pipe(m(([e,t])=>({offset:e,size:t})),ee(1))}function gr(e,{viewport$:t,header$:r}){let o=t.pipe(ne("size")),n=Z([o,r]).pipe(m(()=>ze(e)));return Z([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:c,y:p}])=>({offset:{x:a.x-c,y:a.y-p+i},size:s})))}function xa(e){return d(e,"message",t=>t.data)}function ya(e){let t=new w;return t.subscribe(r=>e.postMessage(r)),t}function hn(e,t=new Worker(e)){let r=xa(t),o=ya(t),n=new w;n.subscribe(o);let i=o.pipe(oe(),se(!0));return n.pipe(oe(),Ne(r.pipe(N(i))),be())}var Ea=I("#__config"),Ot=JSON.parse(Ea.textContent);Ot.base=`${new URL(Ot.base,ge())}`;function xe(){return Ot}function J(e){return Ot.features.includes(e)}function _e(e,t){return typeof t!="undefined"?Ot.translations[e].replace("#",t.toString()):Ot.translations[e]}function ke(e,t=document){return I(`[data-md-component=${e}]`,t)}function pe(e,t=document){return R(`[data-md-component=${e}]`,t)}function wa(e){let t=I(".md-typeset > :first-child",e);return d(t,"click",{once:!0}).pipe(m(()=>I(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function bn(e){if(!J("announce.dismiss")||!e.childElementCount)return M;if(!e.hidden){let t=I(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return $(()=>{let t=new w;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),wa(e).pipe(T(r=>t.next(r)),A(()=>t.complete()),m(r=>j({ref:e},r)))})}function Ta(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function vn(e,t){let r=new w;return r.subscribe(({hidden:o})=>{e.hidden=o}),Ta(e,t).pipe(T(o=>r.next(o)),A(()=>r.complete()),m(o=>j({ref:e},o)))}function Pt(e,t){return t==="inline"?O("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},O("div",{class:"md-tooltip__inner md-typeset"})):O("div",{class:"md-tooltip",id:e,role:"tooltip"},O("div",{class:"md-tooltip__inner md-typeset"}))}function gn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return O("aside",{class:"md-annotation",tabIndex:0},Pt(t),O("a",{href:r,class:"md-annotation__index",tabIndex:-1},O("span",{"data-md-annotation-id":e})))}else return O("aside",{class:"md-annotation",tabIndex:0},Pt(t),O("span",{class:"md-annotation__index",tabIndex:-1},O("span",{"data-md-annotation-id":e})))}function xn(e){return O("button",{class:"md-code__button",title:_e("clipboard.copy"),"data-clipboard-target":`#${e} > code`,"data-md-type":"copy"})}function yn(){return O("button",{class:"md-code__button",title:"Toggle line selection","data-md-type":"select"})}function En(){return O("nav",{class:"md-code__nav"})}function Jr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(c=>!e.terms[c]).reduce((c,p)=>[...c,O("del",null,p)," "],[]).slice(0,-1),i=xe(),a=new URL(e.location,i.base);J("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,c])=>c).reduce((c,[p])=>`${c} ${p}`.trim(),""));let{tags:s}=xe();return O("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},O("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&O("div",{class:"md-search-result__icon md-icon"}),r>0&&O("h1",null,e.title),r<=0&&O("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(c=>{let p=s?c in s?`md-tag-icon md-tag--${s[c]}`:"md-tag-icon":"";return O("span",{class:`md-tag ${p}`},c)}),o>0&&n.length>0&&O("p",{class:"md-search-result__terms"},_e("search.result.term.missing"),": ",...n)))}function wn(e){let t=e[0].score,r=[...e],o=xe(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreJr(l,1)),...c.length?[O("details",{class:"md-search-result__more"},O("summary",{tabIndex:-1},O("div",null,c.length>0&&c.length===1?_e("search.result.more.one"):_e("search.result.more.other",c.length))),...c.map(l=>Jr(l,1)))]:[]];return O("li",{class:"md-search-result__item"},p)}function Tn(e){return O("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>O("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?ur(r):r)))}function Xr(e){let t=`tabbed-control tabbed-control--${e}`;return O("div",{class:t,hidden:!0},O("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function Sn(e){return O("div",{class:"md-typeset__scrollwrap"},O("div",{class:"md-typeset__table"},e))}function Sa(e){let t=xe(),r=new URL(`../${e.version}/`,t.base);return O("li",{class:"md-version__item"},O("a",{href:`${r}`,class:"md-version__link"},e.title))}function On(e,t){return O("div",{class:"md-version"},O("button",{class:"md-version__current","aria-label":_e("select.version")},t.title),O("ul",{class:"md-version__list"},e.map(Sa)))}var Oa=0;function Ma(e,t){document.body.append(e);let{width:r}=ve(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=dr(t),n=typeof o!="undefined"?it(o):W({x:0,y:0}),i=S(Et(t),mr(t)).pipe(te());return Z([i,n]).pipe(m(([a,s])=>{let{x:c,y:p}=ze(t),l=ve(t),f=t.closest("table");return f&&t.parentElement&&(c+=f.offsetLeft+t.parentElement.offsetLeft,p+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:c-s.x+l.width/2-r/2,y:p-s.y+l.height+8}}}))}function Qe(e){let t=e.title;if(!t.length)return M;let r=`__tooltip_${Oa++}`,o=Pt(r,"inline"),n=I(".md-typeset",o);return n.innerHTML=t,$(()=>{let i=new w;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),S(i.pipe(y(({active:a})=>a)),i.pipe(Ee(250),y(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(He(16,Se)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe($t(125,Se),y(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Ma(o,e).pipe(T(a=>i.next(a)),A(()=>i.complete()),m(a=>j({ref:e},a)))}).pipe(Ge(ae))}function La(e,t){let r=$(()=>Z([Jo(e),it(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ve(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return Et(e).pipe(E(o=>r.pipe(m(n=>({active:o,offset:n})),he(+!o||1/0))))}function Mn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return $(()=>{let i=new w,a=i.pipe(oe(),se(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),St(e).pipe(N(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),S(i.pipe(y(({active:s})=>s)),i.pipe(Ee(250),y(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(He(16,Se)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe($t(125,Se),y(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),d(n,"click").pipe(N(a),y(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),d(n,"mousedown").pipe(N(a),ie(i)).subscribe(([s,{active:c}])=>{var p;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(c){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(p=Ue())==null||p.blur()}}),r.pipe(N(a),y(s=>s===o),Xe(125)).subscribe(()=>e.focus()),La(e,t).pipe(T(s=>i.next(s)),A(()=>i.complete()),m(s=>j({ref:e},s)))})}function _a(e){let t=xe();if(e.tagName!=="CODE")return[e];let r=[".c",".c1",".cm"];if(typeof t.annotate!="undefined"){let o=e.closest("[class|=language]");if(o)for(let n of Array.from(o.classList)){if(!n.startsWith("language-"))continue;let[,i]=n.split("-");i in t.annotate&&r.push(...t.annotate[i])}}return R(r.join(", "),e)}function Aa(e){let t=[];for(let r of _a(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,c]=a;if(typeof c=="undefined"){let p=i.splitText(a.index);i=p.splitText(s.length),t.push(p)}else{i.textContent=s,t.push(i);break}}}}return t}function Ln(e,t){t.append(...Array.from(e.childNodes))}function xr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Aa(t)){let[,c]=s.textContent.match(/\((\d+)\)/);le(`:scope > li:nth-child(${c})`,e)&&(a.set(c,gn(c,i)),s.replaceWith(a.get(c)))}return a.size===0?M:$(()=>{let s=new w,c=s.pipe(oe(),se(!0)),p=[];for(let[l,f]of a)p.push([I(".md-typeset",f),I(`:scope > li:nth-child(${l})`,e)]);return o.pipe(N(c)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of p)l?Ln(f,u):Ln(u,f)}),S(...[...a].map(([,l])=>Mn(l,t,{target$:r}))).pipe(A(()=>s.complete()),be())})}function _n(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return _n(t)}}function An(e,t){return $(()=>{let r=_n(e);return typeof r!="undefined"?xr(r,e,t):M})}var kn=Vt(eo());var Ca=0,Cn=S(d(window,"keydown").pipe(m(()=>!0)),S(d(window,"keyup"),d(window,"contextmenu")).pipe(m(()=>!1))).pipe(z(!1),ee(1));function Hn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Hn(t)}}function ka(e){return Ce(e).pipe(m(({width:t})=>({scrollable:Tt(e).width>t})),ne("scrollable"))}function $n(e,t){let{matches:r}=matchMedia("(hover)"),o=$(()=>{let n=new w,i=n.pipe(Vr(1));n.subscribe(({scrollable:u})=>{u&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=Ca++,s=[],c=e.closest("pre");c.id=`__code_${a}`;let p=[],l=e.closest(".highlight");if(l instanceof HTMLElement){let u=Hn(l);if(typeof u!="undefined"&&(l.classList.contains("annotate")||J("content.code.annotate"))){let h=xr(u,e,t);p.push(Ce(l).pipe(N(i),m(({width:v,height:b})=>v&&b),te(),E(v=>v?h:M)))}}let f=R(":scope > span[id]",e);if(f.length&&(e.classList.add("md-code__content"),e.closest(".select")||J("content.code.select")&&!e.closest(".no-select"))){let u=+f[0].id.split("-").pop(),h=yn();s.push(h),J("content.tooltips")&&p.push(Qe(h));let v=d(h,"click").pipe(Ht(H=>!H,!1),T(()=>h.blur()),be());v.subscribe(H=>{h.classList.toggle("md-code__button--active",H)});let b=fe(f).pipe(re(H=>mr(H).pipe(m(B=>[H,B]))));v.pipe(E(H=>H?b:M)).subscribe(([H,B])=>{let ce=le(".hll.select",H);if(ce&&!B)ce.replaceWith(...Array.from(ce.childNodes));else if(!ce&&B){let ue=document.createElement("span");ue.className="hll select",ue.append(...Array.from(H.childNodes).slice(1)),H.append(ue)}});let U=fe(f).pipe(re(H=>d(H,"mousedown").pipe(T(B=>B.preventDefault()),m(()=>H)))),Y=v.pipe(E(H=>H?U:M),ie(Cn),m(([H,B])=>{var ue;let ce=f.indexOf(H)+u;if(B===!1)return[ce,ce];{let we=R(".hll",e).map(Ye=>f.indexOf(Ye.parentElement)+u);return(ue=window.getSelection())==null||ue.removeAllRanges(),[Math.min(ce,...we),Math.max(ce,...we)]}})),X=Br(M).pipe(y(H=>H.startsWith(`__codelineno-${a}-`)));X.subscribe(H=>{let[,,B]=H.split("-"),ce=B.split(":").map(we=>+we-u+1);ce.length===1&&ce.push(ce[0]);for(let we of R(".hll:not(.select)",e))we.replaceWith(...Array.from(we.childNodes));let ue=f.slice(ce[0]-1,ce[1]);for(let we of ue){let Ye=document.createElement("span");Ye.className="hll",Ye.append(...Array.from(we.childNodes).slice(1)),we.append(Ye)}}),X.pipe(he(1),Oe(ae)).subscribe(H=>{if(H.includes(":")){let B=document.getElementById(H.split(":")[0]);B&&setTimeout(()=>{let ce=B,ue=-(48+16);for(;ce!==document.body;)ue+=ce.offsetTop,ce=ce.offsetParent;window.scrollTo({top:ue})},1)}});let et=fe(R('a[href^="#__codelineno"]',l)).pipe(re(H=>d(H,"click").pipe(T(B=>B.preventDefault()),m(()=>H)))).pipe(N(i),ie(Cn),m(([H,B])=>{let ue=+I(`[id="${H.hash.slice(1)}"]`).parentElement.id.split("-").pop();if(B===!1)return[ue,ue];{let we=R(".hll",e).map(Ye=>+Ye.parentElement.id.split("-").pop());return[Math.min(ue,...we),Math.max(ue,...we)]}}));S(Y,et).subscribe(H=>{let B=`#__codelineno-${a}-`;H[0]===H[1]?B+=H[0]:B+=`${H[0]}:${H[1]}`,history.replaceState({},"",B),window.dispatchEvent(new HashChangeEvent("hashchange",{newURL:window.location.origin+window.location.pathname+B,oldURL:window.location.href}))})}if(kn.default.isSupported()&&(e.closest(".copy")||J("content.code.copy")&&!e.closest(".no-copy"))){let u=xn(c.id);s.push(u),J("content.tooltips")&&p.push(Qe(u))}if(s.length){let u=En();u.append(...s),c.insertBefore(u,e)}return ka(e).pipe(T(u=>n.next(u)),A(()=>n.complete()),m(u=>j({ref:e},u)),Ne(...p))});return J("content.lazy")?St(e).pipe(y(n=>n),he(1),E(()=>o)):o}function Ha(e,{target$:t,print$:r}){let o=!0;return S(t.pipe(m(n=>n.closest("details:not([open])")),y(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(y(n=>n||!o),T(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Rn(e,t){return $(()=>{let r=new w;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Ha(e,t).pipe(T(o=>r.next(o)),A(()=>r.complete()),m(o=>j({ref:e},o)))})}var Pn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var to,Ra=0;function Pa(){return typeof mermaid=="undefined"||mermaid instanceof Element?wt("https://unpkg.com/mermaid@9.4.3/dist/mermaid.min.js"):W(void 0)}function In(e){return e.classList.remove("mermaid"),to||(to=Pa().pipe(T(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Pn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),ee(1))),to.subscribe(()=>{e.classList.add("mermaid");let t=`__mermaid_${Ra++}`,r=O("div",{class:"mermaid"}),o=e.textContent;mermaid.mermaidAPI.render(t,o,(n,i)=>{let a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})}),to.pipe(m(()=>({ref:e})))}var Fn=O("table");function jn(e){return e.replaceWith(Fn),Fn.replaceWith(Sn(e)),W({ref:e})}function Ia(e){let t=e.find(r=>r.checked)||e[0];return S(...e.map(r=>d(r,"change").pipe(m(()=>I(`label[for="${r.id}"]`))))).pipe(z(I(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Wn(e,{viewport$:t,target$:r}){let o=I(".tabbed-labels",e),n=R(":scope > input",e),i=Xr("prev");e.append(i);let a=Xr("next");return e.append(a),$(()=>{let s=new w,c=s.pipe(oe(),se(!0));Z([s,Ce(e)]).pipe(N(c),He(1,Se)).subscribe({next([{active:p},l]){let f=ze(p),{width:u}=ve(p);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let h=fr(o);(f.xh.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),Z([it(o),Ce(o)]).pipe(N(c)).subscribe(([p,l])=>{let f=Tt(o);i.hidden=p.x<16,a.hidden=p.x>f.width-l.width-16}),S(d(i,"click").pipe(m(()=>-1)),d(a,"click").pipe(m(()=>1))).pipe(N(c)).subscribe(p=>{let{width:l}=ve(o);o.scrollBy({left:l*p,behavior:"smooth"})}),r.pipe(N(c),y(p=>n.includes(p))).subscribe(p=>p.click()),o.classList.add("tabbed-labels--linked");for(let p of n){let l=I(`label[for="${p.id}"]`);l.replaceChildren(O("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),d(l.firstElementChild,"click").pipe(N(c),y(f=>!(f.metaKey||f.ctrlKey)),T(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return J("content.tabs.link")&&s.pipe(Le(1),ie(t)).subscribe(([{active:p},{offset:l}])=>{let f=p.innerText.trim();if(p.hasAttribute("data-md-switching"))p.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let v of R("[data-tabs]"))for(let b of R(":scope > input",v)){let U=I(`label[for="${b.id}"]`);if(U!==p&&U.innerText.trim()===f){U.setAttribute("data-md-switching",""),b.click();break}}window.scrollTo({top:e.offsetTop-u});let h=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...h])])}}),s.pipe(N(c)).subscribe(()=>{for(let p of R("audio, video",e))p.pause()}),Ia(n).pipe(T(p=>s.next(p)),A(()=>s.complete()),m(p=>j({ref:e},p)))}).pipe(Ge(ae))}function Nn(e,{viewport$:t,target$:r,print$:o}){return S(...R(".annotate:not(.highlight)",e).map(n=>An(n,{target$:r,print$:o})),...R("pre:not(.mermaid) > code",e).map(n=>$n(n,{target$:r,print$:o})),...R("pre.mermaid",e).map(n=>In(n)),...R("table:not([class])",e).map(n=>jn(n)),...R("details",e).map(n=>Rn(n,{target$:r,print$:o})),...R("[data-tabs]",e).map(n=>Wn(n,{viewport$:t,target$:r})),...R("[title]",e).filter(()=>J("content.tooltips")).map(n=>Qe(n)))}function Fa(e,{alert$:t}){return t.pipe(E(r=>S(W(!0),W(!1).pipe(Xe(2e3))).pipe(m(o=>({message:r,active:o})))))}function Un(e,t){let r=I(".md-typeset",e);return $(()=>{let o=new w;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Fa(e,t).pipe(T(n=>o.next(n)),A(()=>o.complete()),m(n=>j({ref:e},n)))})}function ja({viewport$:e}){if(!J("header.autohide"))return W(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Pe(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),te()),o=qe("search");return Z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),te(),E(n=>n?r:W(!1)),z(!1))}function Dn(e,t){return $(()=>Z([Ce(e),ja(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),te((r,o)=>r.height===o.height&&r.hidden===o.hidden),ee(1))}function Vn(e,{header$:t,main$:r}){return $(()=>{let o=new w,n=o.pipe(oe(),se(!0));o.pipe(ne("active"),nt(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=fe(R("[title]",e)).pipe(y(()=>J("content.tooltips")),re(a=>Qe(a)));return r.subscribe(o),t.pipe(N(n),m(a=>j({ref:e},a)),Ne(i.pipe(N(n))))})}function Wa(e,{viewport$:t,header$:r}){return gr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ve(e);return{active:o>=n}}),ne("active"))}function zn(e,t){return $(()=>{let r=new w;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=le(".md-content h1");return typeof o=="undefined"?M:Wa(o,t).pipe(T(n=>r.next(n)),A(()=>r.complete()),m(n=>j({ref:e},n)))})}function qn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),te()),n=o.pipe(E(()=>Ce(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),ne("bottom"))));return Z([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:c},size:{height:p}}])=>(p=Math.max(0,p-Math.max(0,a-c,i)-Math.max(0,p+c-s)),{offset:a-i,height:p,active:a-i<=c})),te((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function Na(e){let t=__md_get("__palette")||{index:e.findIndex(r=>matchMedia(r.getAttribute("data-md-color-media")).matches)};return W(...e).pipe(re(r=>d(r,"change").pipe(m(()=>r))),z(e[Math.max(0,t.index)]),m(r=>({index:e.indexOf(r),color:{media:r.getAttribute("data-md-color-media"),scheme:r.getAttribute("data-md-color-scheme"),primary:r.getAttribute("data-md-color-primary"),accent:r.getAttribute("data-md-color-accent")}})),ee(1))}function Kn(e){let t=R("input",e),r=O("meta",{name:"theme-color"});document.head.appendChild(r);let o=O("meta",{name:"color-scheme"});document.head.appendChild(o);let n=Rt("(prefers-color-scheme: light)");return $(()=>{let i=new w;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),c=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=c.getAttribute("data-md-color-scheme"),a.color.primary=c.getAttribute("data-md-color-primary"),a.color.accent=c.getAttribute("data-md-color-accent")}for(let[s,c]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,c);for(let s=0;s{let a=ke("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(c=>(+c).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(Oe(ae)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),Na(t).pipe(N(n.pipe(Le(1))),mt(),T(a=>i.next(a)),A(()=>i.complete()),m(a=>j({ref:e},a)))})}function Qn(e,{progress$:t}){return $(()=>{let r=new w;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(T(o=>r.next({value:o})),A(()=>r.complete()),m(o=>({ref:e,value:o})))})}var ro=Vt(eo());function Ua(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r}function Yn({alert$:e}){ro.default.isSupported()&&new D(t=>{new ro.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Ua(I(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(T(t=>{t.trigger.focus()}),m(()=>_e("clipboard.copied"))).subscribe(e)}function Da(e){if(e.length<2)return[""];let[t,r]=[...e].sort((n,i)=>n.length-i.length).map(n=>n.replace(/[^/]+$/,"")),o=0;if(t===r)o=t.length;else for(;t.charCodeAt(o)===r.charCodeAt(o);)o++;return e.map(n=>n.replace(t.slice(0,o),""))}function yr(e){let t=__md_get("__sitemap",sessionStorage,e);if(t)return W(t);{let r=xe();return pn(new URL("sitemap.xml",e||r.base)).pipe(m(o=>Da(R("loc",o).map(n=>n.textContent))),Me(()=>M),je([]),T(o=>__md_set("__sitemap",o,sessionStorage,e)))}}function Bn(e,t){if(!(e.target instanceof Element))return M;let r=e.target.closest("a");if(r===null)return M;if(r.target||e.metaKey||e.ctrlKey)return M;let o=new URL(r.href);return o.search=o.hash="",t.includes(`${o}`)?(e.preventDefault(),W(new URL(r.href))):M}function Gn(e){let t=le("[rel=canonical]",e);typeof t!="undefined"&&(t.href=t.href.replace("//localhost:","//127.0.0.1:"));let r=new Map;for(let o of R(":scope > *",e)){let n=o.outerHTML;for(let i of["href","src"]){let a=o.getAttribute(i);if(a===null)continue;let s=new URL(a,t==null?void 0:t.href),c=o.cloneNode();c.setAttribute(i,`${s}`),n=c.outerHTML;break}r.set(n,o)}return r}function Jn({location$:e,viewport$:t,progress$:r}){let o=xe();if(location.protocol==="file:")return M;let n=yr().pipe(m(l=>l.map(f=>`${new URL(f,o.base)}`))),i=d(document.body,"click").pipe(ie(n),E(([l,f])=>Bn(l,f)),be());J("navigation.instant.prefetch")&&S(d(document.body,"mousemove"),d(document.body,"focusin")).pipe(ie(n),E(([l,f])=>Bn(l,f)),Ee(25),Dr(({href:l})=>l),lr(l=>{let f=document.createElement("link");return f.rel="prefetch",f.href=l.toString(),document.head.appendChild(f),d(f,"load").pipe(m(()=>f),he(1))})).subscribe(l=>l.remove()),i.pipe(he(1)).subscribe(()=>{let l=le("link[rel=icon]");typeof l!="undefined"&&(l.href=l.href)}),d(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),i.pipe(ie(t)).subscribe(([l,{offset:f}])=>{history.scrollRestoration="manual",history.replaceState(f,""),history.pushState(null,"",l)}),i.subscribe(e);let a=e.pipe(z(ge()),ne("pathname"),Le(1),E(l=>vr(l,{progress$:r}).pipe(Me(()=>(ft(l,!0),M))))),s=new DOMParser,c=a.pipe(E(l=>l.text()),E(l=>{let f=s.parseFromString(l,"text/html");for(let b of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...J("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let U=le(b),Y=le(b,f);typeof U!="undefined"&&typeof Y!="undefined"&&U.replaceWith(Y)}let u=Gn(document.head),h=Gn(f.head);for(let[b,U]of h)U.getAttribute("rel")==="stylesheet"||U.hasAttribute("src")||(u.has(b)?u.delete(b):document.head.appendChild(U));for(let b of u.values())b.getAttribute("rel")==="stylesheet"||b.hasAttribute("src")||b.remove();let v=ke("container");return Ve(R("script",v)).pipe(E(b=>{let U=f.createElement("script");if(b.src){for(let Y of b.getAttributeNames())U.setAttribute(Y,b.getAttribute(Y));return b.replaceWith(U),new D(Y=>{U.onload=()=>Y.complete()})}else return U.textContent=b.textContent,b.replaceWith(U),M}),oe(),se(f))}),be());return d(window,"popstate").pipe(m(ge)).subscribe(e),e.pipe(z(ge()),Pe(2,1),y(([l,f])=>l.pathname===f.pathname&&l.hash!==f.hash),m(([,l])=>l)).subscribe(l=>{var f,u;history.state!==null||!l.hash?window.scrollTo(0,(u=(f=history.state)==null?void 0:f.y)!=null?u:0):(history.scrollRestoration="auto",br(l.hash),history.scrollRestoration="manual")}),e.pipe(zr(i),z(ge()),Pe(2,1),y(([l,f])=>l.pathname===f.pathname&&l.hash===f.hash),m(([,l])=>l)).subscribe(l=>{history.scrollRestoration="auto",br(l.hash),history.scrollRestoration="manual",history.back()}),c.pipe(ie(e)).subscribe(([,l])=>{var f,u;history.state!==null||!l.hash?window.scrollTo(0,(u=(f=history.state)==null?void 0:f.y)!=null?u:0):br(l.hash)}),t.pipe(ne("offset"),Ee(100)).subscribe(({offset:l})=>{history.replaceState(l,"")}),c}var ei=Vt(Zn());function ti(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,ei.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function Ft(e){return e.type===1}function Er(e){return e.type===3}function ri(e,t){let r=hn(e);return S(W(location.protocol!=="file:"),qe("search")).pipe(We(o=>o),E(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:J("search.suggest")}}})),r}function oi({document$:e}){let t=xe(),r=Ke(new URL("../versions.json",t.base)).pipe(Me(()=>M)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),E(n=>d(document.body,"click").pipe(y(i=>!i.metaKey&&!i.ctrlKey),ie(o),E(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let c=s.href;return!i.target.closest(".md-version")&&n.get(c)===a?M:(i.preventDefault(),W(c))}}return M}),E(i=>{let{version:a}=n.get(i);return yr(new URL(i)).pipe(m(s=>{let p=ge().href.replace(t.base,"");return s.includes(p.split("#")[0])?new URL(`../${a}/${p}`,t.base):new URL(i)}))})))).subscribe(n=>ft(n,!0)),Z([r,o]).subscribe(([n,i])=>{I(".md-header__topic").appendChild(On(n,i))}),e.pipe(E(()=>o)).subscribe(n=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let s=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(s)||(s=[s]);e:for(let c of s)for(let p of n.aliases)if(new RegExp(c,"i").test(p)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let s of pe("outdated"))s.hidden=!1})}function Qa(e,{worker$:t}){let{searchParams:r}=ge();r.has("q")&&(Ze("search",!0),e.value=r.get("q"),e.focus(),qe("search").pipe(We(i=>!i)).subscribe(()=>{let i=ge();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=Et(e),n=S(t.pipe(We(Ft)),d(e,"keyup"),o).pipe(m(()=>e.value),te());return Z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),ee(1))}function ni(e,{worker$:t}){let r=new w,o=r.pipe(oe(),se(!0));Z([t.pipe(We(Ft)),r],(i,a)=>a).pipe(ne("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(ne("focus")).subscribe(({focus:i})=>{i&&Ze("search",i)}),d(e.form,"reset").pipe(N(o)).subscribe(()=>e.focus());let n=I("header [for=__search]");return d(n,"click").subscribe(()=>e.focus()),Qa(e,{worker$:t}).pipe(T(i=>r.next(i)),A(()=>r.complete()),m(i=>j({ref:e},i)),ee(1))}function ii(e,{worker$:t,query$:r}){let o=new w,n=tn(e.parentElement).pipe(y(Boolean)),i=e.parentElement,a=I(":scope > :first-child",e),s=I(":scope > :last-child",e);qe("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(ie(r),Kr(t.pipe(We(Ft)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?_e("search.result.none"):_e("search.result.placeholder");break;case 1:a.textContent=_e("search.result.one");break;default:let u=ur(l.length);a.textContent=_e("search.result.other",u)}});let c=o.pipe(T(()=>s.innerHTML=""),E(({items:l})=>S(W(...l.slice(0,10)),W(...l.slice(10)).pipe(Pe(4),Yr(n),E(([f])=>f)))),m(wn),be());return c.subscribe(l=>s.appendChild(l)),c.pipe(re(l=>{let f=le("details",l);return typeof f=="undefined"?M:d(f,"toggle").pipe(N(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(y(Er),m(({data:l})=>l)).pipe(T(l=>o.next(l)),A(()=>o.complete()),m(l=>j({ref:e},l)))}function Ya(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=ge();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function ai(e,t){let r=new w,o=r.pipe(oe(),se(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),d(e,"click").pipe(N(o)).subscribe(n=>n.preventDefault()),Ya(e,t).pipe(T(n=>r.next(n)),A(()=>r.complete()),m(n=>j({ref:e},n)))}function si(e,{worker$:t,keyboard$:r}){let o=new w,n=ke("search-query"),i=S(d(n,"keydown"),d(n,"focus")).pipe(Oe(ae),m(()=>n.value),te());return o.pipe(nt(i),m(([{suggest:s},c])=>{let p=c.split(/([\s-]+)/);if(s!=null&&s.length&&p[p.length-1]){let l=s[s.length-1];l.startsWith(p[p.length-1])&&(p[p.length-1]=l)}else p.length=0;return p})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(y(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(y(Er),m(({data:s})=>s)).pipe(T(s=>o.next(s)),A(()=>o.complete()),m(()=>({ref:e})))}function ci(e,{index$:t,keyboard$:r}){let o=xe();try{let n=ri(o.search,t),i=ke("search-query",e),a=ke("search-result",e);d(e,"click").pipe(y(({target:c})=>c instanceof Element&&!!c.closest("a"))).subscribe(()=>Ze("search",!1)),r.pipe(y(({mode:c})=>c==="search")).subscribe(c=>{let p=Ue();switch(c.type){case"Enter":if(p===i){let l=new Map;for(let f of R(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,h])=>h-u);f.click()}c.claim()}break;case"Escape":case"Tab":Ze("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof p=="undefined")i.focus();else{let l=[i,...R(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(p))+l.length+(c.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}c.claim();break;default:i!==Ue()&&i.focus()}}),r.pipe(y(({mode:c})=>c==="global")).subscribe(c=>{switch(c.type){case"f":case"s":case"/":i.focus(),i.select(),c.claim();break}});let s=ni(i,{worker$:n});return S(s,ii(a,{worker$:n,query$:s})).pipe(Ne(...pe("search-share",e).map(c=>ai(c,{query$:s})),...pe("search-suggest",e).map(c=>si(c,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Je}}function pi(e,{index$:t,location$:r}){return Z([t,r.pipe(z(ge()),y(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>ti(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let c=s.textContent,p=o(c);p.length>c.length&&n.set(s,p)}for(let[s,c]of n){let{childNodes:p}=O("span",null,c);s.replaceWith(...Array.from(p))}return{ref:e,nodes:n}}))}function Ba(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return Z([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),te((i,a)=>i.height===a.height&&i.locked===a.locked))}function oo(e,o){var n=o,{header$:t}=n,r=lo(n,["header$"]);let i=I(".md-sidebar__scrollwrap",e),{y:a}=ze(i);return $(()=>{let s=new w,c=s.pipe(oe(),se(!0)),p=s.pipe(He(0,Se));return p.pipe(ie(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),p.pipe(We()).subscribe(()=>{for(let l of R(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ve(f);f.scrollTo({top:u-h/2})}}}),fe(R("label[tabindex]",e)).pipe(re(l=>d(l,"click").pipe(Oe(ae),m(()=>l),N(c)))).subscribe(l=>{let f=I(`[id="${l.htmlFor}"]`);I(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),Ba(e,r).pipe(T(l=>s.next(l)),A(()=>s.complete()),m(l=>j({ref:e},l)))})}function li(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return kt(Ke(`${r}/releases/latest`).pipe(Me(()=>M),m(o=>({version:o.tag_name})),je({})),Ke(r).pipe(Me(()=>M),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),je({}))).pipe(m(([o,n])=>j(j({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Ke(r).pipe(m(o=>({repositories:o.public_repos})),je({}))}}function mi(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ke(r).pipe(Me(()=>M),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),je({}))}function fi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return li(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return mi(r,o)}return M}var Ga;function Ja(e){return Ga||(Ga=$(()=>{let t=__md_get("__source",sessionStorage);if(t)return W(t);if(pe("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return M}return fi(e.href).pipe(T(o=>__md_set("__source",o,sessionStorage)))}).pipe(Me(()=>M),y(t=>Object.keys(t).length>0),m(t=>({facts:t})),ee(1)))}function ui(e){let t=I(":scope > :last-child",e);return $(()=>{let r=new w;return r.subscribe(({facts:o})=>{t.appendChild(Tn(o)),t.classList.add("md-source__repository--active")}),Ja(e).pipe(T(o=>r.next(o)),A(()=>r.complete()),m(o=>j({ref:e},o)))})}function Xa(e,{viewport$:t,header$:r}){return Ce(document.body).pipe(E(()=>gr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),ne("hidden"))}function di(e,t){return $(()=>{let r=new w;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(J("navigation.tabs.sticky")?W({hidden:!1}):Xa(e,t)).pipe(T(o=>r.next(o)),A(()=>r.complete()),m(o=>j({ref:e},o)))})}function Za(e,{viewport$:t,header$:r}){let o=new Map,n=R("[href^=\\#]",e);for(let s of n){let c=decodeURIComponent(s.hash.substring(1)),p=le(`[id="${c}"]`);typeof p!="undefined"&&o.set(s,p)}let i=r.pipe(ne("height"),m(({height:s})=>{let c=ke("main"),p=I(":scope > :first-child",c);return s+.8*(p.offsetTop-c.offsetTop)}),be());return Ce(document.body).pipe(ne("height"),E(s=>$(()=>{let c=[];return W([...o].reduce((p,[l,f])=>{for(;c.length&&o.get(c[c.length-1]).tagName>=f.tagName;)c.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let h=f.offsetParent;for(;h;h=h.offsetParent)u+=h.offsetTop;return p.set([...c=[...c,l]].reverse(),u)},new Map))}).pipe(m(c=>new Map([...c].sort(([,p],[,l])=>p-l))),nt(i),E(([c,p])=>t.pipe(Ht(([l,f],{offset:{y:u},size:h})=>{let v=u+h.height>=Math.floor(s.height);for(;f.length;){let[,b]=f[0];if(b-p=u&&!v)f=[l.pop(),...f];else break}return[l,f]},[[],[...c]]),te((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,c])=>({prev:s.map(([p])=>p),next:c.map(([p])=>p)})),z({prev:[],next:[]}),Pe(2,1),m(([s,c])=>s.prev.length{let i=new w,a=i.pipe(oe(),se(!0));if(i.subscribe(({prev:s,next:c})=>{for(let[p]of c)p.classList.remove("md-nav__link--passed"),p.classList.remove("md-nav__link--active");for(let[p,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",p===s.length-1)}),J("toc.follow")){let s=S(t.pipe(Ee(1),m(()=>{})),t.pipe(Ee(250),m(()=>"smooth")));i.pipe(y(({prev:c})=>c.length>0),nt(o.pipe(Oe(ae))),ie(s)).subscribe(([[{prev:c}],p])=>{let[l]=c[c.length-1];if(l.offsetHeight){let f=dr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ve(f);f.scrollTo({top:u-h/2,behavior:p})}}})}return J("navigation.tracking")&&t.pipe(N(a),ne("offset"),Ee(250),Le(1),N(n.pipe(Le(1))),mt({delay:250}),ie(i)).subscribe(([,{prev:s}])=>{let c=ge(),p=s[s.length-1];if(p&&p.length){let[l]=p,{hash:f}=new URL(l.href);c.hash!==f&&(c.hash=f,history.replaceState({},"",`${c}`))}else c.hash="",history.replaceState({},"",`${c}`)}),Za(e,{viewport$:t,header$:r}).pipe(T(s=>i.next(s)),A(()=>i.complete()),m(s=>j({ref:e},s)))})}function es(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Pe(2,1),m(([a,s])=>a>s&&s>0),te()),i=r.pipe(m(({active:a})=>a));return Z([i,n]).pipe(m(([a,s])=>!(a&&s)),te(),N(o.pipe(Le(1))),se(!0),mt({delay:250}),m(a=>({hidden:a})))}function bi(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new w,a=i.pipe(oe(),se(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(N(a),ne("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),d(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),es(e,{viewport$:t,main$:o,target$:n}).pipe(T(s=>i.next(s)),A(()=>i.complete()),m(s=>j({ref:e},s)))}function vi({document$:e}){e.pipe(E(()=>R(".md-ellipsis")),re(t=>St(t).pipe(N(e.pipe(Le(1))),y(r=>r),m(()=>t),he(1))),y(t=>t.offsetWidth{let r=t.innerText,o=t.closest("a")||t;return o.title=r,Qe(o).pipe(N(e.pipe(Le(1))),A(()=>o.removeAttribute("title")))})).subscribe(),e.pipe(E(()=>R(".md-status")),re(t=>Qe(t))).subscribe()}function gi({document$:e,tablet$:t}){e.pipe(E(()=>R(".md-toggle--indeterminate")),T(r=>{r.indeterminate=!0,r.checked=!1}),re(r=>d(r,"change").pipe(Qr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ie(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function ts(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function xi({document$:e}){e.pipe(E(()=>R("[data-md-scrollfix]")),T(t=>t.removeAttribute("data-md-scrollfix")),y(ts),re(t=>d(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function yi({viewport$:e,tablet$:t}){Z([qe("search"),t]).pipe(m(([r,o])=>r&&!o),E(r=>W(r).pipe(Xe(r?400:100))),ie(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function rs(){return location.protocol==="file:"?wt(`${new URL("search/search_index.js",no.base)}`).pipe(m(()=>__index),ee(1)):Ke(new URL("search/search_index.json",no.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var st=Go(),Wt=nn(),Mt=sn(Wt),io=on(),$e=dn(),wr=Rt("(min-width: 960px)"),wi=Rt("(min-width: 1220px)"),Ti=cn(),no=xe(),Si=document.forms.namedItem("search")?rs():Je,ao=new w;Yn({alert$:ao});var so=new w;J("navigation.instant")&&Jn({location$:Wt,viewport$:$e,progress$:so}).subscribe(st);var Ei;((Ei=no.version)==null?void 0:Ei.provider)==="mike"&&oi({document$:st});S(Wt,Mt).pipe(Xe(125)).subscribe(()=>{Ze("drawer",!1),Ze("search",!1)});io.pipe(y(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=le("link[rel=prev]");typeof t!="undefined"&&ft(t);break;case"n":case".":let r=le("link[rel=next]");typeof r!="undefined"&&ft(r);break;case"Enter":let o=Ue();o instanceof HTMLLabelElement&&o.click()}});vi({document$:st});gi({document$:st,tablet$:wr});xi({document$:st});yi({viewport$:$e,tablet$:wr});var at=Dn(ke("header"),{viewport$:$e}),jt=st.pipe(m(()=>ke("main")),E(e=>qn(e,{viewport$:$e,header$:at})),ee(1)),os=S(...pe("consent").map(e=>vn(e,{target$:Mt})),...pe("dialog").map(e=>Un(e,{alert$:ao})),...pe("header").map(e=>Vn(e,{viewport$:$e,header$:at,main$:jt})),...pe("palette").map(e=>Kn(e)),...pe("progress").map(e=>Qn(e,{progress$:so})),...pe("search").map(e=>ci(e,{index$:Si,keyboard$:io})),...pe("source").map(e=>ui(e))),ns=$(()=>S(...pe("announce").map(e=>bn(e)),...pe("content").map(e=>Nn(e,{viewport$:$e,target$:Mt,print$:Ti})),...pe("content").map(e=>J("search.highlight")?pi(e,{index$:Si,location$:Wt}):M),...pe("header-title").map(e=>zn(e,{viewport$:$e,header$:at})),...pe("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Gr(wi,()=>oo(e,{viewport$:$e,header$:at,main$:jt})):Gr(wr,()=>oo(e,{viewport$:$e,header$:at,main$:jt}))),...pe("tabs").map(e=>di(e,{viewport$:$e,header$:at})),...pe("toc").map(e=>hi(e,{viewport$:$e,header$:at,main$:jt,target$:Mt})),...pe("top").map(e=>bi(e,{viewport$:$e,header$:at,main$:jt,target$:Mt})))),Oi=st.pipe(E(()=>ns),Ne(os),ee(1));Oi.subscribe();window.document$=st;window.location$=Wt;window.target$=Mt;window.keyboard$=io;window.viewport$=$e;window.tablet$=wr;window.screen$=wi;window.print$=Ti;window.alert$=ao;window.progress$=so;window.component$=Oi;})(); diff --git a/assets/stylesheets/main.382dd0b9.min.css b/assets/stylesheets/main.382dd0b9.min.css deleted file mode 100644 index 5812f02e..00000000 --- a/assets/stylesheets/main.382dd0b9.min.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:initial;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{background:#0000;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}input{border:0;outline:none}:root{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-scheme=default]{color-scheme:light}[data-md-color-scheme=default] img[src$="#gh-dark-mode-only"],[data-md-color-scheme=default] img[src$="#only-dark"]{display:none}:root,[data-md-color-scheme=default]{--md-hue:225deg;--md-default-fg-color:#000000de;--md-default-fg-color--light:#0000008a;--md-default-fg-color--lighter:#00000052;--md-default-fg-color--lightest:#00000012;--md-default-bg-color:#fff;--md-default-bg-color--light:#ffffffb3;--md-default-bg-color--lighter:#ffffff4d;--md-default-bg-color--lightest:#ffffff1f;--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-bg-color--light:#f5f5f5b3;--md-code-bg-color--lighter:#f5f5f54d;--md-code-hl-color:#4287ff;--md-code-hl-color--light:#4287ff1a;--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-del-color:#f5503d26;--md-typeset-ins-color:#0bd57026;--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-mark-color:#ffff0080;--md-typeset-table-color:#0000001f;--md-typeset-table-color--light:rgba(0,0,0,.035);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-warning-fg-color:#000000de;--md-warning-bg-color:#ff9;--md-footer-fg-color:#fff;--md-footer-fg-color--light:#ffffffb3;--md-footer-fg-color--lighter:#ffffff73;--md-footer-bg-color:#000000de;--md-footer-bg-color--dark:#00000052;--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #0000001a,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0003,0 0 0.05rem #00000059}.md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}aside,body,input{font-feature-settings:"kern","liga";color:var(--md-typeset-color);font-family:var(--md-text-font-family)}code,kbd,pre{font-feature-settings:"kern";font-family:var(--md-code-font-family)}:root{--md-typeset-table-sort-icon:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset a code{color:var(--md-typeset-a-color)}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none;transition:background-color 125ms}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;transition:color 125ms,background-color 125ms;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help;text-decoration:none}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}[dir=ltr] .md-typeset ol li ol,[dir=ltr] .md-typeset ol li ul,[dir=ltr] .md-typeset ul li ol,[dir=ltr] .md-typeset ul li ul{margin-left:.625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.md-typeset figure img{display:block}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td>:first-child,.md-typeset table:not([class]) th>:first-child{margin-top:0}.md-typeset table:not([class]) td>:last-child,.md-typeset table:not([class]) th>:last-child{margin-bottom:0}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.md-typeset table:not([class]) tbody tr:hover{background-color:var(--md-typeset-table-color--light);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.984375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-typeset .md-author{border-radius:100%;display:block;flex-shrink:0;height:1.6rem;overflow:hidden;position:relative;transition:color 125ms,transform 125ms;width:1.6rem}.md-typeset .md-author img{display:block}.md-typeset .md-author--more{background:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--lighter);font-size:.6rem;font-weight:700;line-height:1.6rem;text-align:center}.md-typeset .md-author--long{height:2.4rem;width:2.4rem}.md-typeset a.md-author{transform:scale(1)}.md-typeset a.md-author img{filter:grayscale(100%) opacity(75%);transition:filter 125ms}.md-typeset a.md-author:focus,.md-typeset a.md-author:hover{transform:scale(1.1);z-index:1}.md-typeset a.md-author:focus img,.md-typeset a.md-author:hover img{filter:grayscale(0)}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background-color:var(--md-warning-bg-color);color:var(--md-warning-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}[dir=ltr] .md-banner__button{float:right}[dir=rtl] .md-banner__button{float:left}.md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.no-js .md-banner__button{display:none}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.984375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:focus,.md-clipboard:hover{color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:focus code,.md-clipboard--inline:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}:root{--md-code-select-icon:url('data:image/svg+xml;charset=utf-8,');--md-code-copy-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-code__content{display:grid}.md-code__nav{background-color:var(--md-code-bg-color--lighter);border-radius:.1rem;display:flex;gap:.2rem;padding:.2rem;position:absolute;right:.25em;top:.25em;transition:background-color .25s;z-index:1}:hover>.md-code__nav{background-color:var(--md-code-bg-color--light)}.md-code__button{color:var(--md-default-fg-color--lightest);cursor:pointer;display:block;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;transition:color .25s;width:1.5em}:hover>*>.md-code__button{color:var(--md-default-fg-color--light)}.md-code__button.focus-visible,.md-code__button:hover{color:var(--md-accent-fg-color)}.md-code__button--active{color:var(--md-default-fg-color)!important}.md-code__button:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-code__button[data-md-type=select]:after{-webkit-mask-image:var(--md-code-select-icon);mask-image:var(--md-code-select-icon)}.md-code__button[data-md-type=copy]:after{-webkit-mask-image:var(--md-code-copy-icon);mask-image:var(--md-code-copy-icon)}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:#0000008a;height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.984375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{float:right}[dir=rtl] .md-content__button{float:left}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{display:flex;flex-wrap:wrap;place-content:baseline center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{align-items:end;display:flex;flex-grow:0.01;margin-bottom:.4rem;margin-top:1rem;max-width:100%;outline-color:var(--md-accent-fg-color);overflow:hidden;transition:opacity .25s}.md-footer__link:focus,.md-footer__link:hover{opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.984375em){.md-footer__link--prev{flex-shrink:0}.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;margin-bottom:.7rem;max-width:calc(100% - 2.4rem);padding:0 1rem;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;opacity:.7}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{display:inline-flex;gap:.2rem;margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:focus,.md-typeset .md-button:hover{background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:focus,.md-typeset .md-input:hover{border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem #0000,0 .2rem .4rem #0000;color:var(--md-primary-bg-color);display:block;left:0;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.234375em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo img,.md-header__button.md-logo svg{fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-left:1rem;margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem;margin-right:1rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__option>input{bottom:0}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}.md-meta{color:var(--md-default-fg-color--light);font-size:.7rem;line-height:1.3}.md-meta__list{display:inline-flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}.md-meta__item:not(:last-child):after{content:"·";margin-left:.2rem;margin-right:.2rem}.md-meta__link{color:var(--md-typeset-a-color)}.md-meta__link:focus,.md-meta__link:hover{color:var(--md-accent-fg-color)}.md-draft{background-color:#ff1744;border-radius:.125em;color:#fff;display:inline-block;font-weight:700;padding-left:.5714285714em;padding-right:.5714285714em}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{color:var(--md-default-fg-color--light);display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo img,.md-nav__title .md-nav__button.md-logo svg{fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__link{align-items:flex-start;display:flex;gap:.4rem;margin-top:.625em;scroll-snap-align:start;transition:color 125ms}.md-nav__link--passed,.md-nav__link--passed code{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active,.md-nav__item .md-nav__link--active code{color:var(--md-typeset-a-color)}.md-nav__link .md-ellipsis{position:relative}.md-nav__link .md-ellipsis code{word-break:normal}[dir=ltr] .md-nav__link .md-icon:last-child{margin-left:auto}[dir=rtl] .md-nav__link .md-icon:last-child{margin-right:auto}.md-nav__link .md-typeset{font-size:.7rem;line-height:1.3}.md-nav__link svg{fill:currentcolor;flex-shrink:0;height:1.3em}.md-nav__link[for]:focus,.md-nav__link[for]:hover,.md-nav__link[href]:focus,.md-nav__link[href]:hover{color:var(--md-accent-fg-color);cursor:pointer}.md-nav__link[for]:focus code,.md-nav__link[for]:hover code,.md-nav__link[href]:focus code,.md-nav__link[href]:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__container>.md-nav__link{margin-top:0}.md-nav__container>.md-nav__link:first-child{flex-grow:1;min-width:0}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.234375em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest)}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:focus,.md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link svg{margin-top:.1em}.md-nav--primary .md-nav__link>.md-nav__link{padding:0}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:initial}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width:59.984375em){.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav{margin-bottom:-.4rem}.md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--secondary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--secondary .md-nav__list{padding-right:.6rem}.md-nav--secondary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--secondary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--secondary .md-nav__item>.md-nav__link{margin-left:.4rem}}@media screen and (min-width:76.25em){.md-nav{margin-bottom:-.4rem;transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--primary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--primary .md-nav__list{padding-right:.6rem}.md-nav--primary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--primary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--primary .md-nav__item>.md-nav__link{margin-left:.4rem}.md-nav__toggle~.md-nav{display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .25s,visibility 0ms .25s;visibility:collapse}.md-nav__toggle~.md-nav>.md-nav__list{overflow:hidden}.md-nav__toggle:checked~.md-nav,.md-nav__toggle:indeterminate~.md-nav{grid-template-rows:1fr;opacity:1;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .15s .1s,visibility 0ms;visibility:visible}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700}.md-nav__item--section>.md-nav__link[for]{color:var(--md-default-fg-color--light)}.md-nav__item--section>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav__item--section>.md-nav__link .md-icon,.md-nav__item--section>.md-nav__link>[for]{display:none}[dir=ltr] .md-nav__item--section>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav__item--section>.md-nav{margin-right:-.6rem}.md-nav__item--section>.md-nav{display:block;opacity:1;visibility:visible}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s;width:.9rem}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;border-radius:100%;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:transform .25s;vertical-align:-.1rem;width:100%}[dir=rtl] .md-nav__icon:after{transform:rotate(180deg)}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon:after,.md-nav__item--nested .md-nav__toggle:indeterminate~.md-nav__link .md-nav__icon:after{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);margin-top:0;position:sticky;top:0;z-index:1}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active.md-nav__item--section{margin:0}[dir=ltr] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav{margin-right:-.6rem}.md-nav--lifted>.md-nav__list>.md-nav__item>[for]{color:var(--md-default-fg-color--light)}.md-nav--lifted .md-nav[data-md-level="1"]{grid-template-rows:1fr;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested){padding:0 .6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested)>.md-nav__link{padding:0}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__list{overflow:visible;padding-bottom:0}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}.md-pagination{font-size:.8rem;font-weight:700;gap:.4rem}.md-pagination,.md-pagination>*{align-items:center;display:flex;justify-content:center}.md-pagination>*{border-radius:.2rem;height:1.8rem;min-width:1.8rem;text-align:center}.md-pagination__current{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light)}.md-pagination__link{transition:color 125ms,background-color 125ms}.md-pagination__link:focus,.md-pagination__link:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-pagination__link:focus svg,.md-pagination__link:hover svg{color:var(--md-accent-fg-color)}.md-pagination__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-pagination__link svg{fill:currentcolor;color:var(--md-default-fg-color--lighter);display:block;max-height:100%;width:1.2rem}:root{--md-path-icon:url('data:image/svg+xml;charset=utf-8,')}.md-path{display:block;font-size:.7rem;margin:0 .8rem;overflow:auto;padding-top:1.2rem}@media screen and (min-width:76.25em){.md-path{margin:0 1.2rem}}.md-path__list{align-items:center;display:flex;gap:.2rem;list-style:none;margin:0;padding:0}.md-path__item:not(:first-child){display:inline-flex;gap:.2rem;white-space:nowrap}.md-path__item:not(:first-child):before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline;height:.8rem;-webkit-mask-image:var(--md-path-icon);mask-image:var(--md-path-icon);width:.8rem}.md-path__link{align-items:center;color:var(--md-default-fg-color--light);display:flex}.md-path__link:focus,.md-path__link:hover{color:var(--md-accent-fg-color)}.md-post__back{border-bottom:.05rem solid var(--md-default-fg-color--lightest);margin-bottom:1.2rem;padding-bottom:1.2rem}@media screen and (max-width:76.234375em){.md-post__back{display:none}}[dir=rtl] .md-post__back svg{transform:scaleX(-1)}.md-post__authors{display:flex;flex-direction:column;gap:.6rem;margin:0 .6rem 1.2rem}.md-post .md-post__meta a{transition:color 125ms}.md-post .md-post__meta a:focus,.md-post .md-post__meta a:hover{color:var(--md-accent-fg-color)}.md-post__title{color:var(--md-default-fg-color--light);font-weight:700}.md-post--excerpt{margin-bottom:3.2rem}.md-post--excerpt .md-post__header{align-items:center;display:flex;gap:.6rem;min-height:1.6rem}.md-post--excerpt .md-post__authors{align-items:center;display:inline-flex;flex-direction:row;gap:.2rem;margin:0;min-height:2.4rem}[dir=ltr] .md-post--excerpt .md-post__meta .md-meta__list{margin-right:.4rem}[dir=rtl] .md-post--excerpt .md-post__meta .md-meta__list{margin-left:.4rem}.md-post--excerpt .md-post__content>:first-child{--md-scroll-margin:6rem;margin-top:0}.md-post>.md-nav--secondary{margin:1em 0}.md-profile{align-items:center;display:flex;font-size:.7rem;gap:.6rem;line-height:1.4;width:100%}.md-profile__description{flex-grow:1}.md-content--post{display:flex}@media screen and (max-width:76.234375em){.md-content--post{flex-flow:column-reverse}}.md-content--post>.md-content__inner{min-width:0}@media screen and (min-width:76.25em){[dir=ltr] .md-content--post>.md-content__inner{margin-left:1.2rem}[dir=rtl] .md-content--post>.md-content__inner{margin-right:1.2rem}}@media screen and (max-width:76.234375em){.md-sidebar.md-sidebar--post{padding:0;position:static;width:100%}.md-sidebar.md-sidebar--post .md-sidebar__scrollwrap{overflow:visible}.md-sidebar.md-sidebar--post .md-sidebar__inner{padding:0}.md-sidebar.md-sidebar--post .md-post__meta{margin-left:.6rem;margin-right:.6rem}.md-sidebar.md-sidebar--post .md-nav__item{border:none;display:inline}.md-sidebar.md-sidebar--post .md-nav__list{display:inline-flex;flex-wrap:wrap;gap:.6rem;padding-bottom:.6rem;padding-top:.6rem}.md-sidebar.md-sidebar--post .md-nav__link{padding:0}.md-sidebar.md-sidebar--post .md-nav{height:auto;margin-bottom:0;position:static}}:root{--md-progress-value:0;--md-progress-delay:400ms}.md-progress{background:var(--md-primary-bg-color);height:.075rem;opacity:min(clamp(0,var(--md-progress-value),1),clamp(0,100 - var(--md-progress-value),1));position:fixed;top:0;transform:scaleX(calc(var(--md-progress-value)*1%));transform-origin:left;transition:transform .5s cubic-bezier(.19,1,.22,1),opacity .25s var(--md-progress-delay);width:100%;z-index:4}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:#0000008a;cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__inner{float:right}[dir=rtl] .md-search__inner{float:left}.md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.234375em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem #0000;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:#00000042;border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:#ffffff1f}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem #00000012;color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:#0000;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::placeholder{transition:color .25s}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.984375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:#0000}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>.md-icon{margin-left:.2rem}[dir=rtl] .md-search__options>.md-icon{margin-right:.2rem}.md-search__options>.md-icon{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>.md-icon:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.984375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:focus,.md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more>summary{cursor:pointer;display:block;outline:none;position:sticky;scroll-snap-align:start;top:0;z-index:1}.md-search-result__more>summary::marker{display:none}.md-search-result__more>summary::-webkit-details-marker{display:none}.md-search-result__more>summary>div{color:var(--md-typeset-a-color);font-size:.64rem;padding:.75em .8rem;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more>summary>div{padding-left:2.2rem}[dir=rtl] .md-search-result__more>summary>div{padding-right:2.2rem}}.md-search-result__more>summary:focus>div,.md-search-result__more>summary:hover>div{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more[open]>summary{background-color:var(--md-default-bg-color)}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.984375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result .md-typeset{color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6}.md-search-result .md-typeset h1{color:var(--md-default-fg-color);font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}.md-search-result .md-typeset h1 mark{text-decoration:none}.md-search-result .md-typeset h2{color:var(--md-default-fg-color);font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result .md-typeset h2 mark{text-decoration:none}.md-search-result__terms{color:var(--md-default-fg-color);display:block;font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:initial;color:var(--md-accent-fg-color);text-decoration:underline}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:focus-within .md-select__inner,.md-select:hover .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid #0000;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid #0000;border-right:.2rem solid #0000;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:focus,.md-select__link:hover{color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.234375em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}.md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{scrollbar-gutter:stable;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap:focus-within,.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb:hover,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.md-sidebar__scrollwrap{scrollbar-gutter:auto}[dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}[dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.234375em){.md-overlay{background-color:#0000008a;height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}.md-source-file{margin:1em 0}[dir=ltr] .md-source-file__fact{margin-right:.6rem}[dir=rtl] .md-source-file__fact{margin-left:.6rem}.md-source-file__fact{align-items:center;color:var(--md-default-fg-color--light);display:inline-flex;font-size:.68rem;gap:.3rem}.md-source-file__fact .md-icon{flex-shrink:0;margin-bottom:.05rem}[dir=ltr] .md-source-file__fact .md-author{float:left}[dir=rtl] .md-source-file__fact .md-author{float:right}.md-source-file__fact .md-author{margin-right:.2rem}.md-source-file__fact svg{width:.9rem}:root{--md-status:url('data:image/svg+xml;charset=utf-8,');--md-status--new:url('data:image/svg+xml;charset=utf-8,');--md-status--deprecated:url('data:image/svg+xml;charset=utf-8,');--md-status--encrypted:url('data:image/svg+xml;charset=utf-8,')}.md-status:after{background-color:var(--md-default-fg-color--light);content:"";display:inline-block;height:1.125em;-webkit-mask-image:var(--md-status);mask-image:var(--md-status);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-bottom;width:1.125em}.md-status:hover:after{background-color:currentcolor}.md-status--new:after{-webkit-mask-image:var(--md-status--new);mask-image:var(--md-status--new)}.md-status--deprecated:after{-webkit-mask-image:var(--md-status--deprecated);mask-image:var(--md-status--deprecated)}.md-status--encrypted:after{-webkit-mask-image:var(--md-status--encrypted);mask-image:var(--md-status--encrypted)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.234375em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;display:flex;list-style:none;margin:0;overflow:auto;padding:0;scrollbar-width:none;white-space:nowrap}.md-tabs__list::-webkit-scrollbar{display:none}.md-tabs__item{height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__item--active .md-tabs__link{color:inherit;opacity:1}.md-tabs__link{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:flex;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link:focus,.md-tabs__link:hover{color:inherit;opacity:1}[dir=ltr] .md-tabs__link svg{margin-right:.4rem}[dir=rtl] .md-tabs__link svg{margin-left:.4rem}.md-tabs__link svg{fill:currentcolor;height:1.3em}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}:root{--md-tag-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-tags:not([hidden]){display:inline-flex;flex-wrap:wrap;gap:.5em;margin-bottom:.75em;margin-top:-.125em}.md-typeset .md-tag{align-items:center;background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-flex;font-size:.64rem;font-size:min(.8em,.64rem);font-weight:700;gap:.5em;letter-spacing:normal;line-height:1.6;padding:.3125em .78125em}.md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-typeset .md-tag[href]:focus,.md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-typeset .md-tag{vertical-align:text-top}.md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset .md-tag-icon[href]:focus:before,.md-typeset .md-tag-icon[href]:hover:before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{transform:scale(.95)}75%{transform:scale(1)}to{transform:scale(.95)}}:root{--md-annotation-bg-icon:url('data:image/svg+xml;charset=utf-8,');--md-annotation-icon:url('data:image/svg+xml;charset=utf-8,');--md-tooltip-width:20rem}.md-tooltip{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}.md-tooltip--inline{font-weight:700;-webkit-user-select:none;user-select:none;width:auto}.md-tooltip--inline:not(.md-tooltip--active){transform:translateY(.2rem) scale(.9)}.md-tooltip--inline .md-tooltip__inner{font-size:.5rem;padding:.2rem .4rem}[hidden]+.md-tooltip--inline{display:none}.focus-visible>.md-tooltip,.md-tooltip:target{outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{font-weight:400;outline:none;vertical-align:text-bottom;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}code .md-annotation{font-family:var(--md-code-font-family);font-size:inherit}.md-annotation:not([hidden]){display:inline-block;line-height:1.25}.md-annotation__index{border-radius:.01px;cursor:pointer;display:inline-block;margin-left:.4ch;margin-right:.4ch;outline:none;overflow:hidden;position:relative;-webkit-user-select:none;user-select:none;vertical-align:text-top;z-index:0}.md-annotation .md-annotation__index{transition:z-index .25s}@media screen{.md-annotation__index{width:2.2ch}[data-md-visible]>.md-annotation__index{animation:pulse 2s infinite}.md-annotation__index:before{background:var(--md-default-bg-color);-webkit-mask-image:var(--md-annotation-bg-icon);mask-image:var(--md-annotation-bg-icon)}.md-annotation__index:after,.md-annotation__index:before{content:"";height:2.2ch;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:-.1ch;width:2.2ch;z-index:-1}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);-webkit-mask-image:var(--md-annotation-icon);mask-image:var(--md-annotation-icon);transform:scale(1.0001);transition:background-color .25s,transform .25s}.md-tooltip--active+.md-annotation__index:after{transform:rotate(45deg)}.md-tooltip--active+.md-annotation__index:after,:hover>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}}.md-tooltip--active+.md-annotation__index{animation-play-state:paused;transition-duration:0ms;z-index:2}.md-annotation__index [data-md-annotation-id]{display:inline-block}@media print{.md-annotation__index [data-md-annotation-id]{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);font-weight:700;padding:0 .6ch;white-space:nowrap}.md-annotation__index [data-md-annotation-id]:after{content:attr(data-md-annotation-id)}}.md-typeset .md-annotation-list{counter-reset:xxx;list-style:none}.md-typeset .md-annotation-list li{position:relative}[dir=ltr] .md-typeset .md-annotation-list li:before{left:-2.125em}[dir=rtl] .md-typeset .md-annotation-list li:before{right:-2.125em}.md-typeset .md-annotation-list li:before{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);content:counter(xxx);counter-increment:xxx;font-size:.8875em;font-weight:700;height:2ch;line-height:1.25;min-width:2ch;padding:0 .6ch;position:absolute;text-align:center;top:.25em}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);cursor:pointer;display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:focus,.md-top:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:focus-within .md-version__list,.md-version:hover .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (hover:none),(pointer:coarse){.md-version:hover .md-version__list{animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:focus,.md-version__link:hover{color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .admonition,.md-typeset details{background-color:var(--md-admonition-bg-color);border:.075rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid;transition:box-shadow 125ms}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}.md-typeset .admonition:focus-within,.md-typeset details:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .admonition>*,.md-typeset details>*{box-sizing:border-box}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin-bottom:1em;margin-top:1em}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-left-width:.2rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-right-width:.2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset .admonition-title,.md-typeset summary{background-color:#448aff1a;border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}[dir=ltr] .md-typeset .admonition-title:before,[dir=ltr] .md-typeset summary:before{left:.6rem}[dir=rtl] .md-typeset .admonition-title:before,[dir=rtl] .md-typeset summary:before{right:.6rem}.md-typeset .admonition-title:before,.md-typeset summary:before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset .admonition-title code,.md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.md-typeset .admonition.note,.md-typeset details.note{border-color:#448aff}.md-typeset .admonition.note:focus-within,.md-typeset details.note:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .note>.admonition-title,.md-typeset .note>summary{background-color:#448aff1a}.md-typeset .note>.admonition-title:before,.md-typeset .note>summary:before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset .note>.admonition-title:after,.md-typeset .note>summary:after{color:#448aff}.md-typeset .admonition.abstract,.md-typeset details.abstract{border-color:#00b0ff}.md-typeset .admonition.abstract:focus-within,.md-typeset details.abstract:focus-within{box-shadow:0 0 0 .2rem #00b0ff1a}.md-typeset .abstract>.admonition-title,.md-typeset .abstract>summary{background-color:#00b0ff1a}.md-typeset .abstract>.admonition-title:before,.md-typeset .abstract>summary:before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset .abstract>.admonition-title:after,.md-typeset .abstract>summary:after{color:#00b0ff}.md-typeset .admonition.info,.md-typeset details.info{border-color:#00b8d4}.md-typeset .admonition.info:focus-within,.md-typeset details.info:focus-within{box-shadow:0 0 0 .2rem #00b8d41a}.md-typeset .info>.admonition-title,.md-typeset .info>summary{background-color:#00b8d41a}.md-typeset .info>.admonition-title:before,.md-typeset .info>summary:before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset .info>.admonition-title:after,.md-typeset .info>summary:after{color:#00b8d4}.md-typeset .admonition.tip,.md-typeset details.tip{border-color:#00bfa5}.md-typeset .admonition.tip:focus-within,.md-typeset details.tip:focus-within{box-shadow:0 0 0 .2rem #00bfa51a}.md-typeset .tip>.admonition-title,.md-typeset .tip>summary{background-color:#00bfa51a}.md-typeset .tip>.admonition-title:before,.md-typeset .tip>summary:before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset .tip>.admonition-title:after,.md-typeset .tip>summary:after{color:#00bfa5}.md-typeset .admonition.success,.md-typeset details.success{border-color:#00c853}.md-typeset .admonition.success:focus-within,.md-typeset details.success:focus-within{box-shadow:0 0 0 .2rem #00c8531a}.md-typeset .success>.admonition-title,.md-typeset .success>summary{background-color:#00c8531a}.md-typeset .success>.admonition-title:before,.md-typeset .success>summary:before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset .success>.admonition-title:after,.md-typeset .success>summary:after{color:#00c853}.md-typeset .admonition.question,.md-typeset details.question{border-color:#64dd17}.md-typeset .admonition.question:focus-within,.md-typeset details.question:focus-within{box-shadow:0 0 0 .2rem #64dd171a}.md-typeset .question>.admonition-title,.md-typeset .question>summary{background-color:#64dd171a}.md-typeset .question>.admonition-title:before,.md-typeset .question>summary:before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset .question>.admonition-title:after,.md-typeset .question>summary:after{color:#64dd17}.md-typeset .admonition.warning,.md-typeset details.warning{border-color:#ff9100}.md-typeset .admonition.warning:focus-within,.md-typeset details.warning:focus-within{box-shadow:0 0 0 .2rem #ff91001a}.md-typeset .warning>.admonition-title,.md-typeset .warning>summary{background-color:#ff91001a}.md-typeset .warning>.admonition-title:before,.md-typeset .warning>summary:before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset .warning>.admonition-title:after,.md-typeset .warning>summary:after{color:#ff9100}.md-typeset .admonition.failure,.md-typeset details.failure{border-color:#ff5252}.md-typeset .admonition.failure:focus-within,.md-typeset details.failure:focus-within{box-shadow:0 0 0 .2rem #ff52521a}.md-typeset .failure>.admonition-title,.md-typeset .failure>summary{background-color:#ff52521a}.md-typeset .failure>.admonition-title:before,.md-typeset .failure>summary:before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset .failure>.admonition-title:after,.md-typeset .failure>summary:after{color:#ff5252}.md-typeset .admonition.danger,.md-typeset details.danger{border-color:#ff1744}.md-typeset .admonition.danger:focus-within,.md-typeset details.danger:focus-within{box-shadow:0 0 0 .2rem #ff17441a}.md-typeset .danger>.admonition-title,.md-typeset .danger>summary{background-color:#ff17441a}.md-typeset .danger>.admonition-title:before,.md-typeset .danger>summary:before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset .danger>.admonition-title:after,.md-typeset .danger>summary:after{color:#ff1744}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#f50057}.md-typeset .admonition.bug:focus-within,.md-typeset details.bug:focus-within{box-shadow:0 0 0 .2rem #f500571a}.md-typeset .bug>.admonition-title,.md-typeset .bug>summary{background-color:#f500571a}.md-typeset .bug>.admonition-title:before,.md-typeset .bug>summary:before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset .bug>.admonition-title:after,.md-typeset .bug>summary:after{color:#f50057}.md-typeset .admonition.example,.md-typeset details.example{border-color:#7c4dff}.md-typeset .admonition.example:focus-within,.md-typeset details.example:focus-within{box-shadow:0 0 0 .2rem #7c4dff1a}.md-typeset .example>.admonition-title,.md-typeset .example>summary{background-color:#7c4dff1a}.md-typeset .example>.admonition-title:before,.md-typeset .example>summary:before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset .example>.admonition-title:after,.md-typeset .example>summary:after{color:#7c4dff}.md-typeset .admonition.quote,.md-typeset details.quote{border-color:#9e9e9e}.md-typeset .admonition.quote:focus-within,.md-typeset details.quote:focus-within{box-shadow:0 0 0 .2rem #9e9e9e1a}.md-typeset .quote>.admonition-title,.md-typeset .quote>summary{background-color:#9e9e9e1a}.md-typeset .quote>.admonition-title:before,.md-typeset .quote>summary:before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset .quote>.admonition-title:after,.md-typeset .quote>summary:after{color:#9e9e9e}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:hover .footnote-backref,.md-typeset .footnote>ol>li:target .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before svg{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :hover>.headerlink,.md-typeset :target>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset .headerlink:hover,.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset h1:target,.md-typeset h2:target,.md-typeset h3:target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.984375em){.md-typeset div.arithmatex{margin:0 -.8rem}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto;width:-webkit-min-content;width:min-content}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset del.critic,.md-typeset ins.critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone;color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset .emojione,.md-typeset .gemoji,.md-typeset .twemoji{--md-icon-size:1.125em;display:inline-flex;height:var(--md-icon-size);vertical-align:text-top}.md-typeset .emojione svg,.md-typeset .gemoji svg,.md-typeset .twemoji svg{fill:currentcolor;max-height:100%;width:var(--md-icon-size)}.md-typeset .lg,.md-typeset .xl,.md-typeset .xxl,.md-typeset .xxxl{vertical-align:text-bottom}.md-typeset .middle{vertical-align:middle}.md-typeset .lg{--md-icon-size:1.5em}.md-typeset .xl{--md-icon-size:2.25em}.md-typeset .xxl{--md-icon-size:3em}.md-typeset .xxxl{--md-icon-size:4em}.highlight .o,.highlight .ow{color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight .cpf,.highlight .l,.highlight .s,.highlight .s1,.highlight .s2,.highlight .sb,.highlight .sc,.highlight .si,.highlight .ss{color:var(--md-code-hl-string-color)}.highlight .cp,.highlight .se,.highlight .sh,.highlight .sr,.highlight .sx{color:var(--md-code-hl-special-color)}.highlight .il,.highlight .m,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:var(--md-code-hl-number-color)}.highlight .k,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:var(--md-code-hl-keyword-color)}.highlight .kc,.highlight .n{color:var(--md-code-hl-name-color)}.highlight .bp,.highlight .nb,.highlight .no{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne,.highlight .nf,.highlight .nn{color:var(--md-code-hl-function-color)}.highlight .nd,.highlight .ni,.highlight .nl,.highlight .nt{color:var(--md-code-hl-keyword-color)}.highlight .c,.highlight .c1,.highlight .ch,.highlight .cm,.highlight .cs,.highlight .sd{color:var(--md-code-hl-comment-color)}.highlight .na,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--md-code-hl-variable-color)}.highlight .ge,.highlight .gh,.highlight .go,.highlight .gp,.highlight .gr,.highlight .gs,.highlight .gt,.highlight .gu{color:var(--md-code-hl-generic-color)}.highlight .gd,.highlight .gi{border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color--light);box-shadow:2px 0 0 0 var(--md-code-hl-color) inset;display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:sticky;-webkit-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying]{display:block}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable tbody,.highlighttable td{display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .linenodiv span[class]{padding-right:.5882352941em}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset .highlight+.result:after{clear:both;content:"";display:block}@media screen and (max-width:44.984375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:after,.md-typeset .keys kbd:before{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"⎇";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"⌘";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"⌃";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"◆";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"⌥";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"⇧";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"❖";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"⊞";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"↓";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"←";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"→";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"↑";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"⌫";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"⇤";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"⇪";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"⌧";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"☰";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"⌦";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"⏏";padding-right:.4em}.md-typeset .keys .key-end:before{content:"⤓";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"⎋";padding-right:.4em}.md-typeset .keys .key-home:before{content:"⤒";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"⎀";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"⇟";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"⇞";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"⎙";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"⇥";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"⌤";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"⏎";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-set>input.focus-visible~.tabbed-labels:before{background-color:var(--md-accent-fg-color)}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-default-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,background-color .25s,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid #0000;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-default-fg-color)}.md-typeset .tabbed-labels>label>[href]:first-child{color:inherit}.md-typeset .tabbed-labels--linked>label{padding:0}.md-typeset .tabbed-labels--linked>label>a{display:block;padding:.78125em 1.25em .625em}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,#0000);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,#0000);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.984375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-default-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-default-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color);--md-mermaid-sequence-actor-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actor-fg-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-actor-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-actor-line-color:var(--md-default-fg-color--lighter);--md-mermaid-sequence-actorman-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actorman-line-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-box-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-box-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-label-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-label-fg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-loop-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-loop-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-loop-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-message-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-message-line-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-note-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-border-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-number-bg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-number-fg-color:var(--md-accent-bg-color)}.mermaid{line-height:normal;margin:1em 0}.md-typeset .grid{grid-gap:.4rem;display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr));margin:1em 0}.md-typeset .grid.cards>ol,.md-typeset .grid.cards>ul{display:contents}.md-typeset .grid.cards>ol>li,.md-typeset .grid.cards>ul>li,.md-typeset .grid>.card{border:.05rem solid var(--md-default-fg-color--lightest);border-radius:.1rem;display:block;margin:0;padding:.8rem;transition:border .25s,box-shadow .25s}.md-typeset .grid.cards>ol>li:focus-within,.md-typeset .grid.cards>ol>li:hover,.md-typeset .grid.cards>ul>li:focus-within,.md-typeset .grid.cards>ul>li:hover,.md-typeset .grid>.card:focus-within,.md-typeset .grid>.card:hover{border-color:#0000;box-shadow:var(--md-shadow-z2)}.md-typeset .grid.cards>ol>li>hr,.md-typeset .grid.cards>ul>li>hr,.md-typeset .grid>.card>hr{margin-bottom:1em;margin-top:1em}.md-typeset .grid.cards>ol>li>:first-child,.md-typeset .grid.cards>ul>li>:first-child,.md-typeset .grid>.card>:first-child{margin-top:0}.md-typeset .grid.cards>ol>li>:last-child,.md-typeset .grid.cards>ul>li>:last-child,.md-typeset .grid>.card>:last-child{margin-bottom:0}.md-typeset .grid>*,.md-typeset .grid>.admonition,.md-typeset .grid>.highlight>*,.md-typeset .grid>.highlighttable,.md-typeset .grid>.md-typeset details,.md-typeset .grid>details,.md-typeset .grid>pre{margin-bottom:0;margin-top:0}.md-typeset .grid>.highlight>pre:only-child,.md-typeset .grid>.highlight>pre>code,.md-typeset .grid>.highlighttable,.md-typeset .grid>.highlighttable>tbody,.md-typeset .grid>.highlighttable>tbody>tr,.md-typeset .grid>.highlighttable>tbody>tr>.code,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre>code{height:100%}.md-typeset .grid>.tabbed-set{margin-bottom:0;margin-top:0}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{float:left}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=ltr] .md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}} \ No newline at end of file diff --git a/assets/stylesheets/main.67c3bdf0.min.css b/assets/stylesheets/main.67c3bdf0.min.css new file mode 100644 index 00000000..118b81b3 --- /dev/null +++ b/assets/stylesheets/main.67c3bdf0.min.css @@ -0,0 +1 @@ +@charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:initial;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{background:#0000;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}input{border:0;outline:none}:root{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-scheme=default]{color-scheme:light}[data-md-color-scheme=default] img[src$="#gh-dark-mode-only"],[data-md-color-scheme=default] img[src$="#only-dark"]{display:none}:root,[data-md-color-scheme=default]{--md-hue:225deg;--md-default-fg-color:#000000de;--md-default-fg-color--light:#0000008a;--md-default-fg-color--lighter:#00000052;--md-default-fg-color--lightest:#00000012;--md-default-bg-color:#fff;--md-default-bg-color--light:#ffffffb3;--md-default-bg-color--lighter:#ffffff4d;--md-default-bg-color--lightest:#ffffff1f;--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-bg-color--light:#f5f5f5b3;--md-code-bg-color--lighter:#f5f5f54d;--md-code-hl-color:#4287ff;--md-code-hl-color--light:#4287ff1a;--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-del-color:#f5503d26;--md-typeset-ins-color:#0bd57026;--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-mark-color:#ffff0080;--md-typeset-table-color:#0000001f;--md-typeset-table-color--light:rgba(0,0,0,.035);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-warning-fg-color:#000000de;--md-warning-bg-color:#ff9;--md-footer-fg-color:#fff;--md-footer-fg-color--light:#ffffffb3;--md-footer-fg-color--lighter:#ffffff73;--md-footer-bg-color:#000000de;--md-footer-bg-color--dark:#00000052;--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #0000001a,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0003,0 0 0.05rem #00000059}.md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}aside,body,input{font-feature-settings:"kern","liga";color:var(--md-typeset-color);font-family:var(--md-text-font-family)}code,kbd,pre{font-feature-settings:"kern";font-family:var(--md-code-font-family)}:root{--md-typeset-table-sort-icon:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset a code{color:var(--md-typeset-a-color)}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none;transition:background-color 125ms}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;transition:color 125ms,background-color 125ms;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help;text-decoration:none}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}[dir=ltr] .md-typeset ol li ol,[dir=ltr] .md-typeset ol li ul,[dir=ltr] .md-typeset ul li ol,[dir=ltr] .md-typeset ul li ul{margin-left:.625em}[dir=rtl] .md-typeset ol li ol,[dir=rtl] .md-typeset ol li ul,[dir=rtl] .md-typeset ul li ol,[dir=rtl] .md-typeset ul li ul{margin-right:.625em}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.md-typeset figure img{display:block}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td>:first-child,.md-typeset table:not([class]) th>:first-child{margin-top:0}.md-typeset table:not([class]) td>:last-child,.md-typeset table:not([class]) th>:last-child{margin-bottom:0}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) td:not([align]),[dir=rtl] .md-typeset table:not([class]) th:not([align]){text-align:right}.md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.md-typeset table:not([class]) tbody tr:hover{background-color:var(--md-typeset-table-color--light);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.984375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-typeset .md-author{border-radius:100%;display:block;flex-shrink:0;height:1.6rem;overflow:hidden;position:relative;transition:color 125ms,transform 125ms;width:1.6rem}.md-typeset .md-author img{display:block}.md-typeset .md-author--more{background:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--lighter);font-size:.6rem;font-weight:700;line-height:1.6rem;text-align:center}.md-typeset .md-author--long{height:2.4rem;width:2.4rem}.md-typeset a.md-author{transform:scale(1)}.md-typeset a.md-author img{filter:grayscale(100%) opacity(75%);transition:filter 125ms}.md-typeset a.md-author:focus,.md-typeset a.md-author:hover{transform:scale(1.1);z-index:1}.md-typeset a.md-author:focus img,.md-typeset a.md-author:hover img{filter:grayscale(0)}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background-color:var(--md-warning-bg-color);color:var(--md-warning-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}[dir=ltr] .md-banner__button{float:right}[dir=rtl] .md-banner__button{float:left}.md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.no-js .md-banner__button{display:none}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.984375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:focus,.md-clipboard:hover{color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:focus code,.md-clipboard--inline:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}:root{--md-code-select-icon:url('data:image/svg+xml;charset=utf-8,');--md-code-copy-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-code__content{display:grid}.md-code__nav{background-color:var(--md-code-bg-color--lighter);border-radius:.1rem;display:flex;gap:.2rem;padding:.2rem;position:absolute;right:.25em;top:.25em;transition:background-color .25s;z-index:1}:hover>.md-code__nav{background-color:var(--md-code-bg-color--light)}.md-code__button{color:var(--md-default-fg-color--lightest);cursor:pointer;display:block;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;transition:color .25s;width:1.5em}:hover>*>.md-code__button{color:var(--md-default-fg-color--light)}.md-code__button.focus-visible,.md-code__button:hover{color:var(--md-accent-fg-color)}.md-code__button--active{color:var(--md-default-fg-color)!important}.md-code__button:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-code__button[data-md-type=select]:after{-webkit-mask-image:var(--md-code-select-icon);mask-image:var(--md-code-select-icon)}.md-code__button[data-md-type=copy]:after{-webkit-mask-image:var(--md-code-copy-icon);mask-image:var(--md-code-copy-icon)}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:#0000008a;height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.984375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{float:right}[dir=rtl] .md-content__button{float:left}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{display:flex;flex-wrap:wrap;place-content:baseline center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{align-items:end;display:flex;flex-grow:0.01;margin-bottom:.4rem;margin-top:1rem;max-width:100%;outline-color:var(--md-accent-fg-color);overflow:hidden;transition:opacity .25s}.md-footer__link:focus,.md-footer__link:hover{opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.984375em){.md-footer__link--prev{flex-shrink:0}.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;margin-bottom:.7rem;max-width:calc(100% - 2.4rem);padding:0 1rem;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;opacity:.7}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:focus,html .md-footer-meta.md-typeset a:hover{color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{display:inline-flex;gap:.2rem;margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:focus,.md-typeset .md-button:hover{background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:focus,.md-typeset .md-input:hover{border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem #0000,0 .2rem .4rem #0000;color:var(--md-primary-bg-color);display:block;left:0;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.234375em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo img,.md-header__button.md-logo svg{fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-left:1rem;margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem;margin-right:1rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__option>input{bottom:0}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}.md-meta{color:var(--md-default-fg-color--light);font-size:.7rem;line-height:1.3}.md-meta__list{display:inline-flex;flex-wrap:wrap;list-style:none;margin:0;padding:0}.md-meta__item:not(:last-child):after{content:"·";margin-left:.2rem;margin-right:.2rem}.md-meta__link{color:var(--md-typeset-a-color)}.md-meta__link:focus,.md-meta__link:hover{color:var(--md-accent-fg-color)}.md-draft{background-color:#ff1744;border-radius:.125em;color:#fff;display:inline-block;font-weight:700;padding-left:.5714285714em;padding-right:.5714285714em}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{color:var(--md-default-fg-color--light);display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo img,.md-nav__title .md-nav__button.md-logo svg{fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__link{align-items:flex-start;display:flex;gap:.4rem;margin-top:.625em;scroll-snap-align:start;transition:color 125ms}.md-nav__link--passed,.md-nav__link--passed code{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active,.md-nav__item .md-nav__link--active code{color:var(--md-typeset-a-color)}.md-nav__link .md-ellipsis{position:relative}.md-nav__link .md-ellipsis code{word-break:normal}[dir=ltr] .md-nav__link .md-icon:last-child{margin-left:auto}[dir=rtl] .md-nav__link .md-icon:last-child{margin-right:auto}.md-nav__link .md-typeset{font-size:.7rem;line-height:1.3}.md-nav__link svg{fill:currentcolor;flex-shrink:0;height:1.3em}.md-nav__link[for]:focus,.md-nav__link[for]:hover,.md-nav__link[href]:focus,.md-nav__link[href]:hover{color:var(--md-accent-fg-color);cursor:pointer}.md-nav__link[for]:focus code,.md-nav__link[for]:hover code,.md-nav__link[href]:focus code,.md-nav__link[href]:hover code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__container>.md-nav__link{margin-top:0}.md-nav__container>.md-nav__link:first-child{flex-grow:1;min-width:0}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.234375em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest)}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:focus,.md-nav--primary .md-nav__item--active>.md-nav__link:hover{color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}.md-nav--primary .md-nav__link svg{margin-top:.1em}.md-nav--primary .md-nav__link>.md-nav__link{padding:0}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:initial}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width:59.984375em){.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav{margin-bottom:-.4rem}.md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--secondary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--secondary .md-nav__list{padding-right:.6rem}.md-nav--secondary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--secondary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--secondary .md-nav__item>.md-nav__link{margin-left:.4rem}}@media screen and (min-width:76.25em){.md-nav{margin-bottom:-.4rem;transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:sticky;top:0;z-index:1}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon{display:none}[dir=ltr] .md-nav--primary .md-nav__list{padding-left:.6rem}[dir=rtl] .md-nav--primary .md-nav__list{padding-right:.6rem}.md-nav--primary .md-nav__list{padding-bottom:.4rem}[dir=ltr] .md-nav--primary .md-nav__item>.md-nav__link{margin-right:.4rem}[dir=rtl] .md-nav--primary .md-nav__item>.md-nav__link{margin-left:.4rem}.md-nav__toggle~.md-nav{display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .25s,visibility 0ms .25s;visibility:collapse}.md-nav__toggle~.md-nav>.md-nav__list{overflow:hidden}.md-nav__toggle.md-toggle--indeterminate~.md-nav,.md-nav__toggle:checked~.md-nav{grid-template-rows:1fr;opacity:1;transition:grid-template-rows .25s cubic-bezier(.86,0,.07,1),opacity .15s .1s,visibility 0ms;visibility:visible}.md-nav__toggle.md-toggle--indeterminate~.md-nav{transition:none}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700}.md-nav__item--section>.md-nav__link[for]{color:var(--md-default-fg-color--light)}.md-nav__item--section>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav__item--section>.md-nav__link .md-icon,.md-nav__item--section>.md-nav__link>[for]{display:none}[dir=ltr] .md-nav__item--section>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav__item--section>.md-nav{margin-right:-.6rem}.md-nav__item--section>.md-nav{display:block;opacity:1;visibility:visible}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s;width:.9rem}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;border-radius:100%;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:transform .25s;vertical-align:-.1rem;width:100%}[dir=rtl] .md-nav__icon:after{transform:rotate(180deg)}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon:after,.md-nav__item--nested .md-toggle--indeterminate~.md-nav__link .md-nav__icon:after{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);margin-top:0;position:sticky;top:0;z-index:1}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__container){pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active.md-nav__item--section{margin:0}[dir=ltr] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav{margin-left:-.6rem}[dir=rtl] .md-nav--lifted>.md-nav__list>.md-nav__item>.md-nav{margin-right:-.6rem}.md-nav--lifted>.md-nav__list>.md-nav__item>[for]{color:var(--md-default-fg-color--light)}.md-nav--lifted .md-nav[data-md-level="1"]{grid-template-rows:1fr;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested){padding:0 .6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested)>.md-nav__link{padding:0}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em;opacity:1;visibility:visible}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__list{overflow:visible;padding-bottom:0}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}.md-pagination{font-size:.8rem;font-weight:700;gap:.4rem}.md-pagination,.md-pagination>*{align-items:center;display:flex;justify-content:center}.md-pagination>*{border-radius:.2rem;height:1.8rem;min-width:1.8rem;text-align:center}.md-pagination__current{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light)}.md-pagination__link{transition:color 125ms,background-color 125ms}.md-pagination__link:focus,.md-pagination__link:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-pagination__link:focus svg,.md-pagination__link:hover svg{color:var(--md-accent-fg-color)}.md-pagination__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-pagination__link svg{fill:currentcolor;color:var(--md-default-fg-color--lighter);display:block;max-height:100%;width:1.2rem}:root{--md-path-icon:url('data:image/svg+xml;charset=utf-8,')}.md-path{display:block;font-size:.7rem;margin:0 .8rem;overflow:auto;padding-top:1.2rem}@media screen and (min-width:76.25em){.md-path{margin:0 1.2rem}}.md-path__list{align-items:center;display:flex;gap:.2rem;list-style:none;margin:0;padding:0}.md-path__item:not(:first-child){display:inline-flex;gap:.2rem;white-space:nowrap}.md-path__item:not(:first-child):before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline;height:.8rem;-webkit-mask-image:var(--md-path-icon);mask-image:var(--md-path-icon);width:.8rem}.md-path__link{align-items:center;color:var(--md-default-fg-color--light);display:flex}.md-path__link:focus,.md-path__link:hover{color:var(--md-accent-fg-color)}.md-post__back{border-bottom:.05rem solid var(--md-default-fg-color--lightest);margin-bottom:1.2rem;padding-bottom:1.2rem}@media screen and (max-width:76.234375em){.md-post__back{display:none}}[dir=rtl] .md-post__back svg{transform:scaleX(-1)}.md-post__authors{display:flex;flex-direction:column;gap:.6rem;margin:0 .6rem 1.2rem}.md-post .md-post__meta a{transition:color 125ms}.md-post .md-post__meta a:focus,.md-post .md-post__meta a:hover{color:var(--md-accent-fg-color)}.md-post__title{color:var(--md-default-fg-color--light);font-weight:700}.md-post--excerpt{margin-bottom:3.2rem}.md-post--excerpt .md-post__header{align-items:center;display:flex;gap:.6rem;min-height:1.6rem}.md-post--excerpt .md-post__authors{align-items:center;display:inline-flex;flex-direction:row;gap:.2rem;margin:0;min-height:2.4rem}[dir=ltr] .md-post--excerpt .md-post__meta .md-meta__list{margin-right:.4rem}[dir=rtl] .md-post--excerpt .md-post__meta .md-meta__list{margin-left:.4rem}.md-post--excerpt .md-post__content>:first-child{--md-scroll-margin:6rem;margin-top:0}.md-post>.md-nav--secondary{margin:1em 0}.md-profile{align-items:center;display:flex;font-size:.7rem;gap:.6rem;line-height:1.4;width:100%}.md-profile__description{flex-grow:1}.md-content--post{display:flex}@media screen and (max-width:76.234375em){.md-content--post{flex-flow:column-reverse}}.md-content--post>.md-content__inner{min-width:0}@media screen and (min-width:76.25em){[dir=ltr] .md-content--post>.md-content__inner{margin-left:1.2rem}[dir=rtl] .md-content--post>.md-content__inner{margin-right:1.2rem}}@media screen and (max-width:76.234375em){.md-sidebar.md-sidebar--post{padding:0;position:static;width:100%}.md-sidebar.md-sidebar--post .md-sidebar__scrollwrap{overflow:visible}.md-sidebar.md-sidebar--post .md-sidebar__inner{padding:0}.md-sidebar.md-sidebar--post .md-post__meta{margin-left:.6rem;margin-right:.6rem}.md-sidebar.md-sidebar--post .md-nav__item{border:none;display:inline}.md-sidebar.md-sidebar--post .md-nav__list{display:inline-flex;flex-wrap:wrap;gap:.6rem;padding-bottom:.6rem;padding-top:.6rem}.md-sidebar.md-sidebar--post .md-nav__link{padding:0}.md-sidebar.md-sidebar--post .md-nav{height:auto;margin-bottom:0;position:static}}:root{--md-progress-value:0;--md-progress-delay:400ms}.md-progress{background:var(--md-primary-bg-color);height:.075rem;opacity:min(clamp(0,var(--md-progress-value),1),clamp(0,100 - var(--md-progress-value),1));position:fixed;top:0;transform:scaleX(calc(var(--md-progress-value)*1%));transform-origin:left;transition:transform .5s cubic-bezier(.19,1,.22,1),opacity .25s var(--md-progress-delay);width:100%;z-index:4}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:#0000008a;cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.984375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__inner{float:right}[dir=rtl] .md-search__inner{float:left}.md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.234375em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem #0000;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:#00000042;border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:#ffffff1f}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem #00000012;color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:#0000;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::placeholder{transition:color .25s}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.984375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:#0000}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.984375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>.md-icon{margin-left:.2rem}[dir=rtl] .md-search__options>.md-icon{margin-right:.2rem}.md-search__options>.md-icon{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>.md-icon:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>.md-icon:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.984375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.234375em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:focus,.md-search-result__link:hover{background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more>summary{cursor:pointer;display:block;outline:none;position:sticky;scroll-snap-align:start;top:0;z-index:1}.md-search-result__more>summary::marker{display:none}.md-search-result__more>summary::-webkit-details-marker{display:none}.md-search-result__more>summary>div{color:var(--md-typeset-a-color);font-size:.64rem;padding:.75em .8rem;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more>summary>div{padding-left:2.2rem}[dir=rtl] .md-search-result__more>summary>div{padding-right:2.2rem}}.md-search-result__more>summary:focus>div,.md-search-result__more>summary:hover>div{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more[open]>summary{background-color:var(--md-default-bg-color)}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.984375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result .md-typeset{color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.6}.md-search-result .md-typeset h1{color:var(--md-default-fg-color);font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}.md-search-result .md-typeset h1 mark{text-decoration:none}.md-search-result .md-typeset h2{color:var(--md-default-fg-color);font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result .md-typeset h2 mark{text-decoration:none}.md-search-result__terms{color:var(--md-default-fg-color);display:block;font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:initial;color:var(--md-accent-fg-color);text-decoration:underline}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:focus-within .md-select__inner,.md-select:hover .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid #0000;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid #0000;border-right:.2rem solid #0000;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:focus,.md-select__link:hover{color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.234375em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}.md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{scrollbar-gutter:stable;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap:focus-within,.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap:focus-within::-webkit-scrollbar-thumb:hover,.md-sidebar__scrollwrap:hover::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.md-sidebar__scrollwrap{scrollbar-gutter:auto}[dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}[dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.234375em){.md-overlay{background-color:#0000008a;height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}.md-source-file{margin:1em 0}[dir=ltr] .md-source-file__fact{margin-right:.6rem}[dir=rtl] .md-source-file__fact{margin-left:.6rem}.md-source-file__fact{align-items:center;color:var(--md-default-fg-color--light);display:inline-flex;font-size:.68rem;gap:.3rem}.md-source-file__fact .md-icon{flex-shrink:0;margin-bottom:.05rem}[dir=ltr] .md-source-file__fact .md-author{float:left}[dir=rtl] .md-source-file__fact .md-author{float:right}.md-source-file__fact .md-author{margin-right:.2rem}.md-source-file__fact svg{width:.9rem}:root{--md-status:url('data:image/svg+xml;charset=utf-8,');--md-status--new:url('data:image/svg+xml;charset=utf-8,');--md-status--deprecated:url('data:image/svg+xml;charset=utf-8,');--md-status--encrypted:url('data:image/svg+xml;charset=utf-8,')}.md-status:after{background-color:var(--md-default-fg-color--light);content:"";display:inline-block;height:1.125em;-webkit-mask-image:var(--md-status);mask-image:var(--md-status);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-bottom;width:1.125em}.md-status:hover:after{background-color:currentcolor}.md-status--new:after{-webkit-mask-image:var(--md-status--new);mask-image:var(--md-status--new)}.md-status--deprecated:after{-webkit-mask-image:var(--md-status--deprecated);mask-image:var(--md-status--deprecated)}.md-status--encrypted:after{-webkit-mask-image:var(--md-status--encrypted);mask-image:var(--md-status--encrypted)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.234375em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;display:flex;list-style:none;margin:0;overflow:auto;padding:0;scrollbar-width:none;white-space:nowrap}.md-tabs__list::-webkit-scrollbar{display:none}.md-tabs__item{height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__item--active .md-tabs__link{color:inherit;opacity:1}.md-tabs__link{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:flex;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link:focus,.md-tabs__link:hover{color:inherit;opacity:1}[dir=ltr] .md-tabs__link svg{margin-right:.4rem}[dir=rtl] .md-tabs__link svg{margin-left:.4rem}.md-tabs__link svg{fill:currentcolor;height:1.3em}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}:root{--md-tag-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-tags:not([hidden]){display:inline-flex;flex-wrap:wrap;gap:.5em;margin-bottom:.75em;margin-top:-.125em}.md-typeset .md-tag{align-items:center;background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-flex;font-size:.64rem;font-size:min(.8em,.64rem);font-weight:700;gap:.5em;letter-spacing:normal;line-height:1.6;padding:.3125em .78125em}.md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-typeset .md-tag[href]:focus,.md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-typeset .md-tag{vertical-align:text-top}.md-typeset .md-tag-shadow{opacity:.5}.md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset .md-tag-icon[href]:focus:before,.md-typeset .md-tag-icon[href]:hover:before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{transform:scale(.95)}75%{transform:scale(1)}to{transform:scale(.95)}}:root{--md-annotation-bg-icon:url('data:image/svg+xml;charset=utf-8,');--md-annotation-icon:url('data:image/svg+xml;charset=utf-8,');--md-tooltip-width:20rem}.md-tooltip{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}.md-tooltip--inline{font-weight:700;-webkit-user-select:none;user-select:none;width:auto}.md-tooltip--inline:not(.md-tooltip--active){transform:translateY(.2rem) scale(.9)}.md-tooltip--inline .md-tooltip__inner{font-size:.5rem;padding:.2rem .4rem}[hidden]+.md-tooltip--inline{display:none}.focus-visible>.md-tooltip,.md-tooltip:target{outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{font-weight:400;outline:none;vertical-align:text-bottom;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}code .md-annotation{font-family:var(--md-code-font-family);font-size:inherit}.md-annotation:not([hidden]){display:inline-block;line-height:1.25}.md-annotation__index{border-radius:.01px;cursor:pointer;display:inline-block;margin-left:.4ch;margin-right:.4ch;outline:none;overflow:hidden;position:relative;-webkit-user-select:none;user-select:none;vertical-align:text-top;z-index:0}.md-annotation .md-annotation__index{transition:z-index .25s}@media screen{.md-annotation__index{width:2.2ch}[data-md-visible]>.md-annotation__index{animation:pulse 2s infinite}.md-annotation__index:before{background:var(--md-default-bg-color);-webkit-mask-image:var(--md-annotation-bg-icon);mask-image:var(--md-annotation-bg-icon)}.md-annotation__index:after,.md-annotation__index:before{content:"";height:2.2ch;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:-.1ch;width:2.2ch;z-index:-1}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);-webkit-mask-image:var(--md-annotation-icon);mask-image:var(--md-annotation-icon);transform:scale(1.0001);transition:background-color .25s,transform .25s}.md-tooltip--active+.md-annotation__index:after{transform:rotate(45deg)}.md-tooltip--active+.md-annotation__index:after,:hover>.md-annotation__index:after{background-color:var(--md-accent-fg-color)}}.md-tooltip--active+.md-annotation__index{animation-play-state:paused;transition-duration:0ms;z-index:2}.md-annotation__index [data-md-annotation-id]{display:inline-block}@media print{.md-annotation__index [data-md-annotation-id]{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);font-weight:700;padding:0 .6ch;white-space:nowrap}.md-annotation__index [data-md-annotation-id]:after{content:attr(data-md-annotation-id)}}.md-typeset .md-annotation-list{counter-reset:xxx;list-style:none}.md-typeset .md-annotation-list li{position:relative}[dir=ltr] .md-typeset .md-annotation-list li:before{left:-2.125em}[dir=rtl] .md-typeset .md-annotation-list li:before{right:-2.125em}.md-typeset .md-annotation-list li:before{background:var(--md-default-fg-color--lighter);border-radius:2ch;color:var(--md-default-bg-color);content:counter(xxx);counter-increment:xxx;font-size:.8875em;font-weight:700;height:2ch;line-height:1.25;min-width:2ch;padding:0 .6ch;position:absolute;text-align:center;top:.25em}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);cursor:pointer;display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:focus,.md-top:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:focus-within .md-version__list,.md-version:hover .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (hover:none),(pointer:coarse){.md-version:hover .md-version__list{animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:focus,.md-version__link:hover{color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .admonition,.md-typeset details{background-color:var(--md-admonition-bg-color);border:.075rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid;transition:box-shadow 125ms}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}.md-typeset .admonition:focus-within,.md-typeset details:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .admonition>*,.md-typeset details>*{box-sizing:border-box}.md-typeset .admonition .admonition,.md-typeset .admonition details,.md-typeset details .admonition,.md-typeset details details{margin-bottom:1em;margin-top:1em}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-left-width:.2rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-right-width:.2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset .admonition-title,.md-typeset summary{background-color:#448aff1a;border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}[dir=ltr] .md-typeset .admonition-title:before,[dir=ltr] .md-typeset summary:before{left:.6rem}[dir=rtl] .md-typeset .admonition-title:before,[dir=rtl] .md-typeset summary:before{right:.6rem}.md-typeset .admonition-title:before,.md-typeset summary:before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset .admonition-title code,.md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.md-typeset .admonition.note,.md-typeset details.note{border-color:#448aff}.md-typeset .admonition.note:focus-within,.md-typeset details.note:focus-within{box-shadow:0 0 0 .2rem #448aff1a}.md-typeset .note>.admonition-title,.md-typeset .note>summary{background-color:#448aff1a}.md-typeset .note>.admonition-title:before,.md-typeset .note>summary:before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset .note>.admonition-title:after,.md-typeset .note>summary:after{color:#448aff}.md-typeset .admonition.abstract,.md-typeset details.abstract{border-color:#00b0ff}.md-typeset .admonition.abstract:focus-within,.md-typeset details.abstract:focus-within{box-shadow:0 0 0 .2rem #00b0ff1a}.md-typeset .abstract>.admonition-title,.md-typeset .abstract>summary{background-color:#00b0ff1a}.md-typeset .abstract>.admonition-title:before,.md-typeset .abstract>summary:before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset .abstract>.admonition-title:after,.md-typeset .abstract>summary:after{color:#00b0ff}.md-typeset .admonition.info,.md-typeset details.info{border-color:#00b8d4}.md-typeset .admonition.info:focus-within,.md-typeset details.info:focus-within{box-shadow:0 0 0 .2rem #00b8d41a}.md-typeset .info>.admonition-title,.md-typeset .info>summary{background-color:#00b8d41a}.md-typeset .info>.admonition-title:before,.md-typeset .info>summary:before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset .info>.admonition-title:after,.md-typeset .info>summary:after{color:#00b8d4}.md-typeset .admonition.tip,.md-typeset details.tip{border-color:#00bfa5}.md-typeset .admonition.tip:focus-within,.md-typeset details.tip:focus-within{box-shadow:0 0 0 .2rem #00bfa51a}.md-typeset .tip>.admonition-title,.md-typeset .tip>summary{background-color:#00bfa51a}.md-typeset .tip>.admonition-title:before,.md-typeset .tip>summary:before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset .tip>.admonition-title:after,.md-typeset .tip>summary:after{color:#00bfa5}.md-typeset .admonition.success,.md-typeset details.success{border-color:#00c853}.md-typeset .admonition.success:focus-within,.md-typeset details.success:focus-within{box-shadow:0 0 0 .2rem #00c8531a}.md-typeset .success>.admonition-title,.md-typeset .success>summary{background-color:#00c8531a}.md-typeset .success>.admonition-title:before,.md-typeset .success>summary:before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset .success>.admonition-title:after,.md-typeset .success>summary:after{color:#00c853}.md-typeset .admonition.question,.md-typeset details.question{border-color:#64dd17}.md-typeset .admonition.question:focus-within,.md-typeset details.question:focus-within{box-shadow:0 0 0 .2rem #64dd171a}.md-typeset .question>.admonition-title,.md-typeset .question>summary{background-color:#64dd171a}.md-typeset .question>.admonition-title:before,.md-typeset .question>summary:before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset .question>.admonition-title:after,.md-typeset .question>summary:after{color:#64dd17}.md-typeset .admonition.warning,.md-typeset details.warning{border-color:#ff9100}.md-typeset .admonition.warning:focus-within,.md-typeset details.warning:focus-within{box-shadow:0 0 0 .2rem #ff91001a}.md-typeset .warning>.admonition-title,.md-typeset .warning>summary{background-color:#ff91001a}.md-typeset .warning>.admonition-title:before,.md-typeset .warning>summary:before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset .warning>.admonition-title:after,.md-typeset .warning>summary:after{color:#ff9100}.md-typeset .admonition.failure,.md-typeset details.failure{border-color:#ff5252}.md-typeset .admonition.failure:focus-within,.md-typeset details.failure:focus-within{box-shadow:0 0 0 .2rem #ff52521a}.md-typeset .failure>.admonition-title,.md-typeset .failure>summary{background-color:#ff52521a}.md-typeset .failure>.admonition-title:before,.md-typeset .failure>summary:before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset .failure>.admonition-title:after,.md-typeset .failure>summary:after{color:#ff5252}.md-typeset .admonition.danger,.md-typeset details.danger{border-color:#ff1744}.md-typeset .admonition.danger:focus-within,.md-typeset details.danger:focus-within{box-shadow:0 0 0 .2rem #ff17441a}.md-typeset .danger>.admonition-title,.md-typeset .danger>summary{background-color:#ff17441a}.md-typeset .danger>.admonition-title:before,.md-typeset .danger>summary:before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset .danger>.admonition-title:after,.md-typeset .danger>summary:after{color:#ff1744}.md-typeset .admonition.bug,.md-typeset details.bug{border-color:#f50057}.md-typeset .admonition.bug:focus-within,.md-typeset details.bug:focus-within{box-shadow:0 0 0 .2rem #f500571a}.md-typeset .bug>.admonition-title,.md-typeset .bug>summary{background-color:#f500571a}.md-typeset .bug>.admonition-title:before,.md-typeset .bug>summary:before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset .bug>.admonition-title:after,.md-typeset .bug>summary:after{color:#f50057}.md-typeset .admonition.example,.md-typeset details.example{border-color:#7c4dff}.md-typeset .admonition.example:focus-within,.md-typeset details.example:focus-within{box-shadow:0 0 0 .2rem #7c4dff1a}.md-typeset .example>.admonition-title,.md-typeset .example>summary{background-color:#7c4dff1a}.md-typeset .example>.admonition-title:before,.md-typeset .example>summary:before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset .example>.admonition-title:after,.md-typeset .example>summary:after{color:#7c4dff}.md-typeset .admonition.quote,.md-typeset details.quote{border-color:#9e9e9e}.md-typeset .admonition.quote:focus-within,.md-typeset details.quote:focus-within{box-shadow:0 0 0 .2rem #9e9e9e1a}.md-typeset .quote>.admonition-title,.md-typeset .quote>summary{background-color:#9e9e9e1a}.md-typeset .quote>.admonition-title:before,.md-typeset .quote>summary:before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset .quote>.admonition-title:after,.md-typeset .quote>summary:after{color:#9e9e9e}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:hover .footnote-backref,.md-typeset .footnote>ol>li:target .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before svg{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :hover>.headerlink,.md-typeset :target>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset .headerlink:hover,.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset h1:target,.md-typeset h2:target,.md-typeset h3:target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.984375em){.md-typeset div.arithmatex{margin:0 -.8rem}.md-typeset div.arithmatex>*{width:-webkit-min-content;width:min-content}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset div.arithmatex mjx-assistive-mml{height:0}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset del.critic,.md-typeset ins.critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{-webkit-box-decoration-break:clone;box-decoration-break:clone;color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem;overflow:hidden}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset .emojione,.md-typeset .gemoji,.md-typeset .twemoji{--md-icon-size:1.125em;display:inline-flex;height:var(--md-icon-size);vertical-align:text-top}.md-typeset .emojione svg,.md-typeset .gemoji svg,.md-typeset .twemoji svg{fill:currentcolor;max-height:100%;width:var(--md-icon-size)}.md-typeset .lg,.md-typeset .xl,.md-typeset .xxl,.md-typeset .xxxl{vertical-align:text-bottom}.md-typeset .middle{vertical-align:middle}.md-typeset .lg{--md-icon-size:1.5em}.md-typeset .xl{--md-icon-size:2.25em}.md-typeset .xxl{--md-icon-size:3em}.md-typeset .xxxl{--md-icon-size:4em}.highlight .o,.highlight .ow{color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight .cpf,.highlight .l,.highlight .s,.highlight .s1,.highlight .s2,.highlight .sb,.highlight .sc,.highlight .si,.highlight .ss{color:var(--md-code-hl-string-color)}.highlight .cp,.highlight .se,.highlight .sh,.highlight .sr,.highlight .sx{color:var(--md-code-hl-special-color)}.highlight .il,.highlight .m,.highlight .mb,.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:var(--md-code-hl-number-color)}.highlight .k,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr,.highlight .kt{color:var(--md-code-hl-keyword-color)}.highlight .kc,.highlight .n{color:var(--md-code-hl-name-color)}.highlight .bp,.highlight .nb,.highlight .no{color:var(--md-code-hl-constant-color)}.highlight .nc,.highlight .ne,.highlight .nf,.highlight .nn{color:var(--md-code-hl-function-color)}.highlight .nd,.highlight .ni,.highlight .nl,.highlight .nt{color:var(--md-code-hl-keyword-color)}.highlight .c,.highlight .c1,.highlight .ch,.highlight .cm,.highlight .cs,.highlight .sd{color:var(--md-code-hl-comment-color)}.highlight .na,.highlight .nv,.highlight .vc,.highlight .vg,.highlight .vi{color:var(--md-code-hl-variable-color)}.highlight .ge,.highlight .gh,.highlight .go,.highlight .gp,.highlight .gr,.highlight .gs,.highlight .gt,.highlight .gu{color:var(--md-code-hl-generic-color)}.highlight .gd,.highlight .gi{border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color--light);box-shadow:2px 0 0 0 var(--md-code-hl-color) inset;display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:sticky;-webkit-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying]{display:block}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable tbody,.highlighttable td{display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .linenodiv span[class]{padding-right:.5882352941em}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset .highlight+.result:after{clear:both;content:"";display:block}@media screen and (max-width:44.984375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:after,.md-typeset .keys kbd:before{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"⎇";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"⌘";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"⌃";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"◆";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"⌥";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"⇧";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"❖";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"⊞";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"↓";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"←";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"→";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"↑";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"⌫";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"⇤";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"⇪";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"⌧";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"☰";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"⌦";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"⏏";padding-right:.4em}.md-typeset .keys .key-end:before{content:"⤓";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"⎋";padding-right:.4em}.md-typeset .keys .key-home:before{content:"⤒";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"⎀";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"⇟";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"⇞";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"⎙";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"⇥";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"⌤";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"⏎";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-set>input.focus-visible~.tabbed-labels:before{background-color:var(--md-accent-fg-color)}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-default-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,background-color .25s,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid #0000;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-default-fg-color)}.md-typeset .tabbed-labels>label>[href]:first-child{color:inherit}.md-typeset .tabbed-labels--linked>label{padding:0}.md-typeset .tabbed-labels--linked>label>a{display:block;padding:.78125em 1.25em .625em}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,#0000);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,#0000);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.984375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-default-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-default-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color);--md-mermaid-sequence-actor-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actor-fg-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-actor-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-actor-line-color:var(--md-default-fg-color--lighter);--md-mermaid-sequence-actorman-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-actorman-line-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-box-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-box-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-label-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-label-fg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-loop-bg-color:var(--md-mermaid-node-bg-color);--md-mermaid-sequence-loop-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-loop-border-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-message-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-message-line-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-bg-color:var(--md-mermaid-label-bg-color);--md-mermaid-sequence-note-fg-color:var(--md-mermaid-edge-color);--md-mermaid-sequence-note-border-color:var(--md-mermaid-label-fg-color);--md-mermaid-sequence-number-bg-color:var(--md-mermaid-node-fg-color);--md-mermaid-sequence-number-fg-color:var(--md-accent-bg-color)}.mermaid{line-height:normal;margin:1em 0}.md-typeset .grid{grid-gap:.4rem;display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,16rem),1fr));margin:1em 0}.md-typeset .grid.cards>ol,.md-typeset .grid.cards>ul{display:contents}.md-typeset .grid.cards>ol>li,.md-typeset .grid.cards>ul>li,.md-typeset .grid>.card{border:.05rem solid var(--md-default-fg-color--lightest);border-radius:.1rem;display:block;margin:0;padding:.8rem;transition:border .25s,box-shadow .25s}.md-typeset .grid.cards>ol>li:focus-within,.md-typeset .grid.cards>ol>li:hover,.md-typeset .grid.cards>ul>li:focus-within,.md-typeset .grid.cards>ul>li:hover,.md-typeset .grid>.card:focus-within,.md-typeset .grid>.card:hover{border-color:#0000;box-shadow:var(--md-shadow-z2)}.md-typeset .grid.cards>ol>li>hr,.md-typeset .grid.cards>ul>li>hr,.md-typeset .grid>.card>hr{margin-bottom:1em;margin-top:1em}.md-typeset .grid.cards>ol>li>:first-child,.md-typeset .grid.cards>ul>li>:first-child,.md-typeset .grid>.card>:first-child{margin-top:0}.md-typeset .grid.cards>ol>li>:last-child,.md-typeset .grid.cards>ul>li>:last-child,.md-typeset .grid>.card>:last-child{margin-bottom:0}.md-typeset .grid>*,.md-typeset .grid>.admonition,.md-typeset .grid>.highlight>*,.md-typeset .grid>.highlighttable,.md-typeset .grid>.md-typeset details,.md-typeset .grid>details,.md-typeset .grid>pre{margin-bottom:0;margin-top:0}.md-typeset .grid>.highlight>pre:only-child,.md-typeset .grid>.highlight>pre>code,.md-typeset .grid>.highlighttable,.md-typeset .grid>.highlighttable>tbody,.md-typeset .grid>.highlighttable>tbody>tr,.md-typeset .grid>.highlighttable>tbody>tr>.code,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre,.md-typeset .grid>.highlighttable>tbody>tr>.code>.highlight>pre>code{height:100%}.md-typeset .grid>.tabbed-set{margin-bottom:0;margin-top:0}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{float:left}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=ltr] .md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}} \ No newline at end of file diff --git a/changelog/index.html b/changelog/index.html index 36404390..737c5c90 100644 --- a/changelog/index.html +++ b/changelog/index.html @@ -1 +1 @@ - Changelog - mkdocstrings-python

Changelog¤

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

1.7.5 - 2023-11-21¤

Compare with 1.7.4

Bug Fixes¤

  • Add missing translations (fallback theme) for ReadTheDocs (2fb6513 by Timothée Mazzucotelli). Issue #115

1.7.4 - 2023-11-12¤

Compare with 1.7.3

Bug Fixes¤

  • Make extension paths relative to config file (5035e92 by Waylan Limberg). PR #112, Co-authored-by: Timothée Mazzucotelli pawamoy@pm.me

Code Refactoring¤

  • Prepare for Griffe 0.37 (b5bb8a9 by Timothée Mazzucotelli).

1.7.3 - 2023-10-09¤

Compare with 1.7.2

Bug Fixes¤

  • Don't deepcopy the local config (1300d2c by Timothée Mazzucotelli).

1.7.2 - 2023-10-05¤

Compare with 1.7.1

Bug Fixes¤

  • Prevent alias resolution error when source-ordering members (67df10c by Timothée Mazzucotelli). Issue griffe#213

Code Refactoring¤

1.7.1 - 2023-09-28¤

Compare with 1.7.0

Bug Fixes¤

  • Stop propagation of annotation to next parameter in signature template (3a760ac by Timothée Mazzucotelli). Issue #110

Code Refactoring¤

  • Look into inherited members for __init__ methods when merging docstrings (b97d51f by Timothée Mazzucotelli). Issue #106

1.7.0 - 2023-09-14¤

Compare with 1.6.3

Features¤

  • Add option to unwrap Annotated types (53db04b by Timothée Mazzucotelli).

1.6.3 - 2023-09-11¤

Compare with 1.6.2

Bug Fixes¤

  • Make load_external_modules a global-only option (266f41f by Timothée Mazzucotelli). Issue #87
  • Never fail when trying to format code with Black (df24bbc by Timothée Mazzucotelli).

Code Refactoring¤

  • Wrap docstring section elements (list style) in code tags to prevent spell checker errors (1ae8dd8 by Timothée Mazzucotelli).

1.6.2 - 2023-09-05¤

Compare with 1.6.1

Bug Fixes¤

  • Don't render cross-ref spans when they're not enabled (eed51ee by Timothée Mazzucotelli).

1.6.1 - 2023-09-04¤

Compare with 1.6.0

Bug Fixes¤

  • Fix spacing for rendered named items in Yields, Receives and Returns sections (list style) (e12688e by Timothée Mazzucotelli).
  • Fix rendering Receives sections as lists (9ff7e68 by Timothée Mazzucotelli).

1.6.0 - 2023-08-27¤

Compare with 1.5.2

Features¤

  • Add doc-signature CSS class to separate signature code blocks (b6c648f by Timothée Mazzucotelli).

Code Refactoring¤

  • Add a format_attribute filter, preparing for cross-refs in attribute signatures (8f0ade2 by Timothée Mazzucotelli).

1.5.2 - 2023-08-25¤

Compare with 1.5.1

Bug Fixes¤

  • Regression in children template: fix condition for when members are specified (beeebff by Timothée Mazzucotelli). Issue #100
  • Prevent whitespace removal before highlight filter (c6f36c0 by Timothée Mazzucotelli).

Code Refactoring¤

  • Never show full object path in ToC entry (9aa758b by Timothée Mazzucotelli).
  • Sync templates with insiders, remove useless lines (38b317f by Timothée Mazzucotelli).

1.5.1 - 2023-08-24¤

Compare with 1.5.0

Code Refactoring¤

  • Never show full path in separate signature since it would appear in the heading already (9e02049 by Timothée Mazzucotelli).
  • Improve guessing whether an object is public (35eb811 by Timothée Mazzucotelli).
  • Always sort modules alphabetically as source order wouldn't make sense (70c81ce by Timothée Mazzucotelli).
  • Return anchors as a tuple, not a set, to preserve order (736a2b5 by Timothée Mazzucotelli). Related-to #mkdocstrings/crystal#6

1.5.0 - 2023-08-20¤

Compare with 1.4.0

Features¤

  • Add support for new Griffe docstring sections: modules, classes, and functions (methods) (d5337af by Timothée Mazzucotelli).

1.4.0 - 2023-08-18¤

Compare with 1.3.0

Features¤

  • Support new Griffe expressions (in v0.33) (9b8e1b1 by Timothée Mazzucotelli).

Code Refactoring¤

  • Deprecate crossref and multi_crossref filters (4fe3d20 by Timothée Mazzucotelli).

1.3.0 - 2023-08-06¤

Compare with 1.2.1

Dependencies¤

Features¤

  • Show parameter default values within the "list" section style too (55f08f3 by Antoine Dechaume). PR #92, Co-authored-by: Timothée Mazzucotelli pawamoy@pm.me

1.2.1 - 2023-07-20¤

Compare with 1.2.0

Bug Fixes¤

  • Fix members ordering when members are specified with a boolean (c69f9c3 by Timothée Mazzucotelli). Issue #89

1.2.0 - 2023-07-14¤

Compare with 1.1.2

Features¤

Bug Fixes¤

  • Don't show None as return annotation of class signatures (3d8724e by Timothée Mazzucotelli). Issue #85
  • Show labels in deterministic order (02619a8 by Oleh Prypin).

1.1.2 - 2023-06-04¤

Compare with 1.1.1

Code Refactoring¤

  • Keep headings style consistent (CSS) (92032e5 by Timothée Mazzucotelli).

1.1.1 - 2023-06-04¤

Compare with 1.1.0

Bug Fixes¤

  • Fix mkdocs and readthedocs themes support (14f18b2 by Timothée Mazzucotelli).

Code Refactoring¤

  • Improve display of paragraphs in docstring sections (439f5e6 by Timothée Mazzucotelli).

1.1.0 - 2023-05-25¤

Compare with 1.0.0

Features¤

  • Support custom templates through objects' extra data (8ff2b06 by Timothée Mazzucotelli). PR #70

1.0.0 - 2023-05-11¤

Compare with 0.10.1

Breaking changes¤

  • The signature of the format_signature filter has changed. If you override templates in your project to customize the output, make sure to update the following templates so that they use the new filter signature:

    • class.html
    • expression.html
    • function.html
    • signature.html

    You can see how to use the filter in this commit's changes: f686f4e4.

We take this as an opportunity to go out of beta and bump the version to 1.0.0. This will allow users to rely on semantic versioning.

Bug Fixes¤

  • Bring compatibility with insiders signature crossrefs feature (f686f4e by Timothée Mazzucotelli).

0.10.1 - 2023-05-07¤

Compare with 0.10.0

Bug Fixes¤

  • Format signatures with full-path names (685512d by Timothée Mazzucotelli).

0.10.0 - 2023-05-07¤

Compare with 0.9.0

Features¤

Bug Fixes¤

  • Make admonitions open by default (79cd153 by Timothée Mazzucotelli). Issue #22

Code Refactoring¤

  • Match documented behavior for filtering (all members, list, none) (c7f70c3 by Timothée Mazzucotelli).
  • Switch to an info level log for when black's not installed (f593bb0 by Faster Speeding).
  • Return anchors as a set (e2b820c by Timothée Mazzucotelli).

0.9.0 - 2023-04-03¤

Compare with 0.8.3

Features¤

Bug Fixes¤

  • Prevent alias resolution error when searching for anchors (a190e2c by Timothée Mazzucotelli). Issue #64

Code Refactoring¤

  • Support Griffe 0.26 (075735c by Timothée Mazzucotelli).
  • Log (debug) unresolved aliases (9164742 by Timothée Mazzucotelli).

0.8.3 - 2023-01-04¤

Compare with 0.8.2

Code Refactoring¤

  • Change "unresolved aliases" log level to DEBUG (dccb818 by Timothée Mazzucotelli).

0.8.2 - 2022-11-19¤

Compare with 0.8.1

Bug Fixes¤

  • Fix base directory used to expand globs (34cfa4b by Florian Hofer). PR #45

0.8.1 - 2022-11-19¤

Compare with 0.8.0

Bug Fixes¤

0.8.0 - 2022-11-13¤

Compare with 0.7.1

Features¤

Code Refactoring¤

  • Support Griffe 0.24 (3b9f701 by Timothée Mazzucotelli).

0.7.1 - 2022-06-12¤

Compare with 0.7.0

Bug Fixes¤

  • Fix rendering of / in signatures (3e927e4 by Timothée Mazzucotelli). Issue #25

0.7.0 - 2022-05-28¤

Compare with 0.6.6

Packaging / Dependencies¤

  • Depend on mkdocstrings 0.19 (b6a9a47 by Timothée Mazzucotelli).

Features¤

Bug Fixes¤

  • Fix CSS class on labels (312a709 by Timothée Mazzucotelli).
  • Fix categories rendering (6407cf4 by Timothée Mazzucotelli). Issue #14

Code Refactoring¤

  • Disable show_submodules by default (480d0c3 by Timothée Mazzucotelli).
  • Merge default configuration options in handler (347ce76 by Timothée Mazzucotelli).
  • Reduce number of template debug logs (8fed314 by Timothée Mazzucotelli).
  • Respect show_root_full_path for ToC entries (hidden headings) (8f4c853 by Timothée Mazzucotelli).
  • Bring consistency on headings style (59104c4 by Timothée Mazzucotelli).
  • Stop using deprecated base classes (d5ea1c5 by Timothée Mazzucotelli).

0.6.6 - 2022-03-06¤

Compare with 0.6.5

Code Refactoring¤

  • Always hide self and cls parameters (7f579d1 by Timothée Mazzucotelli). Issue #7
  • Use pycon for examples code blocks (6545900 by Timothée Mazzucotelli).

0.6.5 - 2022-02-24¤

Compare with 0.6.4

Bug Fixes¤

  • Don't escape signatures return annotations (ac54bfc by Timothée Mazzucotelli). Issue #6

0.6.4 - 2022-02-22¤

Compare with 0.6.3

Bug Fixes¤

  • Fix rendering of signature return annotation (b92ba3b by Timothée Mazzucotelli). Issue #4

0.6.3 - 2022-02-20¤

Compare with 0.6.2

Bug Fixes¤

0.6.2 - 2022-02-17¤

Compare with 0.6.1

Bug Fixes¤

  • Catch alias resolution errors (b734dd0 by Timothée Mazzucotelli).

0.6.1 - 2022-02-17¤

Compare with 0.6.0

Bug Fixes¤

  • Don't pop from fallback config (bde32af by Timothée Mazzucotelli).
  • Fix rendering init method source when merged into class (4a20aea by Timothée Mazzucotelli).

0.6.0 - 2022-02-13¤

Compare with 0.5.4

Features¤

  • Add option to merge __init__ methods' docstrings into their classes' docstrings (1b4d1c0 by Timothée Mazzucotelli).
  • Support separate attribute signature (e962b88 by Timothée Mazzucotelli).

Bug Fixes¤

  • Restore full cross-refs paths on hover (ac11970 by Timothée Mazzucotelli).
  • Fix rendering of labels (52919c5 by Timothée Mazzucotelli).

Code Refactoring¤

  • Don't add trailing parentheses in functions heading when separate signature (885696e by Timothée Mazzucotelli).
  • Use more explicit template debug messages (f2122d7 by Timothée Mazzucotelli).

0.5.4 - 2022-02-13¤

Compare with 0.5.3

Bug Fixes¤

  • Don't load additional modules during fallback (69b8e25 by Timothée Mazzucotelli).

0.5.3 - 2022-02-08¤

Compare with 0.5.2

Bug Fixes¤

  • Allow passing null as docstring style (f526816 by Timothée Mazzucotelli). Issue #2

0.5.2 - 2022-02-05¤

Compare with 0.5.1

Dependencies¤

  • Require at least mkdocstrings 0.18 (7abdda4 by Timothée Mazzucotelli).

0.5.1 - 2022-02-03¤

Compare with 0.5.0

Dependencies¤

  • Depend on Griffe >= 0.11.1 (1303557 by Timothée Mazzucotelli).

Code Refactoring¤

  • Move handler into its own module (b787e78 by Timothée Mazzucotelli).

0.5.0 - 2022-02-03¤

Compare with 0.4.1

Features¤

  • Allow changing docstring style of an object (39240c1 by Timothée Mazzucotelli).

Bug Fixes¤

  • Warn if Black is not installed when formatting signature (b848277 by Timothée Mazzucotelli).
  • Fix missing default for docstring_section_style option (774988e by Timothée Mazzucotelli).

Code Refactoring¤

  • Change to new way of stripping paragraphs (33d4594 by Timothée Mazzucotelli).

0.4.1 - 2022-02-01¤

Compare with 0.4.0

Bug Fixes¤

  • Fix docstring admonitions rendering (a24ae2e by Timothée Mazzucotelli).

0.4.0 - 2022-02-01¤

Compare with 0.3.0

Code Refactoring¤

  • Use the new mkdocstrings_handlers namespace (23c9023 by Timothée Mazzucotelli).

0.3.0 - 2022-01-14¤

Compare with 0.2.0

Features¤

  • Support griffe 0.10 (28061de by Timothée Mazzucotelli).

Dependencies¤

  • Require griffe 0.10 (cfbd7bb by Timothée Mazzucotelli).

Code Refactoring¤

  • Use new logger patching utility (4cdb292 by Timothée Mazzucotelli).

0.2.0 - 2021-12-28¤

Compare with 0.1.0

Dependencies¤

  • Depend on griffe >= 0.7.1 (34f7ebd by Timothée Mazzucotelli).
  • Upgrade griffe, no upper bound (8f0aa42 by Timothée Mazzucotelli).

Features¤

  • Add show_signature rendering option (0f07c2e by Will Da Silva).

Bug Fixes¤

  • Fix templates for named docstring elements (47868a1 by Timothée Mazzucotelli).

0.1.0 - 2021-12-19¤

Compare with first commit

Features¤

  • Implement handler and add templates (dbb580a by Timothée Mazzucotelli).

Bug Fixes¤

  • Fix separate signature feature (da6e81c by Timothée Mazzucotelli).
  • Fix signature template (parameters annotations) (b34ead0 by Timothée Mazzucotelli).
  • Only show source when present (c270d68 by Timothée Mazzucotelli).

Code Refactoring¤

  • Return all known anchors (9bbfe14 by Timothée Mazzucotelli).
  • Update for griffe 0.4.0 (831aabb by Timothée Mazzucotelli).
\ No newline at end of file + Changelog - mkdocstrings-python

Changelog¤

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

1.8.0 - 2024-01-08¤

Compare with 1.7.5

Features¤

1.7.5 - 2023-11-21¤

Compare with 1.7.4

Bug Fixes¤

  • Add missing translations (fallback theme) for ReadTheDocs (2fb6513 by Timothée Mazzucotelli). Issue #115

1.7.4 - 2023-11-12¤

Compare with 1.7.3

Bug Fixes¤

  • Make extension paths relative to config file (5035e92 by Waylan Limberg). PR #112, Co-authored-by: Timothée Mazzucotelli pawamoy@pm.me

Code Refactoring¤

  • Prepare for Griffe 0.37 (b5bb8a9 by Timothée Mazzucotelli).

1.7.3 - 2023-10-09¤

Compare with 1.7.2

Bug Fixes¤

  • Don't deepcopy the local config (1300d2c by Timothée Mazzucotelli).

1.7.2 - 2023-10-05¤

Compare with 1.7.1

Bug Fixes¤

  • Prevent alias resolution error when source-ordering members (67df10c by Timothée Mazzucotelli). Issue griffe#213

Code Refactoring¤

1.7.1 - 2023-09-28¤

Compare with 1.7.0

Bug Fixes¤

  • Stop propagation of annotation to next parameter in signature template (3a760ac by Timothée Mazzucotelli). Issue #110

Code Refactoring¤

  • Look into inherited members for __init__ methods when merging docstrings (b97d51f by Timothée Mazzucotelli). Issue #106

1.7.0 - 2023-09-14¤

Compare with 1.6.3

Features¤

  • Add option to unwrap Annotated types (53db04b by Timothée Mazzucotelli).

1.6.3 - 2023-09-11¤

Compare with 1.6.2

Bug Fixes¤

  • Make load_external_modules a global-only option (266f41f by Timothée Mazzucotelli). Issue #87
  • Never fail when trying to format code with Black (df24bbc by Timothée Mazzucotelli).

Code Refactoring¤

  • Wrap docstring section elements (list style) in code tags to prevent spell checker errors (1ae8dd8 by Timothée Mazzucotelli).

1.6.2 - 2023-09-05¤

Compare with 1.6.1

Bug Fixes¤

  • Don't render cross-ref spans when they're not enabled (eed51ee by Timothée Mazzucotelli).

1.6.1 - 2023-09-04¤

Compare with 1.6.0

Bug Fixes¤

  • Fix spacing for rendered named items in Yields, Receives and Returns sections (list style) (e12688e by Timothée Mazzucotelli).
  • Fix rendering Receives sections as lists (9ff7e68 by Timothée Mazzucotelli).

1.6.0 - 2023-08-27¤

Compare with 1.5.2

Features¤

  • Add doc-signature CSS class to separate signature code blocks (b6c648f by Timothée Mazzucotelli).

Code Refactoring¤

  • Add a format_attribute filter, preparing for cross-refs in attribute signatures (8f0ade2 by Timothée Mazzucotelli).

1.5.2 - 2023-08-25¤

Compare with 1.5.1

Bug Fixes¤

  • Regression in children template: fix condition for when members are specified (beeebff by Timothée Mazzucotelli). Issue #100
  • Prevent whitespace removal before highlight filter (c6f36c0 by Timothée Mazzucotelli).

Code Refactoring¤

  • Never show full object path in ToC entry (9aa758b by Timothée Mazzucotelli).
  • Sync templates with insiders, remove useless lines (38b317f by Timothée Mazzucotelli).

1.5.1 - 2023-08-24¤

Compare with 1.5.0

Code Refactoring¤

  • Never show full path in separate signature since it would appear in the heading already (9e02049 by Timothée Mazzucotelli).
  • Improve guessing whether an object is public (35eb811 by Timothée Mazzucotelli).
  • Always sort modules alphabetically as source order wouldn't make sense (70c81ce by Timothée Mazzucotelli).
  • Return anchors as a tuple, not a set, to preserve order (736a2b5 by Timothée Mazzucotelli). Related-to #mkdocstrings/crystal#6

1.5.0 - 2023-08-20¤

Compare with 1.4.0

Features¤

  • Add support for new Griffe docstring sections: modules, classes, and functions (methods) (d5337af by Timothée Mazzucotelli).

1.4.0 - 2023-08-18¤

Compare with 1.3.0

Features¤

  • Support new Griffe expressions (in v0.33) (9b8e1b1 by Timothée Mazzucotelli).

Code Refactoring¤

  • Deprecate crossref and multi_crossref filters (4fe3d20 by Timothée Mazzucotelli).

1.3.0 - 2023-08-06¤

Compare with 1.2.1

Dependencies¤

Features¤

  • Show parameter default values within the "list" section style too (55f08f3 by Antoine Dechaume). PR #92, Co-authored-by: Timothée Mazzucotelli pawamoy@pm.me

1.2.1 - 2023-07-20¤

Compare with 1.2.0

Bug Fixes¤

  • Fix members ordering when members are specified with a boolean (c69f9c3 by Timothée Mazzucotelli). Issue #89

1.2.0 - 2023-07-14¤

Compare with 1.1.2

Features¤

Bug Fixes¤

  • Don't show None as return annotation of class signatures (3d8724e by Timothée Mazzucotelli). Issue #85
  • Show labels in deterministic order (02619a8 by Oleh Prypin).

1.1.2 - 2023-06-04¤

Compare with 1.1.1

Code Refactoring¤

  • Keep headings style consistent (CSS) (92032e5 by Timothée Mazzucotelli).

1.1.1 - 2023-06-04¤

Compare with 1.1.0

Bug Fixes¤

  • Fix mkdocs and readthedocs themes support (14f18b2 by Timothée Mazzucotelli).

Code Refactoring¤

  • Improve display of paragraphs in docstring sections (439f5e6 by Timothée Mazzucotelli).

1.1.0 - 2023-05-25¤

Compare with 1.0.0

Features¤

  • Support custom templates through objects' extra data (8ff2b06 by Timothée Mazzucotelli). PR #70

1.0.0 - 2023-05-11¤

Compare with 0.10.1

Breaking changes¤

  • The signature of the format_signature filter has changed. If you override templates in your project to customize the output, make sure to update the following templates so that they use the new filter signature:

    • class.html
    • expression.html
    • function.html
    • signature.html

    You can see how to use the filter in this commit's changes: f686f4e4.

We take this as an opportunity to go out of beta and bump the version to 1.0.0. This will allow users to rely on semantic versioning.

Bug Fixes¤

  • Bring compatibility with insiders signature crossrefs feature (f686f4e by Timothée Mazzucotelli).

0.10.1 - 2023-05-07¤

Compare with 0.10.0

Bug Fixes¤

  • Format signatures with full-path names (685512d by Timothée Mazzucotelli).

0.10.0 - 2023-05-07¤

Compare with 0.9.0

Features¤

Bug Fixes¤

  • Make admonitions open by default (79cd153 by Timothée Mazzucotelli). Issue #22

Code Refactoring¤

  • Match documented behavior for filtering (all members, list, none) (c7f70c3 by Timothée Mazzucotelli).
  • Switch to an info level log for when black's not installed (f593bb0 by Faster Speeding).
  • Return anchors as a set (e2b820c by Timothée Mazzucotelli).

0.9.0 - 2023-04-03¤

Compare with 0.8.3

Features¤

Bug Fixes¤

  • Prevent alias resolution error when searching for anchors (a190e2c by Timothée Mazzucotelli). Issue #64

Code Refactoring¤

  • Support Griffe 0.26 (075735c by Timothée Mazzucotelli).
  • Log (debug) unresolved aliases (9164742 by Timothée Mazzucotelli).

0.8.3 - 2023-01-04¤

Compare with 0.8.2

Code Refactoring¤

  • Change "unresolved aliases" log level to DEBUG (dccb818 by Timothée Mazzucotelli).

0.8.2 - 2022-11-19¤

Compare with 0.8.1

Bug Fixes¤

  • Fix base directory used to expand globs (34cfa4b by Florian Hofer). PR #45

0.8.1 - 2022-11-19¤

Compare with 0.8.0

Bug Fixes¤

0.8.0 - 2022-11-13¤

Compare with 0.7.1

Features¤

Code Refactoring¤

  • Support Griffe 0.24 (3b9f701 by Timothée Mazzucotelli).

0.7.1 - 2022-06-12¤

Compare with 0.7.0

Bug Fixes¤

  • Fix rendering of / in signatures (3e927e4 by Timothée Mazzucotelli). Issue #25

0.7.0 - 2022-05-28¤

Compare with 0.6.6

Packaging / Dependencies¤

  • Depend on mkdocstrings 0.19 (b6a9a47 by Timothée Mazzucotelli).

Features¤

Bug Fixes¤

  • Fix CSS class on labels (312a709 by Timothée Mazzucotelli).
  • Fix categories rendering (6407cf4 by Timothée Mazzucotelli). Issue #14

Code Refactoring¤

  • Disable show_submodules by default (480d0c3 by Timothée Mazzucotelli).
  • Merge default configuration options in handler (347ce76 by Timothée Mazzucotelli).
  • Reduce number of template debug logs (8fed314 by Timothée Mazzucotelli).
  • Respect show_root_full_path for ToC entries (hidden headings) (8f4c853 by Timothée Mazzucotelli).
  • Bring consistency on headings style (59104c4 by Timothée Mazzucotelli).
  • Stop using deprecated base classes (d5ea1c5 by Timothée Mazzucotelli).

0.6.6 - 2022-03-06¤

Compare with 0.6.5

Code Refactoring¤

  • Always hide self and cls parameters (7f579d1 by Timothée Mazzucotelli). Issue #7
  • Use pycon for examples code blocks (6545900 by Timothée Mazzucotelli).

0.6.5 - 2022-02-24¤

Compare with 0.6.4

Bug Fixes¤

  • Don't escape signatures return annotations (ac54bfc by Timothée Mazzucotelli). Issue #6

0.6.4 - 2022-02-22¤

Compare with 0.6.3

Bug Fixes¤

  • Fix rendering of signature return annotation (b92ba3b by Timothée Mazzucotelli). Issue #4

0.6.3 - 2022-02-20¤

Compare with 0.6.2

Bug Fixes¤

0.6.2 - 2022-02-17¤

Compare with 0.6.1

Bug Fixes¤

  • Catch alias resolution errors (b734dd0 by Timothée Mazzucotelli).

0.6.1 - 2022-02-17¤

Compare with 0.6.0

Bug Fixes¤

  • Don't pop from fallback config (bde32af by Timothée Mazzucotelli).
  • Fix rendering init method source when merged into class (4a20aea by Timothée Mazzucotelli).

0.6.0 - 2022-02-13¤

Compare with 0.5.4

Features¤

  • Add option to merge __init__ methods' docstrings into their classes' docstrings (1b4d1c0 by Timothée Mazzucotelli).
  • Support separate attribute signature (e962b88 by Timothée Mazzucotelli).

Bug Fixes¤

  • Restore full cross-refs paths on hover (ac11970 by Timothée Mazzucotelli).
  • Fix rendering of labels (52919c5 by Timothée Mazzucotelli).

Code Refactoring¤

  • Don't add trailing parentheses in functions heading when separate signature (885696e by Timothée Mazzucotelli).
  • Use more explicit template debug messages (f2122d7 by Timothée Mazzucotelli).

0.5.4 - 2022-02-13¤

Compare with 0.5.3

Bug Fixes¤

  • Don't load additional modules during fallback (69b8e25 by Timothée Mazzucotelli).

0.5.3 - 2022-02-08¤

Compare with 0.5.2

Bug Fixes¤

  • Allow passing null as docstring style (f526816 by Timothée Mazzucotelli). Issue #2

0.5.2 - 2022-02-05¤

Compare with 0.5.1

Dependencies¤

  • Require at least mkdocstrings 0.18 (7abdda4 by Timothée Mazzucotelli).

0.5.1 - 2022-02-03¤

Compare with 0.5.0

Dependencies¤

  • Depend on Griffe >= 0.11.1 (1303557 by Timothée Mazzucotelli).

Code Refactoring¤

  • Move handler into its own module (b787e78 by Timothée Mazzucotelli).

0.5.0 - 2022-02-03¤

Compare with 0.4.1

Features¤

  • Allow changing docstring style of an object (39240c1 by Timothée Mazzucotelli).

Bug Fixes¤

  • Warn if Black is not installed when formatting signature (b848277 by Timothée Mazzucotelli).
  • Fix missing default for docstring_section_style option (774988e by Timothée Mazzucotelli).

Code Refactoring¤

  • Change to new way of stripping paragraphs (33d4594 by Timothée Mazzucotelli).

0.4.1 - 2022-02-01¤

Compare with 0.4.0

Bug Fixes¤

  • Fix docstring admonitions rendering (a24ae2e by Timothée Mazzucotelli).

0.4.0 - 2022-02-01¤

Compare with 0.3.0

Code Refactoring¤

  • Use the new mkdocstrings_handlers namespace (23c9023 by Timothée Mazzucotelli).

0.3.0 - 2022-01-14¤

Compare with 0.2.0

Features¤

  • Support griffe 0.10 (28061de by Timothée Mazzucotelli).

Dependencies¤

  • Require griffe 0.10 (cfbd7bb by Timothée Mazzucotelli).

Code Refactoring¤

  • Use new logger patching utility (4cdb292 by Timothée Mazzucotelli).

0.2.0 - 2021-12-28¤

Compare with 0.1.0

Dependencies¤

  • Depend on griffe >= 0.7.1 (34f7ebd by Timothée Mazzucotelli).
  • Upgrade griffe, no upper bound (8f0aa42 by Timothée Mazzucotelli).

Features¤

  • Add show_signature rendering option (0f07c2e by Will Da Silva).

Bug Fixes¤

  • Fix templates for named docstring elements (47868a1 by Timothée Mazzucotelli).

0.1.0 - 2021-12-19¤

Compare with first commit

Features¤

  • Implement handler and add templates (dbb580a by Timothée Mazzucotelli).

Bug Fixes¤

  • Fix separate signature feature (da6e81c by Timothée Mazzucotelli).
  • Fix signature template (parameters annotations) (b34ead0 by Timothée Mazzucotelli).
  • Only show source when present (c270d68 by Timothée Mazzucotelli).

Code Refactoring¤

  • Return all known anchors (9bbfe14 by Timothée Mazzucotelli).
  • Update for griffe 0.4.0 (831aabb by Timothée Mazzucotelli).
\ No newline at end of file diff --git a/code_of_conduct/index.html b/code_of_conduct/index.html index 87791fc8..9aba4f7b 100644 --- a/code_of_conduct/index.html +++ b/code_of_conduct/index.html @@ -1 +1 @@ - Code of Conduct - mkdocstrings-python

Contributor Covenant Code of Conduct¤

Our Pledge¤

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

Our Standards¤

Examples of behavior that contributes to a positive environment for our community include:

  • Demonstrating empathy and kindness toward other people
  • Being respectful of differing opinions, viewpoints, and experiences
  • Giving and gracefully accepting constructive feedback
  • Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
  • Focusing on what is best not just for us as individuals, but for the overall community

Examples of unacceptable behavior include:

  • The use of sexualized language or imagery, and sexual attention or advances of any kind
  • Trolling, insulting or derogatory comments, and personal or political attacks
  • Public or private harassment
  • Publishing others' private information, such as a physical or email address, without their explicit permission
  • Other conduct which could reasonably be considered inappropriate in a professional setting

Enforcement Responsibilities¤

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

Scope¤

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

Enforcement¤

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at pawamoy@pm.me. All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

Enforcement Guidelines¤

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

1. Correction¤

Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

2. Warning¤

Community Impact: A violation through a single incident or series of actions.

Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

3. Temporary Ban¤

Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

4. Permanent Ban¤

Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

Consequence: A permanent ban from any sort of public interaction within the community.

Attribution¤

This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.

Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

\ No newline at end of file + Code of Conduct - mkdocstrings-python

Contributor Covenant Code of Conduct¤

Our Pledge¤

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

Our Standards¤

Examples of behavior that contributes to a positive environment for our community include:

  • Demonstrating empathy and kindness toward other people
  • Being respectful of differing opinions, viewpoints, and experiences
  • Giving and gracefully accepting constructive feedback
  • Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
  • Focusing on what is best not just for us as individuals, but for the overall community

Examples of unacceptable behavior include:

  • The use of sexualized language or imagery, and sexual attention or advances of any kind
  • Trolling, insulting or derogatory comments, and personal or political attacks
  • Public or private harassment
  • Publishing others' private information, such as a physical or email address, without their explicit permission
  • Other conduct which could reasonably be considered inappropriate in a professional setting

Enforcement Responsibilities¤

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

Scope¤

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

Enforcement¤

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at pawamoy@pm.me. All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

Enforcement Guidelines¤

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

1. Correction¤

Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

2. Warning¤

Community Impact: A violation through a single incident or series of actions.

Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

3. Temporary Ban¤

Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

4. Permanent Ban¤

Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

Consequence: A permanent ban from any sort of public interaction within the community.

Attribution¤

This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.

Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

\ No newline at end of file diff --git a/contributing/index.html b/contributing/index.html index ada6dccb..9be7ca0d 100644 --- a/contributing/index.html +++ b/contributing/index.html @@ -1,4 +1,4 @@ - Contributing - mkdocstrings-python

Contributing¤

Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given.

Environment setup¤

Nothing easier!

Fork and clone the repository, then:

cd python
+ Contributing - mkdocstrings-python      

Contributing¤

Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given.

Environment setup¤

Nothing easier!

Fork and clone the repository, then:

cd python
 make setup
 

Note

If it fails for some reason, you'll need to install PDM manually.

You can install it with:

python3 -m pip install --user pipx
 pipx install pdm
@@ -13,4 +13,4 @@
 git commit --fixup=SHA
 

Once all the changes are approved, you can squash your commits:

git rebase -i --autosquash main
 

And force-push:

git push -f
-

If this seems all too complicated, you can push or force-push each new commit, and we will squash them ourselves if needed, before merging.

\ No newline at end of file +

If this seems all too complicated, you can push or force-push each new commit, and we will squash them ourselves if needed, before merging.

\ No newline at end of file diff --git a/credits/index.html b/credits/index.html index 6c233763..8ab73434 100644 --- a/credits/index.html +++ b/credits/index.html @@ -1 +1 @@ - Credits - mkdocstrings-python

Credits¤

These projects were used to build mkdocstrings-python. Thank you!

python | pdm | copier-pdm

Runtime dependencies¤

Project Summary Version (accepted) Version (last resolved) License
click Composable command line interface toolkit >=7.0 8.1.7 BSD-3-Clause
colorama Cross-platform colored terminal text. >=0.4 0.4.6 BSD License
ghp-import Copy your docs directly to the gh-pages branch. >=1.0 2.1.0 Apache Software License
griffe Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API. >=0.37 0.37.0 ISC
importlib-metadata Read metadata from Python packages >=4.6; python_version < "3.10" 6.8.0 ?
jinja2 A very fast and expressive template engine. >=2.11.1 3.1.2 BSD-3-Clause
markdown Python implementation of John Gruber's Markdown. >=3.3 3.5.1 BSD License
markupsafe Safely add untrusted strings to HTML/XML markup. >=1.1 2.1.3 BSD-3-Clause
mergedeep A deep merge function for 🐍. >=1.3.4 1.3.4 MIT License
mkdocs Project documentation with Markdown. >=1.2 1.5.3 BSD License
mkdocs-autorefs Automatically link across pages in MkDocs. >=0.3.1 0.5.0 ISC
mkdocstrings Automatic documentation from sources, for MkDocs. >=0.20 0.23.0 ISC
packaging Core utilities for Python packages >=20.5 23.2 BSD License
pathspec Utility library for gitignore style pattern matching of file paths. >=0.11.1 0.11.2 Mozilla Public License 2.0 (MPL 2.0)
platformdirs A small Python package for determining appropriate platform-specific dirs, e.g. a "user data dir". >=2.2.0 4.0.0 MIT License
pymdown-extensions Extension pack for Python Markdown. >=6.3 10.4 MIT License
python-dateutil Extensions to the standard Python datetime module >=2.8.1 2.8.2 Dual License
pyyaml YAML parser and emitter for Python 6.0.1 MIT
pyyaml-env-tag A custom YAML tag for referencing environment variables in YAML files. >=0.1 0.1 MIT License
six Python 2 and 3 compatibility utilities >=1.5 1.16.0 MIT
typing-extensions Backported and Experimental Type Hints for Python 3.8+ >=4.1; python_version < "3.10" 4.8.0 Python Software Foundation License
watchdog Filesystem events monitoring >=2.0 3.0.0 Apache License 2.0
zipp Backport of pathlib-compatible object wrapper for zip files >=0.5 3.17.0 ?

Development dependencies¤

Project Summary Version (accepted) Version (last resolved) License
ansimarkup Produce colored terminal text with an xml-like markup ~=1.4 1.5.0 Revised BSD License
appdirs A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". >=1.4 1.4.4 MIT
babel Internationalization utilities ~=2.10 2.13.1 BSD-3-Clause
black The uncompromising code formatter. >=23.9 23.11.0 MIT
blacken-docs Run Black on Python code blocks in documentation files. >=1.16 1.16.0 MIT
certifi Python package for providing Mozilla's CA Bundle. >=2017.4.17 2023.7.22 MPL-2.0
charset-normalizer The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. <4,>=2 3.3.2 MIT
click Composable command line interface toolkit >=8.0.0 8.1.7 BSD-3-Clause
colorama Cross-platform colored terminal text. ; platform_system == "Windows" 0.4.6 BSD License
coverage Code coverage measurement for Python [toml]>=5.2.1 7.3.2 Apache-2.0
csscompressor A python port of YUI CSS Compressor >=0.9.5 0.9.5 BSD
dparse A parser for Python dependency files >=0.6.2 0.6.3 MIT license
duty A simple task runner. >=0.10 1.1.0 ISC
exceptiongroup Backport of PEP 654 (exception groups) >=1.0.0rc8; python_version < "3.11" 1.1.3 ?
execnet execnet: rapid multi-Python deployment >=1.1 2.0.2 MIT License
failprint Run a command, print its output only if it fails. !=1.0.0,>=0.11 1.0.2 ISC
ghp-import Copy your docs directly to the gh-pages branch. >=1.0 2.1.0 Apache Software License
git-changelog Automatic Changelog generator using Jinja2 templates. >=2.3 2.4.0 ISC
gitdb Git Object Database <5,>=4.0.1 4.0.11 BSD License
gitpython GitPython is a Python library used to interact with Git repositories 3.1.40 BSD
htmlmin2 An HTML Minifier >=0.1.13 0.1.13 BSD
idna Internationalized Domain Names in Applications (IDNA) <4,>=2.5 3.4 BSD License
importlib-metadata Read metadata from Python packages >=4.3; python_version < "3.10" 6.8.0 ?
iniconfig brain-dead simple config-ini parsing 2.0.0 MIT License
jinja2 A very fast and expressive template engine. <4,>=2.11 3.1.2 BSD-3-Clause
jsmin JavaScript minifier. >=3.0.1 3.0.1 MIT License
markdown Python implementation of John Gruber's Markdown. <4.0.0,>=3.3.3 3.5.1 BSD License
markdown-callouts Markdown extension: a classier syntax for admonitions >=0.3 0.3.0 MIT
markdown-exec Utilities to execute code blocks in Markdown files. >=1.7 1.7.0.1.0.1 ISC
markupsafe Safely add untrusted strings to HTML/XML markup. >=2.0 2.1.3 BSD-3-Clause
mergedeep A deep merge function for 🐍. >=1.3.4 1.3.4 MIT License
mkdocs Project documentation with Markdown. >=1.5 1.5.3 BSD License
mkdocs-coverage MkDocs plugin to integrate your coverage HTML report into your site. >=1.0 1.0.0 ISC
mkdocs-gen-files MkDocs plugin to programmatically generate documentation pages during the build >=0.5 0.5.0 MIT License
mkdocs-git-committers-plugin-2 An MkDocs plugin to create a list of contributors on the page. The git-committers plugin will seed the template context with a list of GitHub or GitLab committers and other useful GIT info such as last modified date >=1.2 2.2.2 MIT
mkdocs-literate-nav MkDocs plugin to specify the navigation in Markdown instead of YAML >=0.6 0.6.1 MIT License
mkdocs-material Documentation that simply works >=9.4 9.4.8+insiders.4.43.0 MIT License
mkdocs-material-extensions Extension pack for Python Markdown and MkDocs Material. ~=1.3 1.3 MIT License
mkdocs-minify-plugin An MkDocs plugin to minify HTML, JS or CSS files prior to being written to disk >=0.7 0.7.1 MIT
mypy Optional static typing for Python >=1.5 1.7.0 MIT
mypy-extensions Type system extensions for programs checked with the mypy type checker. >=0.4.3 1.0.0 MIT License
packaging Core utilities for Python packages >=22.0 23.2 BSD License
paginate Divides large result sets into pages for easier browsing ~=0.5 0.5.6 MIT
pathspec Utility library for gitignore style pattern matching of file paths. >=0.9.0 0.11.2 Mozilla Public License 2.0 (MPL 2.0)
platformdirs A small Python package for determining appropriate platform-specific dirs, e.g. a "user data dir". >=2 4.0.0 MIT License
pluggy plugin and hook calling mechanisms for python <2.0,>=0.12 1.3.0 MIT
ptyprocess Run a subprocess in a pseudo terminal ~=0.6; sys_platform != "win32" 0.7.0 ISC License (ISCL)
pygments Pygments is a syntax highlighting package written in Python. ~=2.16 2.16.1 BSD-2-Clause
pymdown-extensions Extension pack for Python Markdown. >=9 10.4 MIT License
pytest pytest: simple powerful testing with Python >=7.4 7.4.3 MIT
pytest-cov Pytest plugin for measuring coverage. >=4.1 4.1.0 MIT
pytest-randomly Pytest plugin to randomly order tests and control random.seed. >=3.15 3.15.0 MIT
pytest-xdist pytest xdist plugin for distributed testing, most importantly across multiple CPUs >=3.3 3.4.0 MIT
python-dateutil Extensions to the standard Python datetime module >=2.8.1 2.8.2 Dual License
pytz World timezone definitions, modern and historical >=2015.7; python_version < "3.9" 2023.3.post1 ?
pyyaml YAML parser and emitter for Python >=5.1 6.0.1 MIT
pyyaml-env-tag A custom YAML tag for referencing environment variables in YAML files. >=0.1 0.1 MIT License
regex Alternative regular expression module, to replace re. >=2022.4 2023.10.3 Apache Software License
requests Python HTTP for Humans. 2.31.0 Apache 2.0
ruamel-yaml ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order >=0.17.21 0.18.5 MIT license
ruamel-yaml-clib C version of reader, parser and emitter for ruamel.yaml derived from libyaml >=0.2.7; platform_python_implementation == "CPython" and python_version < "3.13" 0.2.8 MIT
ruff An extremely fast Python linter and code formatter, written in Rust. >=0.0 0.1.5 MIT
safety Checks installed dependencies for known vulnerabilities and licenses. >=2.3 2.3.4 MIT license
semver Python helper for Semantic Versioning (https://semver.org) >=2.13 3.0.2 BSD
setuptools Easily download, build, install, upgrade, and uninstall Python packages >=19.3 68.2.2 MIT License
six Python 2 and 3 compatibility utilities >=1.5 1.16.0 MIT
smmap A pure Python implementation of a sliding window memory map manager <6,>=3.0.1 5.0.1 BSD
tomli A lil' TOML parser >=2.0; python_version < '3.11' 2.0.1 ?
types-markdown Typing stubs for Markdown >=3.5 3.5.0.1 Apache-2.0 license
types-pyyaml Typing stubs for PyYAML >=6.0 6.0.12.12 Apache-2.0 license
typing-extensions Backported and Experimental Type Hints for Python 3.8+ >=4.0.1; python_version < "3.11" 4.8.0 Python Software Foundation License
urllib3 HTTP library with thread-safe connection pooling, file post, and more. <3,>=1.21.1 2.0.7 MIT License
watchdog Filesystem events monitoring >=2.0 3.0.0 Apache License 2.0
zipp Backport of pathlib-compatible object wrapper for zip files >=0.5 3.17.0 ?

More credits from the author

\ No newline at end of file + Credits - mkdocstrings-python

Credits¤

These projects were used to build mkdocstrings-python. Thank you!

python | pdm | copier-pdm

Runtime dependencies¤

Project Summary Version (accepted) Version (last resolved) License
click Composable command line interface toolkit >=7.0 8.1.7 BSD-3-Clause
colorama Cross-platform colored terminal text. >=0.4 0.4.6 BSD License
ghp-import Copy your docs directly to the gh-pages branch. >=1.0 2.1.0 Apache Software License
griffe Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API. >=0.37 0.38.1 ISC
importlib-metadata Read metadata from Python packages >=4.6; python_version < "3.10" 7.0.1 ?
jinja2 A very fast and expressive template engine. >=2.11.1 3.1.2 BSD-3-Clause
markdown Python implementation of John Gruber's Markdown. >=3.3 3.5.1 BSD License
markupsafe Safely add untrusted strings to HTML/XML markup. >=1.1 2.1.3 BSD-3-Clause
mergedeep A deep merge function for 🐍. >=1.3.4 1.3.4 MIT License
mkdocs Project documentation with Markdown. >=1.4 1.5.3 BSD License
mkdocs-autorefs Automatically link across pages in MkDocs. >=0.3.1 0.5.0 ISC
mkdocstrings Automatic documentation from sources, for MkDocs. >=0.20 0.24.0 ISC
packaging Core utilities for Python packages >=20.5 23.2 BSD License
pathspec Utility library for gitignore style pattern matching of file paths. >=0.11.1 0.12.1 Mozilla Public License 2.0 (MPL 2.0)
platformdirs A small Python package for determining appropriate platform-specific dirs, e.g. a "user data dir". >=2.2.0 4.1.0 MIT License
pymdown-extensions Extension pack for Python Markdown. >=6.3 10.7 MIT License
python-dateutil Extensions to the standard Python datetime module >=2.8.1 2.8.2 Dual License
pyyaml YAML parser and emitter for Python 6.0.1 MIT
pyyaml-env-tag A custom YAML tag for referencing environment variables in YAML files. >=0.1 0.1 MIT License
six Python 2 and 3 compatibility utilities >=1.5 1.16.0 MIT
typing-extensions Backported and Experimental Type Hints for Python 3.8+ >=4.1; python_version < "3.10" 4.9.0 Python Software Foundation License
watchdog Filesystem events monitoring >=2.0 3.0.0 Apache License 2.0
zipp Backport of pathlib-compatible object wrapper for zip files >=0.5 3.17.0 ?

Development dependencies¤

Project Summary Version (accepted) Version (last resolved) License
ansimarkup Produce colored terminal text with an xml-like markup ~=1.4 1.5.0 Revised BSD License
appdirs A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". >=1.4 1.4.4 MIT
babel Internationalization utilities ~=2.10 2.14.0 BSD-3-Clause
black The uncompromising code formatter. >=23.9 23.12.1 MIT
blacken-docs Run Black on Python code blocks in documentation files. >=1.16 1.16.0 MIT
certifi Python package for providing Mozilla's CA Bundle. >=2017.4.17 2023.11.17 MPL-2.0
charset-normalizer The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. <4,>=2 3.3.2 MIT
click Composable command line interface toolkit >=8.0.0 8.1.7 BSD-3-Clause
colorama Cross-platform colored terminal text. ; platform_system == "Windows" 0.4.6 BSD License
coverage Code coverage measurement for Python [toml]>=5.2.1 7.4.0 Apache-2.0
csscompressor A python port of YUI CSS Compressor >=0.9.5 0.9.5 BSD
dparse A parser for Python dependency files >=0.6.2 0.6.3 MIT license
duty A simple task runner. >=0.10 1.1.0 ISC
exceptiongroup Backport of PEP 654 (exception groups) >=1.0.0rc8; python_version < "3.11" 1.2.0 ?
execnet execnet: rapid multi-Python deployment >=1.1 2.0.2 MIT License
failprint Run a command, print its output only if it fails. !=1.0.0,>=0.11 1.0.2 ISC
ghp-import Copy your docs directly to the gh-pages branch. >=1.0 2.1.0 Apache Software License
git-changelog Automatic Changelog generator using Jinja2 templates. >=2.3 2.4.0 ISC
gitdb Git Object Database <5,>=4.0.1 4.0.11 BSD License
gitpython GitPython is a Python library used to interact with Git repositories 3.1.40 BSD
htmlmin2 An HTML Minifier >=0.1.13 0.1.13 BSD
idna Internationalized Domain Names in Applications (IDNA) <4,>=2.5 3.6 BSD License
importlib-metadata Read metadata from Python packages >=4.3; python_version < "3.10" 7.0.1 ?
iniconfig brain-dead simple config-ini parsing 2.0.0 MIT License
jinja2 A very fast and expressive template engine. <4,>=2.11 3.1.2 BSD-3-Clause
jsmin JavaScript minifier. >=3.0.1 3.0.1 MIT License
markdown Python implementation of John Gruber's Markdown. <4.0.0,>=3.3.3 3.5.1 BSD License
markdown-callouts Markdown extension: a classier syntax for admonitions >=0.3 0.3.0 MIT
markdown-exec Utilities to execute code blocks in Markdown files. >=1.7 1.8.0 ISC
markupsafe Safely add untrusted strings to HTML/XML markup. >=2.0 2.1.3 BSD-3-Clause
mergedeep A deep merge function for 🐍. >=1.3.4 1.3.4 MIT License
mkdocs Project documentation with Markdown. >=1.5 1.5.3 BSD License
mkdocs-coverage MkDocs plugin to integrate your coverage HTML report into your site. >=1.0 1.0.0 ISC
mkdocs-gen-files MkDocs plugin to programmatically generate documentation pages during the build >=0.5 0.5.0 MIT License
mkdocs-git-committers-plugin-2 An MkDocs plugin to create a list of contributors on the page. The git-committers plugin will seed the template context with a list of GitHub or GitLab committers and other useful GIT info such as last modified date >=1.2 2.2.3 MIT
mkdocs-literate-nav MkDocs plugin to specify the navigation in Markdown instead of YAML >=0.6 0.6.1 MIT License
mkdocs-material Documentation that simply works >=9.4 9.5.3 MIT License
mkdocs-material-extensions Extension pack for Python Markdown and MkDocs Material. ~=1.3 1.3.1 MIT License
mkdocs-minify-plugin An MkDocs plugin to minify HTML, JS or CSS files prior to being written to disk >=0.7 0.7.2 MIT
mypy Optional static typing for Python >=1.5 1.8.0 MIT
mypy-extensions Type system extensions for programs checked with the mypy type checker. >=0.4.3 1.0.0 MIT License
packaging Core utilities for Python packages >=22.0 23.2 BSD License
paginate Divides large result sets into pages for easier browsing ~=0.5 0.5.6 MIT
pathspec Utility library for gitignore style pattern matching of file paths. >=0.9.0 0.12.1 Mozilla Public License 2.0 (MPL 2.0)
platformdirs A small Python package for determining appropriate platform-specific dirs, e.g. a "user data dir". >=2 4.1.0 MIT License
pluggy plugin and hook calling mechanisms for python <2.0,>=0.12 1.3.0 MIT
ptyprocess Run a subprocess in a pseudo terminal ~=0.6; sys_platform != "win32" 0.7.0 ISC License (ISCL)
pygments Pygments is a syntax highlighting package written in Python. ~=2.16 2.17.2 BSD-2-Clause
pymdown-extensions Extension pack for Python Markdown. >=9 10.7 MIT License
pytest pytest: simple powerful testing with Python >=7.4 7.4.4 MIT
pytest-cov Pytest plugin for measuring coverage. >=4.1 4.1.0 MIT
pytest-randomly Pytest plugin to randomly order tests and control random.seed. >=3.15 3.15.0 MIT
pytest-xdist pytest xdist plugin for distributed testing, most importantly across multiple CPUs >=3.3 3.5.0 MIT
python-dateutil Extensions to the standard Python datetime module >=2.8.1 2.8.2 Dual License
pytz World timezone definitions, modern and historical >=2015.7; python_version < "3.9" 2023.3.post1 ?
pyyaml YAML parser and emitter for Python >=5.1 6.0.1 MIT
pyyaml-env-tag A custom YAML tag for referencing environment variables in YAML files. >=0.1 0.1 MIT License
regex Alternative regular expression module, to replace re. >=2022.4 2023.12.25 Apache Software License
requests Python HTTP for Humans. 2.31.0 Apache 2.0
ruamel-yaml ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order >=0.17.21 0.18.5 MIT license
ruamel-yaml-clib C version of reader, parser and emitter for ruamel.yaml derived from libyaml >=0.2.7; platform_python_implementation == "CPython" and python_version < "3.13" 0.2.8 MIT
ruff An extremely fast Python linter and code formatter, written in Rust. >=0.0 0.1.11 MIT
safety Checks installed dependencies for known vulnerabilities and licenses. >=2.3 2.3.4 MIT license
semver Python helper for Semantic Versioning (https://semver.org) >=2.13 3.0.2 BSD
setuptools Easily download, build, install, upgrade, and uninstall Python packages >=19.3 69.0.3 MIT License
six Python 2 and 3 compatibility utilities >=1.5 1.16.0 MIT
smmap A pure Python implementation of a sliding window memory map manager <6,>=3.0.1 5.0.1 BSD
tomli A lil' TOML parser >=2.0; python_version < '3.11' 2.0.1 ?
types-markdown Typing stubs for Markdown >=3.5 3.5.0.20240106 Apache-2.0 license
types-pyyaml Typing stubs for PyYAML >=6.0 6.0.12.12 Apache-2.0 license
typing-extensions Backported and Experimental Type Hints for Python 3.8+ >=4.0.1; python_version < "3.11" 4.9.0 Python Software Foundation License
urllib3 HTTP library with thread-safe connection pooling, file post, and more. <3,>=1.21.1 2.1.0 MIT License
watchdog Filesystem events monitoring >=2.0 3.0.0 Apache License 2.0
zipp Backport of pathlib-compatible object wrapper for zip files >=0.5 3.17.0 ?

More credits from the author

\ No newline at end of file diff --git a/index.html b/index.html index d0962d06..c45b8a98 100644 --- a/index.html +++ b/index.html @@ -1,13 +1,13 @@ - Overview - mkdocstrings-python

mkdocstrings-python

A Python handler for mkdocstrings.

ci documentation pypi version gitpod gitter


The Python handler uses Griffe to collect documentation from Python source code. The word "griffe" can sometimes be used instead of "signature" in French. Griffe is able to visit the Abstract Syntax Tree (AST) of the source code to extract useful information. It is also able to execute the code (by importing it) and introspect objects in memory when source code is not available. Finally, it can parse docstrings following different styles.

Installation¤

You can install this handler as a mkdocstrings extra:

pyproject.toml
# PEP 621 dependencies declaration
+ Overview - mkdocstrings-python      

mkdocstrings-python

A Python handler for mkdocstrings.

ci documentation pypi version gitpod gitter


The Python handler uses Griffe to collect documentation from Python source code. The word "griffe" can sometimes be used instead of "signature" in French. Griffe is able to visit the Abstract Syntax Tree (AST) of the source code to extract useful information. It is also able to execute the code (by importing it) and introspect objects in memory when source code is not available. Finally, it can parse docstrings following different styles.

Installation¤

You can install this handler as a mkdocstrings extra:

pyproject.toml
# PEP 621 dependencies declaration
 # adapt to your dependencies manager
 [project]
 dependencies = [
-    "mkdocstrings[python]>=0.18",
+    "mkdocstrings[python]>=0.18",
 ]
 

You can also explicitly depend on the handler:

pyproject.toml
# PEP 621 dependencies declaration
 # adapt to your dependencies manager
 [project]
 dependencies = [
-    "mkdocstrings-python",
+    "mkdocstrings-python",
 ]
-

Preview¤

mkdocstrings_python_gif

Features¤

  • Data collection from source code: collection of the object-tree and the docstrings is done thanks to Griffe.

  • Support for type annotations: Griffe collects your type annotations and mkdocstrings uses them to display parameter types or return types. It is even able to automatically add cross-references to other objects from your API, from the standard library or third-party libraries! See how to load inventories to enable it.

  • Recursive documentation of Python objects: just use the module dotted-path as an identifier, and you get the full module docs. You don't need to inject documentation for each class, function, etc.

  • Support for documented attributes: attributes (variables) followed by a docstring (triple-quoted string) will be recognized by Griffe in modules, classes and even in __init__ methods.

  • Multiple docstring-styles support: common support for Google-style, Numpydoc-style, and Sphinx-style docstrings. See Griffe's documentation on docstrings support.

  • Admonition support in Google docstrings: blocks like Note: or Warning: will be transformed to their admonition equivalent. We do not support nested admonitions in docstrings!

  • Every object has a TOC entry: we render a heading for each object, meaning MkDocs picks them into the Table of Contents, which is nicely displayed by the Material theme. Thanks to mkdocstrings cross-reference ability, you can reference other objects within your docstrings, with the classic Markdown syntax: [this object][package.module.object] or directly with [package.module.object][]

  • Source code display: mkdocstrings can add a collapsible div containing the highlighted source code of the Python object.

\ No newline at end of file +

Preview¤

mkdocstrings_python_gif

Features¤

  • Data collection from source code: collection of the object-tree and the docstrings is done thanks to Griffe.

  • Support for type annotations: Griffe collects your type annotations and mkdocstrings uses them to display parameter types or return types. It is even able to automatically add cross-references to other objects from your API, from the standard library or third-party libraries! See how to load inventories to enable it.

  • Recursive documentation of Python objects: just use the module dotted-path as an identifier, and you get the full module docs. You don't need to inject documentation for each class, function, etc.

  • Support for documented attributes: attributes (variables) followed by a docstring (triple-quoted string) will be recognized by Griffe in modules, classes and even in __init__ methods.

  • Multiple docstring-styles support: common support for Google-style, Numpydoc-style, and Sphinx-style docstrings. See Griffe's documentation on docstrings support.

  • Admonition support in Google docstrings: blocks like Note: or Warning: will be transformed to their admonition equivalent. We do not support nested admonitions in docstrings!

  • Every object has a TOC entry: we render a heading for each object, meaning MkDocs picks them into the Table of Contents, which is nicely displayed by the Material theme. Thanks to mkdocstrings cross-reference ability, you can reference other objects within your docstrings, with the classic Markdown syntax: [this object][package.module.object] or directly with [package.module.object][]

  • Source code display: mkdocstrings can add a collapsible div containing the highlighted source code of the Python object.

\ No newline at end of file diff --git a/insiders/changelog/index.html b/insiders/changelog/index.html index 3c353be4..e7fa367a 100644 --- a/insiders/changelog/index.html +++ b/insiders/changelog/index.html @@ -1 +1 @@ - Changelog - mkdocstrings-python

Changelog¤

mkdocstrings-python Insiders¤

1.5.1 September 12, 2023¤

  • Prevent empty auto-summarized Methods section.

1.5.0 September 05, 2023¤

  • Render function signature overloads.

1.4.0 August 27, 2023¤

  • Render cross-references in attribute signatures.

1.3.0 August 24, 2023¤

  • Add "method" symbol type.

1.2.0 August 20, 2023¤

1.1.4 July 17, 2023¤

  • Fix heading level increment for class members.

1.1.3 July 17, 2023¤

  • Fix heading level (avoid with clause preventing to decrease it).

1.1.2 July 15, 2023¤

  • Use non-breaking spaces after symbol types.

1.1.1 June 27, 2023¤

  • Correctly escape expressions in signatures and other rendered types.

1.1.0 June 4, 2023¤

1.0.0 May 10, 2023¤

\ No newline at end of file + Changelog - mkdocstrings-python

Changelog¤

mkdocstrings-python Insiders¤

1.5.1 September 12, 2023¤

  • Prevent empty auto-summarized Methods section.

1.5.0 September 05, 2023¤

  • Render function signature overloads.

1.4.0 August 27, 2023¤

  • Render cross-references in attribute signatures.

1.3.0 August 24, 2023¤

  • Add "method" symbol type.

1.2.0 August 20, 2023¤

1.1.4 July 17, 2023¤

  • Fix heading level increment for class members.

1.1.3 July 17, 2023¤

  • Fix heading level (avoid with clause preventing to decrease it).

1.1.2 July 15, 2023¤

  • Use non-breaking spaces after symbol types.

1.1.1 June 27, 2023¤

  • Correctly escape expressions in signatures and other rendered types.

1.1.0 June 4, 2023¤

1.0.0 May 10, 2023¤

\ No newline at end of file diff --git a/insiders/index.html b/insiders/index.html index bbc50c43..0cdc6854 100644 --- a/insiders/index.html +++ b/insiders/index.html @@ -1,4 +1,4 @@ - Insiders - mkdocstrings-python

Insiders¤

mkdocstrings-python follows the sponsorware release strategy, which means that new features are first exclusively released to sponsors as part of Insiders. Read on to learn what sponsorships achieve, how to become a sponsor to get access to Insiders, and what's in it for you!

What is Insiders?¤

mkdocstrings-python Insiders is a private fork of mkdocstrings-python, hosted as a private GitHub repository. Almost1 all new features are developed as part of this fork, which means that they are immediately available to all eligible sponsors, as they are made collaborators of this repository.

Every feature is tied to a funding goal in monthly subscriptions. When a funding goal is hit, the features that are tied to it are merged back into mkdocstrings-python and released for general availability, making them available to all users. Bugfixes are always released in tandem.

Sponsorships start as low as $10 a month.2

What sponsorships achieve¤

Sponsorships make this project sustainable, as they buy the maintainers of this project time – a very scarce resource – which is spent on the development of new features, bug fixing, stability improvement, issue triage and general support. The biggest bottleneck in Open Source is time.3

If you're unsure if you should sponsor this project, check out the list of completed funding goals to learn whether you're already using features that were developed with the help of sponsorships.

Fosstodon

Insiders¤

mkdocstrings-python follows the sponsorware release strategy, which means that new features are first exclusively released to sponsors as part of Insiders. Read on to learn what sponsorships achieve, how to become a sponsor to get access to Insiders, and what's in it for you!

What is Insiders?¤

mkdocstrings-python Insiders is a private fork of mkdocstrings-python, hosted as a private GitHub repository. Almost1 all new features are developed as part of this fork, which means that they are immediately available to all eligible sponsors, as they are made collaborators of this repository.

Every feature is tied to a funding goal in monthly subscriptions. When a funding goal is hit, the features that are tied to it are merged back into mkdocstrings-python and released for general availability, making them available to all users. Bugfixes are always released in tandem.

Sponsorships start as low as $10 a month.2

What sponsorships achieve¤

Sponsorships make this project sustainable, as they buy the maintainers of this project time – a very scarce resource – which is spent on the development of new features, bug fixing, stability improvement, issue triage and general support. The biggest bottleneck in Open Source is time.3

If you're unsure if you should sponsor this project, check out the list of completed funding goals to learn whether you're already using features that were developed with the help of sponsorships.

What's in it for me?¤

The moment you become a sponsor, you'll get immediate access to 7 additional features that you can start using right away, and which are currently exclusively available to sponsors:

How to become a sponsor¤

Thanks for your interest in sponsoring! In order to become an eligible sponsor with your GitHub account, visit pawamoy's sponsor profile, and complete a sponsorship of $10 a month or more. You can use your individual or organization GitHub account for sponsoring.

Important: If you're sponsoring @pawamoy through a GitHub organization, please send a short email to pawamoy@pm.me with the name of your organization and the GitHub account of the individual that should be added as a collaborator.4

You can cancel your sponsorship anytime.5

  Join our awesome sponsors



If you sponsor publicly, you're automatically added here with a link to your profile and avatar to show your support for mkdocstrings-python. Alternatively, if you wish to keep your sponsorship private, you'll be a silent +1. You can select visibility during checkout and change it afterwards.

Funding ¤

Goals¤

The following section lists all funding goals. Each goal contains a list of features prefixed with a checkmark symbol, denoting whether a feature is already available or planned, but not yet implemented. When the funding goal is hit, the features are released for general availability.

$ 500 — PlasmaVac User Guide¤

$ 1,000 — GraviFridge User Manual¤

Frequently asked questions¤

Compatibility¤

We're building an open source project and want to allow outside collaborators to use mkdocstrings-python locally without having access to Insiders. Is this still possible?

Yes. Insiders is compatible with mkdocstrings-python. Almost all new features and configuration options are either backward-compatible or implemented behind feature flags. Most Insiders features enhance the overall experience, though while these features add value for the users of your project, they shouldn't be necessary for previewing when making changes to content.

Payment¤

We don't want to pay for sponsorship every month. Are there any other options?

Yes. You can sponsor on a yearly basis by switching your GitHub account to a yearly billing cycle. If for some reason you cannot do that, you could also create a dedicated GitHub account with a yearly billing cycle, which you only use for sponsoring (some sponsors already do that).

If you have any problems or further questions, please reach out to pawamoy@pm.me.

Terms¤

Are we allowed to use Insiders under the same terms and conditions as mkdocstrings-python?

Yes. Whether you're an individual or a company, you may use mkdocstrings-python Insiders precisely under the same terms as mkdocstrings-python, which are given by the ISC License. However, we kindly ask you to respect our fair use policy:

  • Please don't distribute the source code of Insiders. You may freely use it for public, private or commercial projects, privately fork or mirror it, but please don't make the source code public, as it would counteract the sponsorware strategy.

  • If you cancel your subscription, you're automatically removed as a collaborator and will miss out on all future updates of Insiders. However, you may use the latest version that's available to you as long as you like. Just remember that GitHub deletes private forks.


  1. In general, every new feature is first exclusively released to sponsors, but sometimes upstream dependencies enhance existing features that must be supported by mkdocstrings-python

  2. Note that $10 a month is the minimum amount to become eligible for Insiders. While GitHub Sponsors also allows to sponsor lower amounts or one-time amounts, those can't be granted access to Insiders due to technical reasons. Such contributions are still very much welcome as they help ensuring the project's sustainability. 

  3. Making an Open Source project sustainable is exceptionally hard: maintainers burn out, projects are abandoned. That's not great and very unpredictable. The sponsorware model ensures that if you decide to use mkdocstrings-python, you can be sure that bugs are fixed quickly and new features are added regularly. 

  4. It's currently not possible to grant access to each member of an organization, as GitHub only allows for adding users. Thus, after sponsoring, please send an email to pawamoy@pm.me, stating which account should become a collaborator of the Insiders repository. We're working on a solution which will make access to organizations much simpler. To ensure that access is not tied to a particular individual GitHub account, create a bot account (i.e. a GitHub account that is not tied to a specific individual), and use this account for the sponsoring. After being added to the list of collaborators, the bot account can create a private fork of the private Insiders GitHub repository, and grant access to all members of the organizations. 

  5. If you cancel your sponsorship, GitHub schedules a cancellation request which will become effective at the end of the billing cycle. This means that even though you cancel your sponsorship, you will keep your access to Insiders as long as your cancellation isn't effective. All charges are processed by GitHub through Stripe. As we don't receive any information regarding your payment, and GitHub doesn't offer refunds, sponsorships are non-refundable. 

\ No newline at end of file +``` -->

Frequently asked questions¤

Compatibility¤

We're building an open source project and want to allow outside collaborators to use mkdocstrings-python locally without having access to Insiders. Is this still possible?

Yes. Insiders is compatible with mkdocstrings-python. Almost all new features and configuration options are either backward-compatible or implemented behind feature flags. Most Insiders features enhance the overall experience, though while these features add value for the users of your project, they shouldn't be necessary for previewing when making changes to content.

Payment¤

We don't want to pay for sponsorship every month. Are there any other options?

Yes. You can sponsor on a yearly basis by switching your GitHub account to a yearly billing cycle. If for some reason you cannot do that, you could also create a dedicated GitHub account with a yearly billing cycle, which you only use for sponsoring (some sponsors already do that).

If you have any problems or further questions, please reach out to pawamoy@pm.me.

Terms¤

Are we allowed to use Insiders under the same terms and conditions as mkdocstrings-python?

Yes. Whether you're an individual or a company, you may use mkdocstrings-python Insiders precisely under the same terms as mkdocstrings-python, which are given by the ISC License. However, we kindly ask you to respect our fair use policy:

  • Please don't distribute the source code of Insiders. You may freely use it for public, private or commercial projects, privately fork or mirror it, but please don't make the source code public, as it would counteract the sponsorware strategy.

  • If you cancel your subscription, you're automatically removed as a collaborator and will miss out on all future updates of Insiders. However, you may use the latest version that's available to you as long as you like. Just remember that GitHub deletes private forks.


  1. In general, every new feature is first exclusively released to sponsors, but sometimes upstream dependencies enhance existing features that must be supported by mkdocstrings-python

  2. Note that $10 a month is the minimum amount to become eligible for Insiders. While GitHub Sponsors also allows to sponsor lower amounts or one-time amounts, those can't be granted access to Insiders due to technical reasons. Such contributions are still very much welcome as they help ensuring the project's sustainability. 

  3. Making an Open Source project sustainable is exceptionally hard: maintainers burn out, projects are abandoned. That's not great and very unpredictable. The sponsorware model ensures that if you decide to use mkdocstrings-python, you can be sure that bugs are fixed quickly and new features are added regularly. 

  4. It's currently not possible to grant access to each member of an organization, as GitHub only allows for adding users. Thus, after sponsoring, please send an email to pawamoy@pm.me, stating which account should become a collaborator of the Insiders repository. We're working on a solution which will make access to organizations much simpler. To ensure that access is not tied to a particular individual GitHub account, create a bot account (i.e. a GitHub account that is not tied to a specific individual), and use this account for the sponsoring. After being added to the list of collaborators, the bot account can create a private fork of the private Insiders GitHub repository, and grant access to all members of the organizations. 

  5. If you cancel your sponsorship, GitHub schedules a cancellation request which will become effective at the end of the billing cycle. This means that even though you cancel your sponsorship, you will keep your access to Insiders as long as your cancellation isn't effective. All charges are processed by GitHub through Stripe. As we don't receive any information regarding your payment, and GitHub doesn't offer refunds, sponsorships are non-refundable. 

\ No newline at end of file diff --git a/insiders/installation/index.html b/insiders/installation/index.html index 2db1eb5a..54744ba3 100644 --- a/insiders/installation/index.html +++ b/insiders/installation/index.html @@ -1,4 +1,4 @@ - Getting started with Insiders - mkdocstrings-python

Getting started with Insiders¤

mkdocstrings-python Insiders is a compatible drop-in replacement for mkdocstrings-python, and can be installed similarly using pip or git. Note that in order to access the Insiders repository, you need to become an eligible sponsor of @pawamoy on GitHub.

Installation¤

with PyPI Insiders¤

PyPI Insiders is a tool that helps you keep up-to-date versions of Insiders projects in the PyPI index of your choice (self-hosted, Google registry, Artifactory, etc.).

See how to install it and how to use it.

with pip (ssh/https)¤

mkdocstrings-python Insiders can be installed with pip using SSH:

pip install git+ssh://git@github.com/pawamoy-insiders/mkdocstrings-python.git
+ Getting started with Insiders - mkdocstrings-python      

Getting started with Insiders¤

mkdocstrings-python Insiders is a compatible drop-in replacement for mkdocstrings-python, and can be installed similarly using pip or git. Note that in order to access the Insiders repository, you need to become an eligible sponsor of @pawamoy on GitHub.

Installation¤

with PyPI Insiders¤

PyPI Insiders is a tool that helps you keep up-to-date versions of Insiders projects in the PyPI index of your choice (self-hosted, Google registry, Artifactory, etc.).

See how to install it and how to use it.

with pip (ssh/https)¤

mkdocstrings-python Insiders can be installed with pip using SSH:

pip install git+ssh://git@github.com/pawamoy-insiders/mkdocstrings-python.git
 

Or using HTTPS:

pip install git+https://${GH_TOKEN}@github.com/pawamoy-insiders/mkdocstrings-python.git
 
How to get a GitHub personal access token

The GH_TOKEN environment variable is a GitHub token. It can be obtained by creating a personal access token for your GitHub account. It will give you access to the Insiders repository, programmatically, from the command line or GitHub Actions workflows:

  1. Go to https://github.com/settings/tokens
  2. Click on Generate a new token
  3. Enter a name and select the repo scope
  4. Generate the token and store it in a safe place

Note that the personal access token must be kept secret at all times, as it allows the owner to access your private repositories.

with pip (self-hosted)¤

Self-hosting the Insiders package makes it possible to depend on mkdocstrings-python normally, while transparently downloading and installing the Insiders version locally. It means that you can specify your dependencies normally, and your contributors without access to Insiders will get the public version, while you get the Insiders version on your machine.

Limitation

With this method, there is no way to force the installation of an Insiders version rather than a public version. If there is a public version that is more recent than your self-hosted Insiders version, the public version will take precedence. Remember to regularly update your self-hosted versions by uploading latest distributions.

You can build the distributions for Insiders yourself, by cloning the repository and using build to build the distributions, or you can download them from our GitHub Releases. You can upload these distributions to a private PyPI-like registry (Artifactory, Google Cloud, pypiserver, etc.) with Twine:

# download distributions in ~/dists, then upload with:
 twine upload --repository-url https://your-private-index.com ~/dists/*
@@ -39,4 +39,4 @@
 pdm config pypi.extra.url http://localhost:8080/simple
 

Now when running pip install mkdocstrings-python, or resolving dependencies with PDM, both tools will look into our local index and find the Insiders version. Remember to update your local index regularly!

with git¤

Of course, you can use mkdocstrings-python Insiders directly from git:

git clone git@github.com:pawamoy-insiders/mkdocstrings-python
 

When cloning from git, the package must be installed:

pip install -e python
-

Upgrading¤

When upgrading Insiders, you should always check the version of mkdocstrings-python which makes up the first part of the version qualifier. For example, a version like 8.x.x.4.x.x means that Insiders 4.x.x is currently based on 8.x.x.

If the major version increased, it's a good idea to consult the changelog and go through the steps to ensure your configuration is up to date and all necessary changes have been made.

\ No newline at end of file +

Upgrading¤

When upgrading Insiders, you should always check the version of mkdocstrings-python which makes up the first part of the version qualifier. For example, a version like 8.x.x.4.x.x means that Insiders 4.x.x is currently based on 8.x.x.

If the major version increased, it's a good idea to consult the changelog and go through the steps to ensure your configuration is up to date and all necessary changes have been made.

\ No newline at end of file diff --git a/license/index.html b/license/index.html index 68cb4851..e3ee3938 100644 --- a/license/index.html +++ b/license/index.html @@ -1,4 +1,4 @@ - License - mkdocstrings-python

License¤

ISC License
+ License - mkdocstrings-python      

License¤

ISC License
 
 Copyright (c) 2021, Timothée Mazzucotelli
 
@@ -13,4 +13,4 @@
 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
\ No newline at end of file +
\ No newline at end of file diff --git a/reference/SUMMARY/index.html b/reference/SUMMARY/index.html index c61c1031..bbbd7d61 100644 --- a/reference/SUMMARY/index.html +++ b/reference/SUMMARY/index.html @@ -1 +1 @@ - SUMMARY - mkdocstrings-python
\ No newline at end of file + SUMMARY - mkdocstrings-python
\ No newline at end of file diff --git a/reference/mkdocstrings_handlers/python/debug/index.html b/reference/mkdocstrings_handlers/python/debug/index.html index d1d0326a..e8252d64 100644 --- a/reference/mkdocstrings_handlers/python/debug/index.html +++ b/reference/mkdocstrings_handlers/python/debug/index.html @@ -1,4 +1,4 @@ - debug - mkdocstrings-python

debug ¤

Debugging utilities.

Classes:

  • Environment

    Dataclass to store environment information.

  • Package

    Dataclass describing a Python package.

  • Variable

    Dataclass describing an environment variable.

Functions:

Environment dataclass ¤

Dataclass to store environment information.

Attributes:

interpreter_name instance-attribute ¤

interpreter_name: str
+ debug - mkdocstrings-python      

debug ¤

Debugging utilities.

Classes:

  • Environment

    Dataclass to store environment information.

  • Package

    Dataclass describing a Python package.

  • Variable

    Dataclass describing an environment variable.

Functions:

Environment dataclass ¤

Dataclass to store environment information.

Attributes:

interpreter_name instance-attribute ¤

interpreter_name: str
 

Python interpreter name.

interpreter_version instance-attribute ¤

interpreter_version: str
 

Python interpreter version.

packages instance-attribute ¤

packages: list[Package]
 

Installed packages.

platform instance-attribute ¤

platform: str
@@ -10,4 +10,4 @@
 

Variable value.

get_debug_info ¤

get_debug_info() -> Environment
 

Get debug/environment information.

Returns:

get_version ¤

get_version(dist: str = 'mkdocstrings-python') -> str
 

Get version of the given distribution.

Parameters:

  • dist (str, default: 'mkdocstrings-python' ) –

    A distribution name.

Returns:

  • str

    A version number.

print_debug_info ¤

print_debug_info() -> None
-

Print debug/environment information.

\ No newline at end of file +

Print debug/environment information.

\ No newline at end of file diff --git a/reference/mkdocstrings_handlers/python/handler/index.html b/reference/mkdocstrings_handlers/python/handler/index.html index bb4eba39..5a986292 100644 --- a/reference/mkdocstrings_handlers/python/handler/index.html +++ b/reference/mkdocstrings_handlers/python/handler/index.html @@ -1,4 +1,4 @@ - handler - mkdocstrings-python

handler ¤

This module implements a handler for the Python language.

Classes:

Functions:

  • get_handler

    Simply return an instance of PythonHandler.

PythonHandler ¤

PythonHandler(
+ handler - mkdocstrings-python      

handler ¤

This module implements a handler for the Python language.

Classes:

Functions:

  • get_handler

    Simply return an instance of PythonHandler.

PythonHandler ¤

PythonHandler(
     *args: Any,
     config_file_path: str | None = None,
     paths: list[str] | None = None,
@@ -97,4 +97,4 @@
     load_external_modules: bool = False,
     **config: Any
 ) -> PythonHandler
-

Simply return an instance of PythonHandler.

Parameters:

  • theme (str) –

    The theme to use when rendering contents.

  • custom_templates (str | None, default: None ) –

    Directory containing custom templates.

  • config_file_path (str | None, default: None ) –

    The MkDocs configuration file path.

  • paths (list[str] | None, default: None ) –

    A list of paths to use as Griffe search paths.

  • locale (str, default: 'en' ) –

    The locale to use when rendering content.

  • load_external_modules (bool, default: False ) –

    Load external modules when resolving aliases.

  • **config (Any, default: {} ) –

    Configuration passed to the handler.

Returns:

\ No newline at end of file +

Simply return an instance of PythonHandler.

Parameters:

  • theme (str) –

    The theme to use when rendering contents.

  • custom_templates (str | None, default: None ) –

    Directory containing custom templates.

  • config_file_path (str | None, default: None ) –

    The MkDocs configuration file path.

  • paths (list[str] | None, default: None ) –

    A list of paths to use as Griffe search paths.

  • locale (str, default: 'en' ) –

    The locale to use when rendering content.

  • load_external_modules (bool, default: False ) –

    Load external modules when resolving aliases.

  • **config (Any, default: {} ) –

    Configuration passed to the handler.

Returns:

\ No newline at end of file diff --git a/reference/mkdocstrings_handlers/python/index.html b/reference/mkdocstrings_handlers/python/index.html index fef59989..e632da2b 100644 --- a/reference/mkdocstrings_handlers/python/index.html +++ b/reference/mkdocstrings_handlers/python/index.html @@ -1,4 +1,4 @@ - Index - mkdocstrings-python

python ¤

This package implements a handler for the Python language.

Modules:

  • debug

    Debugging utilities.

  • handler

    This module implements a handler for the Python language.

  • rendering

    This module implements rendering utilities.

Functions:

  • get_handler

    Simply return an instance of PythonHandler.

get_handler ¤

get_handler(
+ Index - mkdocstrings-python      

python ¤

This package implements a handler for the Python language.

Modules:

  • debug

    Debugging utilities.

  • handler

    This module implements a handler for the Python language.

  • rendering

    This module implements rendering utilities.

Functions:

  • get_handler

    Simply return an instance of PythonHandler.

get_handler ¤

get_handler(
     *,
     theme: str,
     custom_templates: str | None = None,
@@ -8,4 +8,4 @@
     load_external_modules: bool = False,
     **config: Any
 ) -> PythonHandler
-

Simply return an instance of PythonHandler.

Parameters:

  • theme (str) –

    The theme to use when rendering contents.

  • custom_templates (str | None, default: None ) –

    Directory containing custom templates.

  • config_file_path (str | None, default: None ) –

    The MkDocs configuration file path.

  • paths (list[str] | None, default: None ) –

    A list of paths to use as Griffe search paths.

  • locale (str, default: 'en' ) –

    The locale to use when rendering content.

  • load_external_modules (bool, default: False ) –

    Load external modules when resolving aliases.

  • **config (Any, default: {} ) –

    Configuration passed to the handler.

Returns:

\ No newline at end of file +

Simply return an instance of PythonHandler.

Parameters:

  • theme (str) –

    The theme to use when rendering contents.

  • custom_templates (str | None, default: None ) –

    Directory containing custom templates.

  • config_file_path (str | None, default: None ) –

    The MkDocs configuration file path.

  • paths (list[str] | None, default: None ) –

    A list of paths to use as Griffe search paths.

  • locale (str, default: 'en' ) –

    The locale to use when rendering content.

  • load_external_modules (bool, default: False ) –

    Load external modules when resolving aliases.

  • **config (Any, default: {} ) –

    Configuration passed to the handler.

Returns:

\ No newline at end of file diff --git a/reference/mkdocstrings_handlers/python/rendering/index.html b/reference/mkdocstrings_handlers/python/rendering/index.html index 45388101..9a1ef7da 100644 --- a/reference/mkdocstrings_handlers/python/rendering/index.html +++ b/reference/mkdocstrings_handlers/python/rendering/index.html @@ -1,4 +1,4 @@ - rendering - mkdocstrings-python

rendering ¤

This module implements rendering utilities.

Classes:

  • Order

    Enumeration for the possible members ordering.

Functions:

Order ¤

Bases: Enum

Enumeration for the possible members ordering.

Attributes:

alphabetical class-attribute instance-attribute ¤

alphabetical = 'alphabetical'
+ rendering - mkdocstrings-python      

rendering ¤

This module implements rendering utilities.

Classes:

  • Order

    Enumeration for the possible members ordering.

Functions:

Order ¤

Bases: Enum

Enumeration for the possible members ordering.

Attributes:

alphabetical class-attribute instance-attribute ¤

alphabetical = 'alphabetical'
 

Alphabetical order.

source class-attribute instance-attribute ¤

source = 'source'
 

Source code order.

do_as_attributes_section ¤

do_as_attributes_section(
     context: Context,
@@ -63,4 +63,4 @@
 

Order members given an ordering method.

Parameters:

  • members (Sequence[Object | Alias]) –

    The members to order.

  • order (Order) –

    The ordering method.

  • members_list (bool | list[str] | None) –

    An optional member list (manual ordering).

Returns:

do_split_path ¤

do_split_path(
     path: str, full_path: str
 ) -> list[tuple[str, str]]
-

Split object paths for building cross-references.

Parameters:

  • path (str) –

    The path to split.

Returns:

\ No newline at end of file +

Split object paths for building cross-references.

Parameters:

  • path (str) –

    The path to split.

Returns:

\ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json index fa7e74c3..29093943 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Overview","text":"mkdocstrings-python

A Python handler for mkdocstrings.

The Python handler uses Griffe to collect documentation from Python source code. The word \"griffe\" can sometimes be used instead of \"signature\" in French. Griffe is able to visit the Abstract Syntax Tree (AST) of the source code to extract useful information. It is also able to execute the code (by importing it) and introspect objects in memory when source code is not available. Finally, it can parse docstrings following different styles.

"},{"location":"#installation","title":"Installation","text":"

You can install this handler as a mkdocstrings extra:

pyproject.toml
# PEP 621 dependencies declaration\n# adapt to your dependencies manager\n[project]\ndependencies = [\n    \"mkdocstrings[python]>=0.18\",\n]\n

You can also explicitly depend on the handler:

pyproject.toml
# PEP 621 dependencies declaration\n# adapt to your dependencies manager\n[project]\ndependencies = [\n    \"mkdocstrings-python\",\n]\n
"},{"location":"#preview","title":"Preview","text":""},{"location":"#features","title":"Features","text":"
  • Data collection from source code: collection of the object-tree and the docstrings is done thanks to Griffe.

  • Support for type annotations: Griffe collects your type annotations and mkdocstrings uses them to display parameter types or return types. It is even able to automatically add cross-references to other objects from your API, from the standard library or third-party libraries! See how to load inventories to enable it.

  • Recursive documentation of Python objects: just use the module dotted-path as an identifier, and you get the full module docs. You don't need to inject documentation for each class, function, etc.

  • Support for documented attributes: attributes (variables) followed by a docstring (triple-quoted string) will be recognized by Griffe in modules, classes and even in __init__ methods.

  • Multiple docstring-styles support: common support for Google-style, Numpydoc-style, and Sphinx-style docstrings. See Griffe's documentation on docstrings support.

  • Admonition support in Google docstrings: blocks like Note: or Warning: will be transformed to their admonition equivalent. We do not support nested admonitions in docstrings!

  • Every object has a TOC entry: we render a heading for each object, meaning MkDocs picks them into the Table of Contents, which is nicely displayed by the Material theme. Thanks to mkdocstrings cross-reference ability, you can reference other objects within your docstrings, with the classic Markdown syntax: [this object][package.module.object] or directly with [package.module.object][]

  • Source code display: mkdocstrings can add a collapsible div containing the highlighted source code of the Python object.

"},{"location":"changelog/","title":"Changelog","text":"

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

"},{"location":"changelog/#175-2023-11-21","title":"1.7.5 - 2023-11-21","text":"

Compare with 1.7.4

"},{"location":"changelog/#bug-fixes","title":"Bug Fixes","text":"
  • Add missing translations (fallback theme) for ReadTheDocs (2fb6513 by Timoth\u00e9e Mazzucotelli). Issue #115
"},{"location":"changelog/#174-2023-11-12","title":"1.7.4 - 2023-11-12","text":"

Compare with 1.7.3

"},{"location":"changelog/#bug-fixes_1","title":"Bug Fixes","text":"
  • Make extension paths relative to config file (5035e92 by Waylan Limberg). PR #112, Co-authored-by: Timoth\u00e9e Mazzucotelli pawamoy@pm.me
"},{"location":"changelog/#code-refactoring","title":"Code Refactoring","text":"
  • Prepare for Griffe 0.37 (b5bb8a9 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#173-2023-10-09","title":"1.7.3 - 2023-10-09","text":"

Compare with 1.7.2

"},{"location":"changelog/#bug-fixes_2","title":"Bug Fixes","text":"
  • Don't deepcopy the local config (1300d2c by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#172-2023-10-05","title":"1.7.2 - 2023-10-05","text":"

Compare with 1.7.1

"},{"location":"changelog/#bug-fixes_3","title":"Bug Fixes","text":"
  • Prevent alias resolution error when source-ordering members (67df10c by Timoth\u00e9e Mazzucotelli). Issue griffe#213
"},{"location":"changelog/#code-refactoring_1","title":"Code Refactoring","text":"
  • Use package relative filepath if filepath is not relative (aa5a3f7 by Timoth\u00e9e Mazzucotelli). Discussion mkdocstrings#622
"},{"location":"changelog/#171-2023-09-28","title":"1.7.1 - 2023-09-28","text":"

Compare with 1.7.0

"},{"location":"changelog/#bug-fixes_4","title":"Bug Fixes","text":"
  • Stop propagation of annotation to next parameter in signature template (3a760ac by Timoth\u00e9e Mazzucotelli). Issue #110
"},{"location":"changelog/#code-refactoring_2","title":"Code Refactoring","text":"
  • Look into inherited members for __init__ methods when merging docstrings (b97d51f by Timoth\u00e9e Mazzucotelli). Issue #106
"},{"location":"changelog/#170-2023-09-14","title":"1.7.0 - 2023-09-14","text":"

Compare with 1.6.3

"},{"location":"changelog/#features","title":"Features","text":"
  • Add option to unwrap Annotated types (53db04b by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#163-2023-09-11","title":"1.6.3 - 2023-09-11","text":"

Compare with 1.6.2

"},{"location":"changelog/#bug-fixes_5","title":"Bug Fixes","text":"
  • Make load_external_modules a global-only option (266f41f by Timoth\u00e9e Mazzucotelli). Issue #87
  • Never fail when trying to format code with Black (df24bbc by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#code-refactoring_3","title":"Code Refactoring","text":"
  • Wrap docstring section elements (list style) in code tags to prevent spell checker errors (1ae8dd8 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#162-2023-09-05","title":"1.6.2 - 2023-09-05","text":"

Compare with 1.6.1

"},{"location":"changelog/#bug-fixes_6","title":"Bug Fixes","text":"
  • Don't render cross-ref spans when they're not enabled (eed51ee by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#161-2023-09-04","title":"1.6.1 - 2023-09-04","text":"

Compare with 1.6.0

"},{"location":"changelog/#bug-fixes_7","title":"Bug Fixes","text":"
  • Fix spacing for rendered named items in Yields, Receives and Returns sections (list style) (e12688e by Timoth\u00e9e Mazzucotelli).
  • Fix rendering Receives sections as lists (9ff7e68 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#160-2023-08-27","title":"1.6.0 - 2023-08-27","text":"

Compare with 1.5.2

"},{"location":"changelog/#features_1","title":"Features","text":"
  • Add doc-signature CSS class to separate signature code blocks (b6c648f by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#code-refactoring_4","title":"Code Refactoring","text":"
  • Add a format_attribute filter, preparing for cross-refs in attribute signatures (8f0ade2 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#152-2023-08-25","title":"1.5.2 - 2023-08-25","text":"

Compare with 1.5.1

"},{"location":"changelog/#bug-fixes_8","title":"Bug Fixes","text":"
  • Regression in children template: fix condition for when members are specified (beeebff by Timoth\u00e9e Mazzucotelli). Issue #100
  • Prevent whitespace removal before highlight filter (c6f36c0 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#code-refactoring_5","title":"Code Refactoring","text":"
  • Never show full object path in ToC entry (9aa758b by Timoth\u00e9e Mazzucotelli).
  • Sync templates with insiders, remove useless lines (38b317f by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#151-2023-08-24","title":"1.5.1 - 2023-08-24","text":"

Compare with 1.5.0

"},{"location":"changelog/#code-refactoring_6","title":"Code Refactoring","text":"
  • Never show full path in separate signature since it would appear in the heading already (9e02049 by Timoth\u00e9e Mazzucotelli).
  • Improve guessing whether an object is public (35eb811 by Timoth\u00e9e Mazzucotelli).
  • Always sort modules alphabetically as source order wouldn't make sense (70c81ce by Timoth\u00e9e Mazzucotelli).
  • Return anchors as a tuple, not a set, to preserve order (736a2b5 by Timoth\u00e9e Mazzucotelli). Related-to #mkdocstrings/crystal#6
"},{"location":"changelog/#150-2023-08-20","title":"1.5.0 - 2023-08-20","text":"

Compare with 1.4.0

"},{"location":"changelog/#features_2","title":"Features","text":"
  • Add support for new Griffe docstring sections: modules, classes, and functions (methods) (d5337af by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#140-2023-08-18","title":"1.4.0 - 2023-08-18","text":"

Compare with 1.3.0

"},{"location":"changelog/#features_3","title":"Features","text":"
  • Support new Griffe expressions (in v0.33) (9b8e1b1 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#code-refactoring_7","title":"Code Refactoring","text":"
  • Deprecate crossref and multi_crossref filters (4fe3d20 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#130-2023-08-06","title":"1.3.0 - 2023-08-06","text":"

Compare with 1.2.1

"},{"location":"changelog/#dependencies","title":"Dependencies","text":"
  • Set upper bound on Griffe (0.33) (ad8c2a3 by Timoth\u00e9e Mazzucotelli). See https://github.com/mkdocstrings/griffe/discussions/195.
"},{"location":"changelog/#features_4","title":"Features","text":"
  • Show parameter default values within the \"list\" section style too (55f08f3 by Antoine Dechaume). PR #92, Co-authored-by: Timoth\u00e9e Mazzucotelli pawamoy@pm.me
"},{"location":"changelog/#121-2023-07-20","title":"1.2.1 - 2023-07-20","text":"

Compare with 1.2.0

"},{"location":"changelog/#bug-fixes_9","title":"Bug Fixes","text":"
  • Fix members ordering when members are specified with a boolean (c69f9c3 by Timoth\u00e9e Mazzucotelli). Issue #89
"},{"location":"changelog/#120-2023-07-14","title":"1.2.0 - 2023-07-14","text":"

Compare with 1.1.2

"},{"location":"changelog/#features_5","title":"Features","text":"
  • Add Jinja blocks to module, class, function and attribute templates (299fe48 by Timoth\u00e9e Mazzucotelli).
  • Setup infrastructure for I18N, add translations for simplified chinese and japanese (b053b29 by Nyuan Zhang). PR #77
  • Support inheritance (ae42356 by Timoth\u00e9e Mazzucotelli). Issue mkdocstrings#157, Discussion mkdocstrings#536
"},{"location":"changelog/#bug-fixes_10","title":"Bug Fixes","text":"
  • Don't show None as return annotation of class signatures (3d8724e by Timoth\u00e9e Mazzucotelli). Issue #85
  • Show labels in deterministic order (02619a8 by Oleh Prypin).
"},{"location":"changelog/#112-2023-06-04","title":"1.1.2 - 2023-06-04","text":"

Compare with 1.1.1

"},{"location":"changelog/#code-refactoring_8","title":"Code Refactoring","text":"
  • Keep headings style consistent (CSS) (92032e5 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#111-2023-06-04","title":"1.1.1 - 2023-06-04","text":"

Compare with 1.1.0

"},{"location":"changelog/#bug-fixes_11","title":"Bug Fixes","text":"
  • Fix mkdocs and readthedocs themes support (14f18b2 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#code-refactoring_9","title":"Code Refactoring","text":"
  • Improve display of paragraphs in docstring sections (439f5e6 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#110-2023-05-25","title":"1.1.0 - 2023-05-25","text":"

Compare with 1.0.0

"},{"location":"changelog/#features_6","title":"Features","text":"
  • Support custom templates through objects' extra data (8ff2b06 by Timoth\u00e9e Mazzucotelli). PR #70
"},{"location":"changelog/#100-2023-05-11","title":"1.0.0 - 2023-05-11","text":"

Compare with 0.10.1

"},{"location":"changelog/#breaking-changes","title":"Breaking changes","text":"
  • The signature of the format_signature filter has changed. If you override templates in your project to customize the output, make sure to update the following templates so that they use the new filter signature:

    • class.html
    • expression.html
    • function.html
    • signature.html

    You can see how to use the filter in this commit's changes: f686f4e4.

We take this as an opportunity to go out of beta and bump the version to 1.0.0. This will allow users to rely on semantic versioning.

"},{"location":"changelog/#bug-fixes_12","title":"Bug Fixes","text":"
  • Bring compatibility with insiders signature crossrefs feature (f686f4e by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#0101-2023-05-07","title":"0.10.1 - 2023-05-07","text":"

Compare with 0.10.0

"},{"location":"changelog/#bug-fixes_13","title":"Bug Fixes","text":"
  • Format signatures with full-path names (685512d by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#0100-2023-05-07","title":"0.10.0 - 2023-05-07","text":"

Compare with 0.9.0

"},{"location":"changelog/#features_7","title":"Features","text":"
  • Add option to disallow inspection (40f2f26 by Nyuan Zhang). Issue #68, PR #69
"},{"location":"changelog/#bug-fixes_14","title":"Bug Fixes","text":"
  • Make admonitions open by default (79cd153 by Timoth\u00e9e Mazzucotelli). Issue #22
"},{"location":"changelog/#code-refactoring_10","title":"Code Refactoring","text":"
  • Match documented behavior for filtering (all members, list, none) (c7f70c3 by Timoth\u00e9e Mazzucotelli).
  • Switch to an info level log for when black's not installed (f593bb0 by Faster Speeding).
  • Return anchors as a set (e2b820c by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#090-2023-04-03","title":"0.9.0 - 2023-04-03","text":"

Compare with 0.8.3

"},{"location":"changelog/#features_8","title":"Features","text":"
  • Allow resolving alias to external modules (02052e2 by Gilad). PR #61, Follow-up of PR #60
  • Allow pre-loading modules (36002cb by Gilad). Issue mkdocstrings/mkdocstrings#503, PR #60
  • Add show options for docstrings (a6c55fb by Jeremy Goh). Issue mkdocstrings/mkdocstrings#466, PR #56
  • Allow custom list of domains for inventories (f5ea6fd by Sorin Sbarnea). Issue mkdocstrings/mkdocstrings#510, PR #49
"},{"location":"changelog/#bug-fixes_15","title":"Bug Fixes","text":"
  • Prevent alias resolution error when searching for anchors (a190e2c by Timoth\u00e9e Mazzucotelli). Issue #64
"},{"location":"changelog/#code-refactoring_11","title":"Code Refactoring","text":"
  • Support Griffe 0.26 (075735c by Timoth\u00e9e Mazzucotelli).
  • Log (debug) unresolved aliases (9164742 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#083-2023-01-04","title":"0.8.3 - 2023-01-04","text":"

Compare with 0.8.2

"},{"location":"changelog/#code-refactoring_12","title":"Code Refactoring","text":"
  • Change \"unresolved aliases\" log level to DEBUG (dccb818 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#082-2022-11-19","title":"0.8.2 - 2022-11-19","text":"

Compare with 0.8.1

"},{"location":"changelog/#bug-fixes_16","title":"Bug Fixes","text":"
  • Fix base directory used to expand globs (34cfa4b by Florian Hofer). PR #45
"},{"location":"changelog/#081-2022-11-19","title":"0.8.1 - 2022-11-19","text":"

Compare with 0.8.0

"},{"location":"changelog/#bug-fixes_17","title":"Bug Fixes","text":"
  • Expand globs relative to configuration file path (0dc45ae by David Vegh). Issue #42, PR #43
"},{"location":"changelog/#080-2022-11-13","title":"0.8.0 - 2022-11-13","text":"

Compare with 0.7.1

"},{"location":"changelog/#features_9","title":"Features","text":"
  • Add support for globs in paths configuration (29edd02 by Andrew Guenther). Issue #33, PR #34
"},{"location":"changelog/#code-refactoring_13","title":"Code Refactoring","text":"
  • Support Griffe 0.24 (3b9f701 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#071-2022-06-12","title":"0.7.1 - 2022-06-12","text":"

Compare with 0.7.0

"},{"location":"changelog/#bug-fixes_18","title":"Bug Fixes","text":"
  • Fix rendering of / in signatures (3e927e4 by Timoth\u00e9e Mazzucotelli). Issue #25
"},{"location":"changelog/#070-2022-05-28","title":"0.7.0 - 2022-05-28","text":"

Compare with 0.6.6

"},{"location":"changelog/#packaging-dependencies","title":"Packaging / Dependencies","text":"
  • Depend on mkdocstrings 0.19 (b6a9a47 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#features_10","title":"Features","text":"
  • Add config option for annotations paths verbosity (b6c9893 by Timoth\u00e9e Mazzucotelli).
  • Use sections titles in SpaCy-styled docstrings (fe16b54 by Timoth\u00e9e Mazzucotelli).
  • Wrap objects names in spans to allow custom styling (0822ff9 by Timoth\u00e9e Mazzucotelli). Issue mkdocstrings/mkdocstrings#240
  • Add Jinja blocks around docstring section styles (aaa79ee by Timoth\u00e9e Mazzucotelli).
  • Add members and filters options (24a6136 by Timoth\u00e9e Mazzucotelli).
  • Add paths option (dd41182 by Timoth\u00e9e Mazzucotelli). Issue mkdocstrings/mkdocstrings#311, PR #20
"},{"location":"changelog/#bug-fixes_19","title":"Bug Fixes","text":"
  • Fix CSS class on labels (312a709 by Timoth\u00e9e Mazzucotelli).
  • Fix categories rendering (6407cf4 by Timoth\u00e9e Mazzucotelli). Issue #14
"},{"location":"changelog/#code-refactoring_14","title":"Code Refactoring","text":"
  • Disable show_submodules by default (480d0c3 by Timoth\u00e9e Mazzucotelli).
  • Merge default configuration options in handler (347ce76 by Timoth\u00e9e Mazzucotelli).
  • Reduce number of template debug logs (8fed314 by Timoth\u00e9e Mazzucotelli).
  • Respect show_root_full_path for ToC entries (hidden headings) (8f4c853 by Timoth\u00e9e Mazzucotelli).
  • Bring consistency on headings style (59104c4 by Timoth\u00e9e Mazzucotelli).
  • Stop using deprecated base classes (d5ea1c5 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#066-2022-03-06","title":"0.6.6 - 2022-03-06","text":"

Compare with 0.6.5

"},{"location":"changelog/#code-refactoring_15","title":"Code Refactoring","text":"
  • Always hide self and cls parameters (7f579d1 by Timoth\u00e9e Mazzucotelli). Issue #7
  • Use pycon for examples code blocks (6545900 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#065-2022-02-24","title":"0.6.5 - 2022-02-24","text":"

Compare with 0.6.4

"},{"location":"changelog/#bug-fixes_20","title":"Bug Fixes","text":"
  • Don't escape signatures return annotations (ac54bfc by Timoth\u00e9e Mazzucotelli). Issue #6
"},{"location":"changelog/#064-2022-02-22","title":"0.6.4 - 2022-02-22","text":"

Compare with 0.6.3

"},{"location":"changelog/#bug-fixes_21","title":"Bug Fixes","text":"
  • Fix rendering of signature return annotation (b92ba3b by Timoth\u00e9e Mazzucotelli). Issue #4
"},{"location":"changelog/#063-2022-02-20","title":"0.6.3 - 2022-02-20","text":"

Compare with 0.6.2

"},{"location":"changelog/#bug-fixes_22","title":"Bug Fixes","text":"
  • Fix examples rendering (a06a7e3 by Timoth\u00e9e Mazzucotelli). Issue mkdocstrings/griffe#46
"},{"location":"changelog/#062-2022-02-17","title":"0.6.2 - 2022-02-17","text":"

Compare with 0.6.1

"},{"location":"changelog/#bug-fixes_23","title":"Bug Fixes","text":"
  • Catch alias resolution errors (b734dd0 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#061-2022-02-17","title":"0.6.1 - 2022-02-17","text":"

Compare with 0.6.0

"},{"location":"changelog/#bug-fixes_24","title":"Bug Fixes","text":"
  • Don't pop from fallback config (bde32af by Timoth\u00e9e Mazzucotelli).
  • Fix rendering init method source when merged into class (4a20aea by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#060-2022-02-13","title":"0.6.0 - 2022-02-13","text":"

Compare with 0.5.4

"},{"location":"changelog/#features_11","title":"Features","text":"
  • Add option to merge __init__ methods' docstrings into their classes' docstrings (1b4d1c0 by Timoth\u00e9e Mazzucotelli).
  • Support separate attribute signature (e962b88 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#bug-fixes_25","title":"Bug Fixes","text":"
  • Restore full cross-refs paths on hover (ac11970 by Timoth\u00e9e Mazzucotelli).
  • Fix rendering of labels (52919c5 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#code-refactoring_16","title":"Code Refactoring","text":"
  • Don't add trailing parentheses in functions heading when separate signature (885696e by Timoth\u00e9e Mazzucotelli).
  • Use more explicit template debug messages (f2122d7 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#054-2022-02-13","title":"0.5.4 - 2022-02-13","text":"

Compare with 0.5.3

"},{"location":"changelog/#bug-fixes_26","title":"Bug Fixes","text":"
  • Don't load additional modules during fallback (69b8e25 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#053-2022-02-08","title":"0.5.3 - 2022-02-08","text":"

Compare with 0.5.2

"},{"location":"changelog/#bug-fixes_27","title":"Bug Fixes","text":"
  • Allow passing null as docstring style (f526816 by Timoth\u00e9e Mazzucotelli). Issue #2
"},{"location":"changelog/#052-2022-02-05","title":"0.5.2 - 2022-02-05","text":"

Compare with 0.5.1

"},{"location":"changelog/#dependencies_1","title":"Dependencies","text":"
  • Require at least mkdocstrings 0.18 (7abdda4 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#051-2022-02-03","title":"0.5.1 - 2022-02-03","text":"

Compare with 0.5.0

"},{"location":"changelog/#dependencies_2","title":"Dependencies","text":"
  • Depend on Griffe >= 0.11.1 (1303557 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#code-refactoring_17","title":"Code Refactoring","text":"
  • Move handler into its own module (b787e78 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#050-2022-02-03","title":"0.5.0 - 2022-02-03","text":"

Compare with 0.4.1

"},{"location":"changelog/#features_12","title":"Features","text":"
  • Allow changing docstring style of an object (39240c1 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#bug-fixes_28","title":"Bug Fixes","text":"
  • Warn if Black is not installed when formatting signature (b848277 by Timoth\u00e9e Mazzucotelli).
  • Fix missing default for docstring_section_style option (774988e by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#code-refactoring_18","title":"Code Refactoring","text":"
  • Change to new way of stripping paragraphs (33d4594 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#041-2022-02-01","title":"0.4.1 - 2022-02-01","text":"

Compare with 0.4.0

"},{"location":"changelog/#bug-fixes_29","title":"Bug Fixes","text":"
  • Fix docstring admonitions rendering (a24ae2e by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#040-2022-02-01","title":"0.4.0 - 2022-02-01","text":"

Compare with 0.3.0

"},{"location":"changelog/#code-refactoring_19","title":"Code Refactoring","text":"
  • Use the new mkdocstrings_handlers namespace (23c9023 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#030-2022-01-14","title":"0.3.0 - 2022-01-14","text":"

Compare with 0.2.0

"},{"location":"changelog/#features_13","title":"Features","text":"
  • Support griffe 0.10 (28061de by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#dependencies_3","title":"Dependencies","text":"
  • Require griffe 0.10 (cfbd7bb by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#code-refactoring_20","title":"Code Refactoring","text":"
  • Use new logger patching utility (4cdb292 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#020-2021-12-28","title":"0.2.0 - 2021-12-28","text":"

Compare with 0.1.0

"},{"location":"changelog/#dependencies_4","title":"Dependencies","text":"
  • Depend on griffe >= 0.7.1 (34f7ebd by Timoth\u00e9e Mazzucotelli).
  • Upgrade griffe, no upper bound (8f0aa42 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#features_14","title":"Features","text":"
  • Add show_signature rendering option (0f07c2e by Will Da Silva).
"},{"location":"changelog/#bug-fixes_30","title":"Bug Fixes","text":"
  • Fix templates for named docstring elements (47868a1 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#010-2021-12-19","title":"0.1.0 - 2021-12-19","text":"

Compare with first commit

"},{"location":"changelog/#features_15","title":"Features","text":"
  • Implement handler and add templates (dbb580a by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#bug-fixes_31","title":"Bug Fixes","text":"
  • Fix separate signature feature (da6e81c by Timoth\u00e9e Mazzucotelli).
  • Fix signature template (parameters annotations) (b34ead0 by Timoth\u00e9e Mazzucotelli).
  • Only show source when present (c270d68 by Timoth\u00e9e Mazzucotelli).
"},{"location":"changelog/#code-refactoring_21","title":"Code Refactoring","text":"
  • Return all known anchors (9bbfe14 by Timoth\u00e9e Mazzucotelli).
  • Update for griffe 0.4.0 (831aabb by Timoth\u00e9e Mazzucotelli).
"},{"location":"code_of_conduct/","title":"Contributor Covenant Code of Conduct","text":""},{"location":"code_of_conduct/#our-pledge","title":"Our Pledge","text":"

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

"},{"location":"code_of_conduct/#our-standards","title":"Our Standards","text":"

Examples of behavior that contributes to a positive environment for our community include:

  • Demonstrating empathy and kindness toward other people
  • Being respectful of differing opinions, viewpoints, and experiences
  • Giving and gracefully accepting constructive feedback
  • Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
  • Focusing on what is best not just for us as individuals, but for the overall community

Examples of unacceptable behavior include:

  • The use of sexualized language or imagery, and sexual attention or advances of any kind
  • Trolling, insulting or derogatory comments, and personal or political attacks
  • Public or private harassment
  • Publishing others' private information, such as a physical or email address, without their explicit permission
  • Other conduct which could reasonably be considered inappropriate in a professional setting
"},{"location":"code_of_conduct/#enforcement-responsibilities","title":"Enforcement Responsibilities","text":"

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

"},{"location":"code_of_conduct/#scope","title":"Scope","text":"

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

"},{"location":"code_of_conduct/#enforcement","title":"Enforcement","text":"

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at pawamoy@pm.me. All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

"},{"location":"code_of_conduct/#enforcement-guidelines","title":"Enforcement Guidelines","text":"

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

"},{"location":"code_of_conduct/#1-correction","title":"1. Correction","text":"

Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

"},{"location":"code_of_conduct/#2-warning","title":"2. Warning","text":"

Community Impact: A violation through a single incident or series of actions.

Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

"},{"location":"code_of_conduct/#3-temporary-ban","title":"3. Temporary Ban","text":"

Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

"},{"location":"code_of_conduct/#4-permanent-ban","title":"4. Permanent Ban","text":"

Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

Consequence: A permanent ban from any sort of public interaction within the community.

"},{"location":"code_of_conduct/#attribution","title":"Attribution","text":"

This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.

Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

"},{"location":"contributing/","title":"Contributing","text":"

Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given.

"},{"location":"contributing/#environment-setup","title":"Environment setup","text":"

Nothing easier!

Fork and clone the repository, then:

cd python\nmake setup\n

Note

If it fails for some reason, you'll need to install PDM manually.

You can install it with:

python3 -m pip install --user pipx\npipx install pdm\n

Now you can try running make setup again, or simply pdm install.

You now have the dependencies installed.

Run make help to see all the available actions!

"},{"location":"contributing/#tasks","title":"Tasks","text":"

This project uses duty to run tasks. A Makefile is also provided. The Makefile will try to run certain tasks on multiple Python versions. If for some reason you don't want to run the task on multiple Python versions, you run the task directly with pdm run duty TASK.

The Makefile detects if a virtual environment is activated, so make will work the same with the virtualenv activated or not.

If you work in VSCode, we provide an action to configure VSCode for the project.

"},{"location":"contributing/#development","title":"Development","text":"

As usual:

  1. create a new branch: git switch -c feature-or-bugfix-name
  2. edit the code and/or the documentation

Before committing:

  1. run make format to auto-format the code
  2. run make check to check everything (fix any warning)
  3. run make test to run the tests (fix any issue)
  4. if you updated the documentation or the project dependencies:
    1. run make docs
    2. go to http://localhost:8000 and check that everything looks good
  5. follow our commit message convention

If you are unsure about how to fix or ignore a warning, just let the continuous integration fail, and we will help you during review.

Don't bother updating the changelog, we will take care of this.

"},{"location":"contributing/#commit-message-convention","title":"Commit message convention","text":"

Commit messages must follow our convention based on the Angular style or the Karma convention:

<type>[(scope)]: Subject\n\n[Body]\n

Subject and body must be valid Markdown. Subject must have proper casing (uppercase for first letter if it makes sense), but no dot at the end, and no punctuation in general.

Scope and body are optional. Type can be:

  • build: About packaging, building wheels, etc.
  • chore: About packaging or repo/files management.
  • ci: About Continuous Integration.
  • deps: Dependencies update.
  • docs: About documentation.
  • feat: New feature.
  • fix: Bug fix.
  • perf: About performance.
  • refactor: Changes that are not features or bug fixes.
  • style: A change in code style/format.
  • tests: About tests.

If you write a body, please add trailers at the end (for example issues and PR references, or co-authors), without relying on GitHub's flavored Markdown:

Body.\n\nIssue #10: https://github.com/namespace/project/issues/10\nRelated to PR namespace/other-project#15: https://github.com/namespace/other-project/pull/15\n

These \"trailers\" must appear at the end of the body, without any blank lines between them. The trailer title can contain any character except colons :. We expect a full URI for each trailer, not just GitHub autolinks (for example, full GitHub URLs for commits and issues, not the hash or the #issue-number).

We do not enforce a line length on commit messages summary and body, but please avoid very long summaries, and very long lines in the body, unless they are part of code blocks that must not be wrapped.

"},{"location":"contributing/#pull-requests-guidelines","title":"Pull requests guidelines","text":"

Link to any related issue in the Pull Request message.

During the review, we recommend using fixups:

# SHA is the SHA of the commit you want to fix\ngit commit --fixup=SHA\n

Once all the changes are approved, you can squash your commits:

git rebase -i --autosquash main\n

And force-push:

git push -f\n

If this seems all too complicated, you can push or force-push each new commit, and we will squash them ourselves if needed, before merging.

"},{"location":"credits/","title":"Credits","text":""},{"location":"credits/#exec-1--credits","title":"Credits","text":"

These projects were used to build mkdocstrings-python. Thank you!

python | pdm | copier-pdm

"},{"location":"credits/#exec-1--runtime-dependencies","title":"Runtime dependencies","text":"Project Summary Version (accepted) Version (last resolved) License click Composable command line interface toolkit >=7.0 8.1.7 BSD-3-Clause colorama Cross-platform colored terminal text. >=0.4 0.4.6 BSD License ghp-import Copy your docs directly to the gh-pages branch. >=1.0 2.1.0 Apache Software License griffe Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API. >=0.37 0.37.0 ISC importlib-metadata Read metadata from Python packages >=4.6; python_version < \"3.10\" 6.8.0 ? jinja2 A very fast and expressive template engine. >=2.11.1 3.1.2 BSD-3-Clause markdown Python implementation of John Gruber's Markdown. >=3.3 3.5.1 BSD License markupsafe Safely add untrusted strings to HTML/XML markup. >=1.1 2.1.3 BSD-3-Clause mergedeep A deep merge function for \ud83d\udc0d. >=1.3.4 1.3.4 MIT License mkdocs Project documentation with Markdown. >=1.2 1.5.3 BSD License mkdocs-autorefs Automatically link across pages in MkDocs. >=0.3.1 0.5.0 ISC mkdocstrings Automatic documentation from sources, for MkDocs. >=0.20 0.23.0 ISC packaging Core utilities for Python packages >=20.5 23.2 BSD License pathspec Utility library for gitignore style pattern matching of file paths. >=0.11.1 0.11.2 Mozilla Public License 2.0 (MPL 2.0) platformdirs A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\". >=2.2.0 4.0.0 MIT License pymdown-extensions Extension pack for Python Markdown. >=6.3 10.4 MIT License python-dateutil Extensions to the standard Python datetime module >=2.8.1 2.8.2 Dual License pyyaml YAML parser and emitter for Python 6.0.1 MIT pyyaml-env-tag A custom YAML tag for referencing environment variables in YAML files. >=0.1 0.1 MIT License six Python 2 and 3 compatibility utilities >=1.5 1.16.0 MIT typing-extensions Backported and Experimental Type Hints for Python 3.8+ >=4.1; python_version < \"3.10\" 4.8.0 Python Software Foundation License watchdog Filesystem events monitoring >=2.0 3.0.0 Apache License 2.0 zipp Backport of pathlib-compatible object wrapper for zip files >=0.5 3.17.0 ?"},{"location":"credits/#exec-1--development-dependencies","title":"Development dependencies","text":"Project Summary Version (accepted) Version (last resolved) License ansimarkup Produce colored terminal text with an xml-like markup ~=1.4 1.5.0 Revised BSD License appdirs A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\". >=1.4 1.4.4 MIT babel Internationalization utilities ~=2.10 2.13.1 BSD-3-Clause black The uncompromising code formatter. >=23.9 23.11.0 MIT blacken-docs Run Black on Python code blocks in documentation files. >=1.16 1.16.0 MIT certifi Python package for providing Mozilla's CA Bundle. >=2017.4.17 2023.7.22 MPL-2.0 charset-normalizer The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. <4,>=2 3.3.2 MIT click Composable command line interface toolkit >=8.0.0 8.1.7 BSD-3-Clause colorama Cross-platform colored terminal text. ; platform_system == \"Windows\" 0.4.6 BSD License coverage Code coverage measurement for Python [toml]>=5.2.1 7.3.2 Apache-2.0 csscompressor A python port of YUI CSS Compressor >=0.9.5 0.9.5 BSD dparse A parser for Python dependency files >=0.6.2 0.6.3 MIT license duty A simple task runner. >=0.10 1.1.0 ISC exceptiongroup Backport of PEP 654 (exception groups) >=1.0.0rc8; python_version < \"3.11\" 1.1.3 ? execnet execnet: rapid multi-Python deployment >=1.1 2.0.2 MIT License failprint Run a command, print its output only if it fails. !=1.0.0,>=0.11 1.0.2 ISC ghp-import Copy your docs directly to the gh-pages branch. >=1.0 2.1.0 Apache Software License git-changelog Automatic Changelog generator using Jinja2 templates. >=2.3 2.4.0 ISC gitdb Git Object Database <5,>=4.0.1 4.0.11 BSD License gitpython GitPython is a Python library used to interact with Git repositories 3.1.40 BSD htmlmin2 An HTML Minifier >=0.1.13 0.1.13 BSD idna Internationalized Domain Names in Applications (IDNA) <4,>=2.5 3.4 BSD License importlib-metadata Read metadata from Python packages >=4.3; python_version < \"3.10\" 6.8.0 ? iniconfig brain-dead simple config-ini parsing 2.0.0 MIT License jinja2 A very fast and expressive template engine. <4,>=2.11 3.1.2 BSD-3-Clause jsmin JavaScript minifier. >=3.0.1 3.0.1 MIT License markdown Python implementation of John Gruber's Markdown. <4.0.0,>=3.3.3 3.5.1 BSD License markdown-callouts Markdown extension: a classier syntax for admonitions >=0.3 0.3.0 MIT markdown-exec Utilities to execute code blocks in Markdown files. >=1.7 1.7.0.1.0.1 ISC markupsafe Safely add untrusted strings to HTML/XML markup. >=2.0 2.1.3 BSD-3-Clause mergedeep A deep merge function for \ud83d\udc0d. >=1.3.4 1.3.4 MIT License mkdocs Project documentation with Markdown. >=1.5 1.5.3 BSD License mkdocs-coverage MkDocs plugin to integrate your coverage HTML report into your site. >=1.0 1.0.0 ISC mkdocs-gen-files MkDocs plugin to programmatically generate documentation pages during the build >=0.5 0.5.0 MIT License mkdocs-git-committers-plugin-2 An MkDocs plugin to create a list of contributors on the page. The git-committers plugin will seed the template context with a list of GitHub or GitLab committers and other useful GIT info such as last modified date >=1.2 2.2.2 MIT mkdocs-literate-nav MkDocs plugin to specify the navigation in Markdown instead of YAML >=0.6 0.6.1 MIT License mkdocs-material Documentation that simply works >=9.4 9.4.8+insiders.4.43.0 MIT License mkdocs-material-extensions Extension pack for Python Markdown and MkDocs Material. ~=1.3 1.3 MIT License mkdocs-minify-plugin An MkDocs plugin to minify HTML, JS or CSS files prior to being written to disk >=0.7 0.7.1 MIT mypy Optional static typing for Python >=1.5 1.7.0 MIT mypy-extensions Type system extensions for programs checked with the mypy type checker. >=0.4.3 1.0.0 MIT License packaging Core utilities for Python packages >=22.0 23.2 BSD License paginate Divides large result sets into pages for easier browsing ~=0.5 0.5.6 MIT pathspec Utility library for gitignore style pattern matching of file paths. >=0.9.0 0.11.2 Mozilla Public License 2.0 (MPL 2.0) platformdirs A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\". >=2 4.0.0 MIT License pluggy plugin and hook calling mechanisms for python <2.0,>=0.12 1.3.0 MIT ptyprocess Run a subprocess in a pseudo terminal ~=0.6; sys_platform != \"win32\" 0.7.0 ISC License (ISCL) pygments Pygments is a syntax highlighting package written in Python. ~=2.16 2.16.1 BSD-2-Clause pymdown-extensions Extension pack for Python Markdown. >=9 10.4 MIT License pytest pytest: simple powerful testing with Python >=7.4 7.4.3 MIT pytest-cov Pytest plugin for measuring coverage. >=4.1 4.1.0 MIT pytest-randomly Pytest plugin to randomly order tests and control random.seed. >=3.15 3.15.0 MIT pytest-xdist pytest xdist plugin for distributed testing, most importantly across multiple CPUs >=3.3 3.4.0 MIT python-dateutil Extensions to the standard Python datetime module >=2.8.1 2.8.2 Dual License pytz World timezone definitions, modern and historical >=2015.7; python_version < \"3.9\" 2023.3.post1 ? pyyaml YAML parser and emitter for Python >=5.1 6.0.1 MIT pyyaml-env-tag A custom YAML tag for referencing environment variables in YAML files. >=0.1 0.1 MIT License regex Alternative regular expression module, to replace re. >=2022.4 2023.10.3 Apache Software License requests Python HTTP for Humans. 2.31.0 Apache 2.0 ruamel-yaml ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order >=0.17.21 0.18.5 MIT license ruamel-yaml-clib C version of reader, parser and emitter for ruamel.yaml derived from libyaml >=0.2.7; platform_python_implementation == \"CPython\" and python_version < \"3.13\" 0.2.8 MIT ruff An extremely fast Python linter and code formatter, written in Rust. >=0.0 0.1.5 MIT safety Checks installed dependencies for known vulnerabilities and licenses. >=2.3 2.3.4 MIT license semver Python helper for Semantic Versioning (https://semver.org) >=2.13 3.0.2 BSD setuptools Easily download, build, install, upgrade, and uninstall Python packages >=19.3 68.2.2 MIT License six Python 2 and 3 compatibility utilities >=1.5 1.16.0 MIT smmap A pure Python implementation of a sliding window memory map manager <6,>=3.0.1 5.0.1 BSD tomli A lil' TOML parser >=2.0; python_version < '3.11' 2.0.1 ? types-markdown Typing stubs for Markdown >=3.5 3.5.0.1 Apache-2.0 license types-pyyaml Typing stubs for PyYAML >=6.0 6.0.12.12 Apache-2.0 license typing-extensions Backported and Experimental Type Hints for Python 3.8+ >=4.0.1; python_version < \"3.11\" 4.8.0 Python Software Foundation License urllib3 HTTP library with thread-safe connection pooling, file post, and more. <3,>=1.21.1 2.0.7 MIT License watchdog Filesystem events monitoring >=2.0 3.0.0 Apache License 2.0 zipp Backport of pathlib-compatible object wrapper for zip files >=0.5 3.17.0 ?

More credits from the author

"},{"location":"license/","title":"License","text":"
ISC License\n\nCopyright (c) 2021, Timoth\u00e9e Mazzucotelli\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n
"},{"location":"insiders/","title":"Insiders","text":"

mkdocstrings-python follows the sponsorware release strategy, which means that new features are first exclusively released to sponsors as part of Insiders. Read on to learn what sponsorships achieve, how to become a sponsor to get access to Insiders, and what's in it for you!

"},{"location":"insiders/#what-is-insiders","title":"What is Insiders?","text":"

mkdocstrings-python Insiders is a private fork of mkdocstrings-python, hosted as a private GitHub repository. Almost1 all new features are developed as part of this fork, which means that they are immediately available to all eligible sponsors, as they are made collaborators of this repository.

Every feature is tied to a funding goal in monthly subscriptions. When a funding goal is hit, the features that are tied to it are merged back into mkdocstrings-python and released for general availability, making them available to all users. Bugfixes are always released in tandem.

Sponsorships start as low as $10 a month.2

"},{"location":"insiders/#what-sponsorships-achieve","title":"What sponsorships achieve","text":"

Sponsorships make this project sustainable, as they buy the maintainers of this project time \u2013 a very scarce resource \u2013 which is spent on the development of new features, bug fixing, stability improvement, issue triage and general support. The biggest bottleneck in Open Source is time.3

If you're unsure if you should sponsor this project, check out the list of completed funding goals to learn whether you're already using features that were developed with the help of sponsorships.

"},{"location":"insiders/#whats-in-it-for-me","title":"What's in it for me?","text":"

The moment you become a sponsor, you'll get immediate access to 7 additional features that you can start using right away, and which are currently exclusively available to sponsors:

  • griffe-inherited-docstrings \u2014 [Project] Griffe extension for inheriting docstrings
  • Automatic rendering of function signature overloads
  • Auto-summary of object members
  • griffe-typing-deprecated \u2014 [Project] Griffe extension for @typing.deprecated (PEP 702)
  • griffe-pydantic \u2014 [Project] Griffe extension for Pydantic
  • Symbol types in headings and table of contents
  • Cross-references for type annotations in signatures
"},{"location":"insiders/#how-to-become-a-sponsor","title":"How to become a sponsor","text":"

Thanks for your interest in sponsoring! In order to become an eligible sponsor with your GitHub account, visit pawamoy's sponsor profile, and complete a sponsorship of $10 a month or more. You can use your individual or organization GitHub account for sponsoring.

Important: If you're sponsoring @pawamoy through a GitHub organization, please send a short email to pawamoy@pm.me with the name of your organization and the GitHub account of the individual that should be added as a collaborator.4

You can cancel your sponsorship anytime.5

\u00a0 Join our awesome sponsors

If you sponsor publicly, you're automatically added here with a link to your profile and avatar to show your support for mkdocstrings-python. Alternatively, if you wish to keep your sponsorship private, you'll be a silent +1. You can select visibility during checkout and change it afterwards.

"},{"location":"insiders/#funding","title":"Funding","text":""},{"location":"insiders/#goals","title":"Goals","text":"

The following section lists all funding goals. Each goal contains a list of features prefixed with a checkmark symbol, denoting whether a feature is already available or planned, but not yet implemented. When the funding goal is hit, the features are released for general availability.

"},{"location":"insiders/#500-plasmavac-user-guide","title":"$ 500 \u2014 PlasmaVac User Guide","text":"
  • Cross-references for type annotations in signatures
  • Symbol types in headings and table of contents
  • griffe-inherited-docstrings \u2014 [Project] Griffe extension for inheriting docstrings
"},{"location":"insiders/#1000-gravifridge-user-manual","title":"$ 1,000 \u2014 GraviFridge User Manual","text":"
  • Auto-summary of object members
  • Automatic rendering of function signature overloads
  • griffe-pydantic \u2014 [Project] Griffe extension for Pydantic
  • griffe-typing-deprecated \u2014 [Project] Griffe extension for @typing.deprecated (PEP 702)
"},{"location":"insiders/#frequently-asked-questions","title":"Frequently asked questions","text":""},{"location":"insiders/#compatibility","title":"Compatibility","text":"

We're building an open source project and want to allow outside collaborators to use mkdocstrings-python locally without having access to Insiders. Is this still possible?

Yes. Insiders is compatible with mkdocstrings-python. Almost all new features and configuration options are either backward-compatible or implemented behind feature flags. Most Insiders features enhance the overall experience, though while these features add value for the users of your project, they shouldn't be necessary for previewing when making changes to content.

"},{"location":"insiders/#payment","title":"Payment","text":"

We don't want to pay for sponsorship every month. Are there any other options?

Yes. You can sponsor on a yearly basis by switching your GitHub account to a yearly billing cycle. If for some reason you cannot do that, you could also create a dedicated GitHub account with a yearly billing cycle, which you only use for sponsoring (some sponsors already do that).

If you have any problems or further questions, please reach out to pawamoy@pm.me.

"},{"location":"insiders/#terms","title":"Terms","text":"

Are we allowed to use Insiders under the same terms and conditions as mkdocstrings-python?

Yes. Whether you're an individual or a company, you may use mkdocstrings-python Insiders precisely under the same terms as mkdocstrings-python, which are given by the ISC License. However, we kindly ask you to respect our fair use policy:

  • Please don't distribute the source code of Insiders. You may freely use it for public, private or commercial projects, privately fork or mirror it, but please don't make the source code public, as it would counteract the sponsorware strategy.

  • If you cancel your subscription, you're automatically removed as a collaborator and will miss out on all future updates of Insiders. However, you may use the latest version that's available to you as long as you like. Just remember that GitHub deletes private forks.

  1. In general, every new feature is first exclusively released to sponsors, but sometimes upstream dependencies enhance existing features that must be supported by mkdocstrings-python.\u00a0\u21a9

  2. Note that $10 a month is the minimum amount to become eligible for Insiders. While GitHub Sponsors also allows to sponsor lower amounts or one-time amounts, those can't be granted access to Insiders due to technical reasons. Such contributions are still very much welcome as they help ensuring the project's sustainability.\u00a0\u21a9

  3. Making an Open Source project sustainable is exceptionally hard: maintainers burn out, projects are abandoned. That's not great and very unpredictable. The sponsorware model ensures that if you decide to use mkdocstrings-python, you can be sure that bugs are fixed quickly and new features are added regularly.\u00a0\u21a9

  4. It's currently not possible to grant access to each member of an organization, as GitHub only allows for adding users. Thus, after sponsoring, please send an email to pawamoy@pm.me, stating which account should become a collaborator of the Insiders repository. We're working on a solution which will make access to organizations much simpler. To ensure that access is not tied to a particular individual GitHub account, create a bot account (i.e. a GitHub account that is not tied to a specific individual), and use this account for the sponsoring. After being added to the list of collaborators, the bot account can create a private fork of the private Insiders GitHub repository, and grant access to all members of the organizations.\u00a0\u21a9

  5. If you cancel your sponsorship, GitHub schedules a cancellation request which will become effective at the end of the billing cycle. This means that even though you cancel your sponsorship, you will keep your access to Insiders as long as your cancellation isn't effective. All charges are processed by GitHub through Stripe. As we don't receive any information regarding your payment, and GitHub doesn't offer refunds, sponsorships are non-refundable.\u00a0\u21a9

"},{"location":"insiders/changelog/","title":"Changelog","text":""},{"location":"insiders/changelog/#mkdocstrings-python-insiders","title":"mkdocstrings-python Insiders","text":""},{"location":"insiders/changelog/#1.5.1","title":"1.5.1 September 12, 2023","text":"
  • Prevent empty auto-summarized Methods section.
"},{"location":"insiders/changelog/#1.5.0","title":"1.5.0 September 05, 2023","text":"
  • Render function signature overloads.
"},{"location":"insiders/changelog/#1.4.0","title":"1.4.0 August 27, 2023","text":"
  • Render cross-references in attribute signatures.
"},{"location":"insiders/changelog/#1.3.0","title":"1.3.0 August 24, 2023","text":"
  • Add \"method\" symbol type.
"},{"location":"insiders/changelog/#1.2.0","title":"1.2.0 August 20, 2023","text":"
  • Add member auto-summaries.
"},{"location":"insiders/changelog/#1.1.4","title":"1.1.4 July 17, 2023","text":"
  • Fix heading level increment for class members.
"},{"location":"insiders/changelog/#1.1.3","title":"1.1.3 July 17, 2023","text":"
  • Fix heading level (avoid with clause preventing to decrease it).
"},{"location":"insiders/changelog/#1.1.2","title":"1.1.2 July 15, 2023","text":"
  • Use non-breaking spaces after symbol types.
"},{"location":"insiders/changelog/#1.1.1","title":"1.1.1 June 27, 2023","text":"
  • Correctly escape expressions in signatures and other rendered types.
"},{"location":"insiders/changelog/#1.1.0","title":"1.1.0 June 4, 2023","text":"
  • Add Symbol types in headings and table of contents.
"},{"location":"insiders/changelog/#1.0.0","title":"1.0.0 May 10, 2023","text":"
  • Add cross-references for type annotations in signatures. Make sure to update your local templates as the signature of the format_signature filter has changed. The templates that must be updated: class.html, expression.html, function.html and signature.html.
"},{"location":"insiders/installation/","title":"Getting started with Insiders","text":"

mkdocstrings-python Insiders is a compatible drop-in replacement for mkdocstrings-python, and can be installed similarly using pip or git. Note that in order to access the Insiders repository, you need to become an eligible sponsor of @pawamoy on GitHub.

"},{"location":"insiders/installation/#installation","title":"Installation","text":""},{"location":"insiders/installation/#with-pypi-insiders","title":"with PyPI Insiders","text":"

PyPI Insiders is a tool that helps you keep up-to-date versions of Insiders projects in the PyPI index of your choice (self-hosted, Google registry, Artifactory, etc.).

See how to install it and how to use it.

"},{"location":"insiders/installation/#with-pip-sshhttps","title":"with pip (ssh/https)","text":"

mkdocstrings-python Insiders can be installed with pip using SSH:

pip install git+ssh://git@github.com/pawamoy-insiders/mkdocstrings-python.git\n

Or using HTTPS:

pip install git+https://${GH_TOKEN}@github.com/pawamoy-insiders/mkdocstrings-python.git\n
How to get a GitHub personal access token

The GH_TOKEN environment variable is a GitHub token. It can be obtained by creating a personal access token for your GitHub account. It will give you access to the Insiders repository, programmatically, from the command line or GitHub Actions workflows:

  1. Go to https://github.com/settings/tokens
  2. Click on Generate a new token
  3. Enter a name and select the repo scope
  4. Generate the token and store it in a safe place

Note that the personal access token must be kept secret at all times, as it allows the owner to access your private repositories.

"},{"location":"insiders/installation/#with-pip-self-hosted","title":"with pip (self-hosted)","text":"

Self-hosting the Insiders package makes it possible to depend on mkdocstrings-python normally, while transparently downloading and installing the Insiders version locally. It means that you can specify your dependencies normally, and your contributors without access to Insiders will get the public version, while you get the Insiders version on your machine.

Limitation

With this method, there is no way to force the installation of an Insiders version rather than a public version. If there is a public version that is more recent than your self-hosted Insiders version, the public version will take precedence. Remember to regularly update your self-hosted versions by uploading latest distributions.

You can build the distributions for Insiders yourself, by cloning the repository and using build to build the distributions, or you can download them from our GitHub Releases. You can upload these distributions to a private PyPI-like registry (Artifactory, Google Cloud, pypiserver, etc.) with Twine:

# download distributions in ~/dists, then upload with:\ntwine upload --repository-url https://your-private-index.com ~/dists/*\n

You might also need to provide a username and password/token to authenticate against the registry. Please check Twine's documentation.

You can then configure pip (or other tools) to look for packages into your package index. For example, with pip:

pip config set global.extra-index-url https://your-private-index.com/simple\n

Note that the URL might differ depending on whether your are uploading a package (with Twine) or installing a package (with pip), and depending on the registry you are using (Artifactory, Google Cloud, etc.). Please check the documentation of your registry to learn how to configure your environment.

We kindly ask that you do not upload the distributions to public registries, as it is against our Terms of use.

Full example with pypiserver

In this example we use pypiserver to serve a local PyPI index.

pip install --user pypiserver\n# or pipx install pypiserver\n\n# create a packages directory\nmkdir -p ~/.local/pypiserver/packages\n\n# run the pypi server without authentication\npypi-server run -p 8080 -a . -P . ~/.local/pypiserver/packages &\n

We can configure the credentials to access the server in ~/.pypirc:

.pypirc
[distutils]\nindex-servers =\n    local\n\n[local]\nrepository: http://localhost:8080\nusername:\npassword:\n

We then clone the Insiders repository, build distributions and upload them to our local server:

# clone the repository\ngit clone git@github.com:pawamoy-insiders/mkdocstrings-python\ncd python\n\n# install build\npip install --user build\n# or pipx install build\n\n# checkout latest tag\ngit checkout $(git describe --tags --abbrev=0)\n\n# build the distributions\npyproject-build\n\n# upload them to our local server\ntwine upload -r local dist/* --skip-existing\n

Finally, we configure pip, and for example PDM, to use our local index to find packages:

pip config set global.extra-index-url http://localhost:8080/simple\npdm config pypi.extra.url http://localhost:8080/simple\n

Now when running pip install mkdocstrings-python, or resolving dependencies with PDM, both tools will look into our local index and find the Insiders version. Remember to update your local index regularly!

"},{"location":"insiders/installation/#with-git","title":"with git","text":"

Of course, you can use mkdocstrings-python Insiders directly from git:

git clone git@github.com:pawamoy-insiders/mkdocstrings-python\n

When cloning from git, the package must be installed:

pip install -e python\n
"},{"location":"insiders/installation/#upgrading","title":"Upgrading","text":"

When upgrading Insiders, you should always check the version of mkdocstrings-python which makes up the first part of the version qualifier. For example, a version like 8.x.x.4.x.x means that Insiders 4.x.x is currently based on 8.x.x.

If the major version increased, it's a good idea to consult the changelog and go through the steps to ensure your configuration is up to date and all necessary changes have been made.

"},{"location":"reference/SUMMARY/","title":"SUMMARY","text":"
  • mkdocstrings_handlers
    • python
      • debug
      • handler
      • rendering
"},{"location":"reference/mkdocstrings_handlers/python/","title":"Index","text":""},{"location":"reference/mkdocstrings_handlers/python/#mkdocstrings_handlers.python","title":"python","text":"

This package implements a handler for the Python language.

Modules:

  • debug \u2013

    Debugging utilities.

  • handler \u2013

    This module implements a handler for the Python language.

  • rendering \u2013

    This module implements rendering utilities.

Functions:

  • get_handler \u2013

    Simply return an instance of PythonHandler.

"},{"location":"reference/mkdocstrings_handlers/python/#mkdocstrings_handlers.python.get_handler","title":"get_handler","text":"
get_handler(\n    *,\n    theme: str,\n    custom_templates: str | None = None,\n    config_file_path: str | None = None,\n    paths: list[str] | None = None,\n    locale: str = \"en\",\n    load_external_modules: bool = False,\n    **config: Any\n) -> PythonHandler\n

Simply return an instance of PythonHandler.

Parameters:

  • theme (str) \u2013

    The theme to use when rendering contents.

  • custom_templates (str | None, default: None ) \u2013

    Directory containing custom templates.

  • config_file_path (str | None, default: None ) \u2013

    The MkDocs configuration file path.

  • paths (list[str] | None, default: None ) \u2013

    A list of paths to use as Griffe search paths.

  • locale (str, default: 'en' ) \u2013

    The locale to use when rendering content.

  • load_external_modules (bool, default: False ) \u2013

    Load external modules when resolving aliases.

  • **config (Any, default: {} ) \u2013

    Configuration passed to the handler.

Returns:

  • PythonHandler \u2013

    An instance of PythonHandler.

"},{"location":"reference/mkdocstrings_handlers/python/debug/","title":" debug","text":""},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug","title":"debug","text":"

Debugging utilities.

Classes:

  • Environment \u2013

    Dataclass to store environment information.

  • Package \u2013

    Dataclass describing a Python package.

  • Variable \u2013

    Dataclass describing an environment variable.

Functions:

  • get_debug_info \u2013

    Get debug/environment information.

  • get_version \u2013

    Get version of the given distribution.

  • print_debug_info \u2013

    Print debug/environment information.

"},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Environment","title":"Environment dataclass","text":"

Dataclass to store environment information.

Attributes:

  • interpreter_name (str) \u2013

    Python interpreter name.

  • interpreter_version (str) \u2013

    Python interpreter version.

  • packages (list[Package]) \u2013

    Installed packages.

  • platform (str) \u2013

    Operating System.

  • variables (list[Variable]) \u2013

    Environment variables.

"},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Environment.interpreter_name","title":"interpreter_name instance-attribute","text":"
interpreter_name: str\n

Python interpreter name.

"},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Environment.interpreter_version","title":"interpreter_version instance-attribute","text":"
interpreter_version: str\n

Python interpreter version.

"},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Environment.packages","title":"packages instance-attribute","text":"
packages: list[Package]\n

Installed packages.

"},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Environment.platform","title":"platform instance-attribute","text":"
platform: str\n

Operating System.

"},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Environment.variables","title":"variables instance-attribute","text":"
variables: list[Variable]\n

Environment variables.

"},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Package","title":"Package dataclass","text":"

Dataclass describing a Python package.

Attributes:

  • name (str) \u2013

    Package name.

  • version (str) \u2013

    Package version.

"},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Package.name","title":"name instance-attribute","text":"
name: str\n

Package name.

"},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Package.version","title":"version instance-attribute","text":"
version: str\n

Package version.

"},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Variable","title":"Variable dataclass","text":"

Dataclass describing an environment variable.

Attributes:

  • name (str) \u2013

    Variable name.

  • value (str) \u2013

    Variable value.

"},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Variable.name","title":"name instance-attribute","text":"
name: str\n

Variable name.

"},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Variable.value","title":"value instance-attribute","text":"
value: str\n

Variable value.

"},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.get_debug_info","title":"get_debug_info","text":"
get_debug_info() -> Environment\n

Get debug/environment information.

Returns:

  • Environment \u2013

    Environment information.

"},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.get_version","title":"get_version","text":"
get_version(dist: str = 'mkdocstrings-python') -> str\n

Get version of the given distribution.

Parameters:

  • dist (str, default: 'mkdocstrings-python' ) \u2013

    A distribution name.

Returns:

  • str \u2013

    A version number.

"},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.print_debug_info","title":"print_debug_info","text":"
print_debug_info() -> None\n

Print debug/environment information.

"},{"location":"reference/mkdocstrings_handlers/python/handler/","title":" handler","text":""},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler","title":"handler","text":"

This module implements a handler for the Python language.

Classes:

  • PythonHandler \u2013

    The Python handler class.

Functions:

  • get_handler \u2013

    Simply return an instance of PythonHandler.

"},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler","title":"PythonHandler","text":"
PythonHandler(\n    *args: Any,\n    config_file_path: str | None = None,\n    paths: list[str] | None = None,\n    locale: str = \"en\",\n    load_external_modules: bool = False,\n    **kwargs: Any\n)\n

Bases: BaseHandler

The Python handler class.

Parameters:

  • *args (Any, default: () ) \u2013

    Handler name, theme and custom templates.

  • config_file_path (str | None, default: None ) \u2013

    The MkDocs configuration file path.

  • paths (list[str] | None, default: None ) \u2013

    A list of paths to use as Griffe search paths.

  • locale (str, default: 'en' ) \u2013

    The locale to use when rendering content.

  • load_external_modules (bool, default: False ) \u2013

    Load external modules when resolving aliases.

  • **kwargs (Any, default: {} ) \u2013

    Same thing, but with keyword arguments.

Methods:

  • do_convert_markdown \u2013

    Render Markdown text; for use inside templates.

  • do_heading \u2013

    Render an HTML heading and register it for the table of contents. For use inside templates.

  • get_extended_templates_dirs \u2013

    Load template extensions for the given handler, return their templates directories.

  • get_headings \u2013

    Return and clear the headings gathered so far.

  • get_templates_dir \u2013

    Return the path to the handler's templates directory.

  • load_inventory \u2013

    Yield items and their URLs from an inventory file streamed from in_file.

  • normalize_extension_paths \u2013

    Resolve extension paths relative to config file.

  • teardown \u2013

    Teardown the handler.

Attributes:

  • default_config (dict) \u2013

    Default handler configuration.

  • domain (str) \u2013

    The cross-documentation domain/language for this handler.

  • enable_inventory (bool) \u2013

    Whether this handler is interested in enabling the creation of the objects.inv Sphinx inventory file.

  • extra_css \u2013

    Extra CSS.

  • fallback_config (dict) \u2013

    The configuration used to collect item during autorefs fallback.

  • fallback_theme \u2013

    The fallback theme.

  • name (str) \u2013

    The handler's name, for example \"python\".

"},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.default_config","title":"default_config class-attribute","text":"
default_config: dict = {\n    \"docstring_style\": \"google\",\n    \"docstring_options\": {},\n    \"show_symbol_type_heading\": False,\n    \"show_symbol_type_toc\": False,\n    \"show_root_heading\": False,\n    \"show_root_toc_entry\": True,\n    \"show_root_full_path\": True,\n    \"show_root_members_full_path\": False,\n    \"show_object_full_path\": False,\n    \"show_category_heading\": False,\n    \"show_if_no_docstring\": False,\n    \"show_signature\": True,\n    \"show_signature_annotations\": False,\n    \"signature_crossrefs\": False,\n    \"separate_signature\": False,\n    \"line_length\": 60,\n    \"merge_init_into_class\": False,\n    \"show_docstring_attributes\": True,\n    \"show_docstring_functions\": True,\n    \"show_docstring_classes\": True,\n    \"show_docstring_modules\": True,\n    \"show_docstring_description\": True,\n    \"show_docstring_examples\": True,\n    \"show_docstring_other_parameters\": True,\n    \"show_docstring_parameters\": True,\n    \"show_docstring_raises\": True,\n    \"show_docstring_receives\": True,\n    \"show_docstring_returns\": True,\n    \"show_docstring_warns\": True,\n    \"show_docstring_yields\": True,\n    \"show_source\": True,\n    \"show_bases\": True,\n    \"show_submodules\": False,\n    \"group_by_category\": True,\n    \"heading_level\": 2,\n    \"members_order\": value,\n    \"docstring_section_style\": \"table\",\n    \"members\": None,\n    \"inherited_members\": False,\n    \"filters\": [\"!^_[^_]\"],\n    \"annotations_path\": \"brief\",\n    \"preload_modules\": None,\n    \"allow_inspection\": True,\n    \"summary\": False,\n    \"unwrap_annotated\": False,\n}\n

Default handler configuration.

General options:

  • allow_inspection (bool) \u2013

    Whether to allow inspecting modules when visiting them is not possible. Default: True.

  • show_bases (bool) \u2013

    Show the base classes of a class. Default: True.

  • show_source (bool) \u2013

    Show the source code of this object. Default: True.

  • preload_modules (list[str] | None) \u2013

    Pre-load modules that are not specified directly in autodoc instructions (::: identifier). It is useful when you want to render documentation for a particular member of an object, and this member is imported from another package than its parent.

    For an imported member to be rendered, you need to add it to the __all__ attribute of the importing module.

    The modules must be listed as an array of strings. Default: None.

Headings options:

  • heading_level (int) \u2013

    The initial heading level to use. Default: 2.

  • show_root_heading (bool) \u2013

    Show the heading of the object at the root of the documentation tree (i.e. the object referenced by the identifier after :::). Default: False.

  • show_root_toc_entry (bool) \u2013

    If the root heading is not shown, at least add a ToC entry for it. Default: True.

  • show_root_full_path (bool) \u2013

    Show the full Python path for the root object heading. Default: True.

  • show_root_members_full_path (bool) \u2013

    Show the full Python path of the root members. Default: False.

  • show_object_full_path (bool) \u2013

    Show the full Python path of every object. Default: False.

  • show_category_heading (bool) \u2013

    When grouped by categories, show a heading for each category. Default: False.

  • show_symbol_type_heading (bool) \u2013

    Show the symbol type in headings (e.g. mod, class, meth, func and attr). Default: False.

  • show_symbol_type_toc (bool) \u2013

    Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr). Default: False.

Members options:

  • inherited_members (list[str] | bool | None) \u2013

    A boolean, or an explicit list of inherited members to render. If true, select all inherited members, which can then be filtered with members. If false or empty list, do not select any inherited member. Default: False.

  • members (list[str] | bool | None) \u2013

    A boolean, or an explicit list of members to render. If true, select all members without further filtering. If false or empty list, do not render members. If none, select all members and apply further filtering with filters and docstrings. Default: None.

  • members_order (str) \u2013

    The members ordering to use. Options: alphabetical - order by the members names, source - order members as they appear in the source file. Default: \"alphabetical\".

  • filters (list[str] | None) \u2013

    A list of filters applied to filter objects based on their name. A filter starting with ! will exclude matching objects instead of including them. The members option takes precedence over filters (filters will still be applied recursively to lower members in the hierarchy). Default: [\"!^_[^_]\"].

  • group_by_category (bool) \u2013

    Group the object's children by categories: attributes, classes, functions, and modules. Default: True.

  • show_submodules (bool) \u2013

    When rendering a module, show its submodules recursively. Default: False.

  • summary (bool | dict[str, bool]) \u2013

    Whether to render summaries of modules, classes, functions (methods) and attributes.

Docstrings options:

  • docstring_style (str) \u2013

    The docstring style to use: google, numpy, sphinx, or None. Default: \"google\".

  • docstring_options (dict) \u2013

    The options for the docstring parser. See parsers under griffe.docstrings.

  • docstring_section_style (str) \u2013

    The style used to render docstring sections. Options: table, list, spacy. Default: \"table\".

  • merge_init_into_class (bool) \u2013

    Whether to merge the __init__ method into the class' signature and docstring. Default: False.

  • show_if_no_docstring (bool) \u2013

    Show the object heading even if it has no docstring or children with docstrings. Default: False.

  • show_docstring_attributes (bool) \u2013

    Whether to display the \"Attributes\" section in the object's docstring. Default: True.

  • show_docstring_functions (bool) \u2013

    Whether to display the \"Functions\" or \"Methods\" sections in the object's docstring. Default: True.

  • show_docstring_classes (bool) \u2013

    Whether to display the \"Classes\" section in the object's docstring. Default: True.

  • show_docstring_modules (bool) \u2013

    Whether to display the \"Modules\" section in the object's docstring. Default: True.

  • show_docstring_description (bool) \u2013

    Whether to display the textual block (including admonitions) in the object's docstring. Default: True.

  • show_docstring_examples (bool) \u2013

    Whether to display the \"Examples\" section in the object's docstring. Default: True.

  • show_docstring_other_parameters (bool) \u2013

    Whether to display the \"Other Parameters\" section in the object's docstring. Default: True.

  • show_docstring_parameters (bool) \u2013

    Whether to display the \"Parameters\" section in the object's docstring. Default: True.

  • show_docstring_raises (bool) \u2013

    Whether to display the \"Raises\" section in the object's docstring. Default: True.

  • show_docstring_receives (bool) \u2013

    Whether to display the \"Receives\" section in the object's docstring. Default: True.

  • show_docstring_returns (bool) \u2013

    Whether to display the \"Returns\" section in the object's docstring. Default: True.

  • show_docstring_warns (bool) \u2013

    Whether to display the \"Warns\" section in the object's docstring. Default: True.

  • show_docstring_yields (bool) \u2013

    Whether to display the \"Yields\" section in the object's docstring. Default: True.

Signatures/annotations options:

  • annotations_path (str) \u2013

    The verbosity for annotations path: brief (recommended), or source (as written in the source). Default: \"brief\".

  • line_length (int) \u2013

    Maximum line length when formatting code/signatures. Default: 60.

  • show_signature (bool) \u2013

    Show methods and functions signatures. Default: True.

  • show_signature_annotations (bool) \u2013

    Show the type annotations in methods and functions signatures. Default: False.

  • signature_crossrefs (bool) \u2013

    Whether to render cross-references for type annotations in signatures. Default: False.

  • separate_signature (bool) \u2013

    Whether to put the whole signature in a code block below the heading. If Black is installed, the signature is also formatted using it. Default: False.

  • unwrap_annotated (bool) \u2013

    Whether to unwrap Annotated types to show only the type without the annotations. Default: False.

"},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.domain","title":"domain class-attribute instance-attribute","text":"
domain: str = 'py'\n

The cross-documentation domain/language for this handler.

"},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.enable_inventory","title":"enable_inventory class-attribute instance-attribute","text":"
enable_inventory: bool = True\n

Whether this handler is interested in enabling the creation of the objects.inv Sphinx inventory file.

"},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.extra_css","title":"extra_css class-attribute instance-attribute","text":"
extra_css = ''\n

Extra CSS.

"},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.fallback_config","title":"fallback_config class-attribute","text":"
fallback_config: dict = {'fallback': True}\n

The configuration used to collect item during autorefs fallback.

"},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.fallback_theme","title":"fallback_theme class-attribute instance-attribute","text":"
fallback_theme = 'material'\n

The fallback theme.

"},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.name","title":"name class-attribute instance-attribute","text":"
name: str = ''\n

The handler's name, for example \"python\".

"},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.do_convert_markdown","title":"do_convert_markdown","text":"
do_convert_markdown(\n    text: str,\n    heading_level: int,\n    html_id: str = \"\",\n    *,\n    strip_paragraph: bool = False\n) -> Markup\n

Render Markdown text; for use inside templates.

Parameters:

  • text (str) \u2013

    The text to convert.

  • heading_level (int) \u2013

    The base heading level to start all Markdown headings from.

  • html_id (str, default: '' ) \u2013

    The HTML id of the element that's considered the parent of this element.

  • strip_paragraph (bool, default: False ) \u2013

    Whether to exclude the

    tag from around the whole output.

    Returns:

    • Markup \u2013

      An HTML string.

    "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.do_heading","title":"do_heading","text":"
    do_heading(\n    content: Markup,\n    heading_level: int,\n    *,\n    role: str | None = None,\n    hidden: bool = False,\n    toc_label: str | None = None,\n    **attributes: str\n) -> Markup\n

    Render an HTML heading and register it for the table of contents. For use inside templates.

    Parameters:

    • content (Markup) \u2013

      The HTML within the heading.

    • heading_level (int) \u2013

      The level of heading (e.g. 3 -> h3).

    • role (str | None, default: None ) \u2013

      An optional role for the object bound to this heading.

    • hidden (bool, default: False ) \u2013

      If True, only register it for the table of contents, don't render anything.

    • toc_label (str | None, default: None ) \u2013

      The title to use in the table of contents ('data-toc-label' attribute).

    • **attributes (str, default: {} ) \u2013

      Any extra HTML attributes of the heading.

    Returns:

    • Markup \u2013

      An HTML string.

    "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.get_extended_templates_dirs","title":"get_extended_templates_dirs","text":"
    get_extended_templates_dirs(handler: str) -> list[Path]\n

    Load template extensions for the given handler, return their templates directories.

    Parameters:

    • handler (str) \u2013

      The name of the handler to get the extended templates directory of.

    Returns:

    • list[Path] \u2013

      The extensions templates directories.

    "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.get_headings","title":"get_headings","text":"
    get_headings() -> Sequence[Element]\n

    Return and clear the headings gathered so far.

    Returns:

    • Sequence[Element] \u2013

      A list of HTML elements.

    "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.get_templates_dir","title":"get_templates_dir","text":"
    get_templates_dir(handler: str | None = None) -> Path\n

    Return the path to the handler's templates directory.

    Override to customize how the templates directory is found.

    Parameters:

    • handler (str | None, default: None ) \u2013

      The name of the handler to get the templates directory of.

    Raises:

    • ModuleNotFoundError \u2013

      When no such handler is installed.

    • FileNotFoundError \u2013

      When the templates directory cannot be found.

    Returns:

    • Path \u2013

      The templates directory path.

    "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.load_inventory","title":"load_inventory classmethod","text":"
    load_inventory(\n    in_file: BinaryIO,\n    url: str,\n    base_url: str | None = None,\n    domains: list[str] | None = None,\n    **kwargs: Any\n) -> Iterator[tuple[str, str]]\n

    Yield items and their URLs from an inventory file streamed from in_file.

    This implements mkdocstrings' load_inventory \"protocol\" (see mkdocstrings.plugin).

    Parameters:

    • in_file (BinaryIO) \u2013

      The binary file-like object to read the inventory from.

    • url (str) \u2013

      The URL that this file is being streamed from (used to guess base_url).

    • base_url (str | None, default: None ) \u2013

      The URL that this inventory's sub-paths are relative to.

    • domains (list[str] | None, default: None ) \u2013

      A list of domain strings to filter the inventory by, when not passed, \"py\" will be used.

    • **kwargs (Any, default: {} ) \u2013

      Ignore additional arguments passed from the config.

    Yields:

    • str \u2013

      Tuples of (item identifier, item URL).

    "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.normalize_extension_paths","title":"normalize_extension_paths","text":"
    normalize_extension_paths(extensions: Sequence) -> Sequence\n

    Resolve extension paths relative to config file.

    "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.teardown","title":"teardown","text":"
    teardown() -> None\n

    Teardown the handler.

    This method should be implemented to, for example, terminate a subprocess that was started when creating the handler instance.

    "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.get_handler","title":"get_handler","text":"
    get_handler(\n    *,\n    theme: str,\n    custom_templates: str | None = None,\n    config_file_path: str | None = None,\n    paths: list[str] | None = None,\n    locale: str = \"en\",\n    load_external_modules: bool = False,\n    **config: Any\n) -> PythonHandler\n

    Simply return an instance of PythonHandler.

    Parameters:

    • theme (str) \u2013

      The theme to use when rendering contents.

    • custom_templates (str | None, default: None ) \u2013

      Directory containing custom templates.

    • config_file_path (str | None, default: None ) \u2013

      The MkDocs configuration file path.

    • paths (list[str] | None, default: None ) \u2013

      A list of paths to use as Griffe search paths.

    • locale (str, default: 'en' ) \u2013

      The locale to use when rendering content.

    • load_external_modules (bool, default: False ) \u2013

      Load external modules when resolving aliases.

    • **config (Any, default: {} ) \u2013

      Configuration passed to the handler.

    Returns:

    • PythonHandler \u2013

      An instance of PythonHandler.

    "},{"location":"reference/mkdocstrings_handlers/python/rendering/","title":" rendering","text":""},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering","title":"rendering","text":"

    This module implements rendering utilities.

    Classes:

    • Order \u2013

      Enumeration for the possible members ordering.

    Functions:

    • do_as_attributes_section \u2013

      Build an attributes section from a list of attributes.

    • do_as_classes_section \u2013

      Build a classes section from a list of classes.

    • do_as_functions_section \u2013

      Build a functions section from a list of functions.

    • do_as_modules_section \u2013

      Build a modules section from a list of modules.

    • do_crossref \u2013

      Deprecated. Filter to create cross-references.

    • do_filter_objects \u2013

      Filter a dictionary of objects based on their docstrings.

    • do_format_attribute \u2013

      Format an attribute using Black.

    • do_format_code \u2013

      Format code using Black.

    • do_format_signature \u2013

      Format a signature using Black.

    • do_get_template \u2013

      Get the template name used to render an object.

    • do_multi_crossref \u2013

      Deprecated. Filter to create cross-references.

    • do_order_members \u2013

      Order members given an ordering method.

    • do_split_path \u2013

      Split object paths for building cross-references.

    "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.Order","title":"Order","text":"

    Bases: Enum

    Enumeration for the possible members ordering.

    Attributes:

    • alphabetical \u2013

      Alphabetical order.

    • source \u2013

      Source code order.

    "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.Order.alphabetical","title":"alphabetical class-attribute instance-attribute","text":"
    alphabetical = 'alphabetical'\n

    Alphabetical order.

    "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.Order.source","title":"source class-attribute instance-attribute","text":"
    source = 'source'\n

    Source code order.

    "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_as_attributes_section","title":"do_as_attributes_section","text":"
    do_as_attributes_section(\n    context: Context,\n    attributes: Sequence[Attribute],\n    *,\n    check_public: bool = True\n) -> DocstringSectionAttributes\n

    Build an attributes section from a list of attributes.

    Parameters:

    • attributes (Sequence[Attribute]) \u2013

      The attributes to build the section from.

    • check_public (bool, default: True ) \u2013

      Whether to check if the attribute is public.

    Returns:

    • DocstringSectionAttributes \u2013

      An attributes docstring section.

    "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_as_classes_section","title":"do_as_classes_section","text":"
    do_as_classes_section(\n    context: Context,\n    classes: Sequence[Class],\n    *,\n    check_public: bool = True\n) -> DocstringSectionClasses\n

    Build a classes section from a list of classes.

    Parameters:

    • classes (Sequence[Class]) \u2013

      The classes to build the section from.

    • check_public (bool, default: True ) \u2013

      Whether to check if the class is public.

    Returns:

    • DocstringSectionClasses \u2013

      A classes docstring section.

    "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_as_functions_section","title":"do_as_functions_section","text":"
    do_as_functions_section(\n    context: Context,\n    functions: Sequence[Function],\n    *,\n    check_public: bool = True\n) -> DocstringSectionFunctions\n

    Build a functions section from a list of functions.

    Parameters:

    • functions (Sequence[Function]) \u2013

      The functions to build the section from.

    • check_public (bool, default: True ) \u2013

      Whether to check if the function is public.

    Returns:

    • DocstringSectionFunctions \u2013

      A functions docstring section.

    "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_as_modules_section","title":"do_as_modules_section","text":"
    do_as_modules_section(\n    context: Context,\n    modules: Sequence[Module],\n    *,\n    check_public: bool = True\n) -> DocstringSectionModules\n

    Build a modules section from a list of modules.

    Parameters:

    • modules (Sequence[Module]) \u2013

      The modules to build the section from.

    • check_public (bool, default: True ) \u2013

      Whether to check if the module is public.

    Returns:

    • DocstringSectionModules \u2013

      A modules docstring section.

    "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_crossref","title":"do_crossref","text":"
    do_crossref(path: str, *, brief: bool = True) -> Markup\n

    Deprecated. Filter to create cross-references.

    Parameters:

    • path (str) \u2013

      The path to link to.

    • brief (bool, default: True ) \u2013

      Show only the last part of the path, add full path as hover.

    Returns:

    • Markup \u2013

      Markup text.

    "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_filter_objects","title":"do_filter_objects","text":"
    do_filter_objects(\n    objects_dictionary: dict[str, Object | Alias],\n    *,\n    filters: Sequence[tuple[Pattern, bool]] | None = None,\n    members_list: bool | list[str] | None = None,\n    inherited_members: bool | list[str] = False,\n    keep_no_docstrings: bool = True\n) -> list[Object | Alias]\n

    Filter a dictionary of objects based on their docstrings.

    Parameters:

    • objects_dictionary (dict[str, Object | Alias]) \u2013

      The dictionary of objects.

    • filters (Sequence[tuple[Pattern, bool]] | None, default: None ) \u2013

      Filters to apply, based on members' names. Each element is a tuple: a pattern, and a boolean indicating whether to reject the object if the pattern matches.

    • members_list (bool | list[str] | None, default: None ) \u2013

      An optional, explicit list of members to keep. When given and empty, return an empty list. When given and not empty, ignore filters and docstrings presence/absence.

    • inherited_members (bool | list[str], default: False ) \u2013

      Whether to keep inherited members or exclude them.

    • keep_no_docstrings (bool, default: True ) \u2013

      Whether to keep objects with no/empty docstrings (recursive check).

    Returns:

    • list[Object | Alias] \u2013

      A list of objects.

    "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_format_attribute","title":"do_format_attribute","text":"
    do_format_attribute(\n    context: Context,\n    attribute_path: Markup,\n    attribute: Attribute,\n    line_length: int,\n    *,\n    crossrefs: bool = False\n) -> str\n

    Format an attribute using Black.

    Parameters:

    • context (Context) \u2013

      Jinja context, passed automatically.

    • attribute_path (Markup) \u2013

      The path of the callable we render the signature of.

    • attribute (Attribute) \u2013

      The attribute we render the signature of.

    • line_length (int) \u2013

      The line length to give to Black.

    • crossrefs (bool, default: False ) \u2013

      Whether to cross-reference types in the signature.

    Returns:

    • str \u2013

      The same code, formatted.

    "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_format_code","title":"do_format_code","text":"
    do_format_code(code: str, line_length: int) -> str\n

    Format code using Black.

    Parameters:

    • code (str) \u2013

      The code to format.

    • line_length (int) \u2013

      The line length to give to Black.

    Returns:

    • str \u2013

      The same code, formatted.

    "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_format_signature","title":"do_format_signature","text":"
    do_format_signature(\n    context: Context,\n    callable_path: Markup,\n    function: Function,\n    line_length: int,\n    *,\n    annotations: bool | None = None,\n    crossrefs: bool = False\n) -> str\n

    Format a signature using Black.

    Parameters:

    • context (Context) \u2013

      Jinja context, passed automatically.

    • callable_path (Markup) \u2013

      The path of the callable we render the signature of.

    • function (Function) \u2013

      The function we render the signature of.

    • line_length (int) \u2013

      The line length to give to Black.

    • annotations (bool | None, default: None ) \u2013

      Whether to show type annotations.

    • crossrefs (bool, default: False ) \u2013

      Whether to cross-reference types in the signature.

    Returns:

    • str \u2013

      The same code, formatted.

    "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_get_template","title":"do_get_template","text":"
    do_get_template(obj: Object) -> str\n

    Get the template name used to render an object.

    Parameters:

    • obj (Object) \u2013

      A Griffe object.

    Returns:

    • str \u2013

      A template name.

    "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_multi_crossref","title":"do_multi_crossref","text":"
    do_multi_crossref(\n    text: str, *, code: bool = True\n) -> Markup\n

    Deprecated. Filter to create cross-references.

    Parameters:

    • text (str) \u2013

      The text to scan.

    • code (bool, default: True ) \u2013

      Whether to wrap the result in a code tag.

    Returns:

    • Markup \u2013

      Markup text.

    "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_order_members","title":"do_order_members","text":"
    do_order_members(\n    members: Sequence[Object | Alias],\n    order: Order,\n    members_list: bool | list[str] | None,\n) -> Sequence[Object | Alias]\n

    Order members given an ordering method.

    Parameters:

    • members (Sequence[Object | Alias]) \u2013

      The members to order.

    • order (Order) \u2013

      The ordering method.

    • members_list (bool | list[str] | None) \u2013

      An optional member list (manual ordering).

    Returns:

    • Sequence[Object | Alias] \u2013

      The same members, ordered.

    "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_split_path","title":"do_split_path","text":"
    do_split_path(\n    path: str, full_path: str\n) -> list[tuple[str, str]]\n

    Split object paths for building cross-references.

    Parameters:

    • path (str) \u2013

      The path to split.

    Returns:

    • list[tuple[str, str]] \u2013

      A list of pairs (title, full path).

    "},{"location":"usage/","title":"Usage","text":"

    This is the documentation for the NEW Python handler.

    To read the documentation for the LEGACY handler, go to the legacy handler documentation.

    "},{"location":"usage/#installation","title":"Installation","text":"

    You can install this handler as a mkdocstrings extra:

    pyproject.toml
    # PEP 621 dependencies declaration\n# adapt to your dependencies manager\n[project]\ndependencies = [\n    \"mkdocstrings[python]>=0.18\",\n]\n

    You can also explicitly depend on the handler:

    pyproject.toml
    # PEP 621 dependencies declaration\n# adapt to your dependencies manager\n[project]\ndependencies = [\n    \"mkdocstrings-python\",\n]\n

    The Python handler is the default mkdocstrings handler. You can change the default handler, or explicitely set the Python handler as default by defining the default_handler configuration option of mkdocstrings in mkdocs.yml:

    mkdocs.yml
    plugins:\n- mkdocstrings:\n    default_handler: python\n
    "},{"location":"usage/#injecting-documentation","title":"Injecting documentation","text":"

    With the Python handler installed and configured as default handler, you can inject documentation for a module, class, function, or any other Python object with mkdocstrings' autodoc syntax, in your Markdown pages:

    ::: path.to.object\n

    If another handler was defined as default handler, you can explicitely ask for the Python handler to be used when injecting documentation with the handler option:

    ::: path.to.object\n    handler: python\n
    "},{"location":"usage/#configuration","title":"Configuration","text":"

    When installed, the Python handler becomes the default mkdocstrings handler. You can configure it in mkdocs.yml:

    mkdocs.yml
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        ...  # the Python handler configuration\n
    "},{"location":"usage/#global-only-options","title":"Global-only options","text":"

    Some options are global only, and go directly under the handler's name.

    "},{"location":"usage/#import","title":"import","text":"

    This option is used to import Sphinx-compatible objects inventories from other documentation sites. For example, you can import the standard library objects inventory like this:

    mkdocs.yml
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        import:\n        - https://docs.python-requests.org/en/master/objects.inv\n

    When importing an inventory, you enable automatic cross-references to other documentation sites like the standard library docs or any third-party package docs. Typically, you want to import the inventories of your project's dependencies, at least those that are used in the public API.

    See mkdocstrings' documentation on inventories for more details.

    Additionally, the Python handler accepts a domains option in the import items, which allows to select the inventory domains to select. By default the Python handler only selects the py domain (for Python objects). You might find useful to also enable the std domain:

    mkdocs.yml
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        import:\n        - url: https://docs.python-requests.org/en/master/objects.inv\n          domains: [std, py]\n

    Note

    The import option is common to all handlers, however they might implement it differently, or not even implement it.

    "},{"location":"usage/#paths","title":"paths","text":"

    This option is used to provide filesystem paths in which to search for Python modules. Non-absolute paths are computed as relative to MkDocs configuration file. Example:

    mkdocs.yml
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        paths: [src]  # search packages in the src folder\n

    More details at Finding modules.

    "},{"location":"usage/#load_external_modules","title":"load_external_modules","text":"

    This option allows resolving aliases (imports) to any external module. Modules are considered external when they are not part of the package your are injecting documentation for. Enabling this option will tell the handler to resolve aliases recursively when they are made public through the __all__ variable.

    Use with caution

    This can load a lot of modules through Griffe, slowing down your build or triggering errors that Griffe does not yet handle. We recommend using the preload_modules option instead, which acts as an include-list rather than as include-all.

    Example:

    mkdocs.yml
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        load_external_modules: true\n
    "},{"location":"usage/#globallocal-options","title":"Global/local options","text":"

    The other options can be used both globally and locally, under the options key. For example, globally:

    mkdocs.yml
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          do_something: true\n

    ...and locally, overriding the global configuration:

    docs/some_page.md
    ::: package.module.class\n    options:\n      do_something: false\n

    These options affect how the documentation is collected from sources and rendered. See the following tables summarizing the options, and get more details for each option in the following pages:

    • General options: various options that do not fit in the other categories
    • Headings options: options related to headings and the table of contents (or sidebar, depending on the theme used)
    • Members options: options related to filtering or ordering members in the generated documentation
    • Docstrings options: options related to docstrings (parsing and rendering)
    • Signature options: options related to signatures and type annotations
    "},{"location":"usage/#options-summary","title":"Options summary","text":"

    Default handler configuration.

    General options:

    • allow_inspection (bool) \u2013

      Whether to allow inspecting modules when visiting them is not possible. Default: True.

    • show_bases (bool) \u2013

      Show the base classes of a class. Default: True.

    • show_source (bool) \u2013

      Show the source code of this object. Default: True.

    • preload_modules (list[str] | None) \u2013

      Pre-load modules that are not specified directly in autodoc instructions (::: identifier). It is useful when you want to render documentation for a particular member of an object, and this member is imported from another package than its parent.

      For an imported member to be rendered, you need to add it to the __all__ attribute of the importing module.

      The modules must be listed as an array of strings. Default: None.

    Headings options:

    • heading_level (int) \u2013

      The initial heading level to use. Default: 2.

    • show_root_heading (bool) \u2013

      Show the heading of the object at the root of the documentation tree (i.e. the object referenced by the identifier after :::). Default: False.

    • show_root_toc_entry (bool) \u2013

      If the root heading is not shown, at least add a ToC entry for it. Default: True.

    • show_root_full_path (bool) \u2013

      Show the full Python path for the root object heading. Default: True.

    • show_root_members_full_path (bool) \u2013

      Show the full Python path of the root members. Default: False.

    • show_object_full_path (bool) \u2013

      Show the full Python path of every object. Default: False.

    • show_category_heading (bool) \u2013

      When grouped by categories, show a heading for each category. Default: False.

    • show_symbol_type_heading (bool) \u2013

      Show the symbol type in headings (e.g. mod, class, meth, func and attr). Default: False.

    • show_symbol_type_toc (bool) \u2013

      Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr). Default: False.

    Members options:

    • inherited_members (list[str] | bool | None) \u2013

      A boolean, or an explicit list of inherited members to render. If true, select all inherited members, which can then be filtered with members. If false or empty list, do not select any inherited member. Default: False.

    • members (list[str] | bool | None) \u2013

      A boolean, or an explicit list of members to render. If true, select all members without further filtering. If false or empty list, do not render members. If none, select all members and apply further filtering with filters and docstrings. Default: None.

    • members_order (str) \u2013

      The members ordering to use. Options: alphabetical - order by the members names, source - order members as they appear in the source file. Default: \"alphabetical\".

    • filters (list[str] | None) \u2013

      A list of filters applied to filter objects based on their name. A filter starting with ! will exclude matching objects instead of including them. The members option takes precedence over filters (filters will still be applied recursively to lower members in the hierarchy). Default: [\"!^_[^_]\"].

    • group_by_category (bool) \u2013

      Group the object's children by categories: attributes, classes, functions, and modules. Default: True.

    • show_submodules (bool) \u2013

      When rendering a module, show its submodules recursively. Default: False.

    • summary (bool | dict[str, bool]) \u2013

      Whether to render summaries of modules, classes, functions (methods) and attributes.

    Docstrings options:

    • docstring_style (str) \u2013

      The docstring style to use: google, numpy, sphinx, or None. Default: \"google\".

    • docstring_options (dict) \u2013

      The options for the docstring parser. See parsers under griffe.docstrings.

    • docstring_section_style (str) \u2013

      The style used to render docstring sections. Options: table, list, spacy. Default: \"table\".

    • merge_init_into_class (bool) \u2013

      Whether to merge the __init__ method into the class' signature and docstring. Default: False.

    • show_if_no_docstring (bool) \u2013

      Show the object heading even if it has no docstring or children with docstrings. Default: False.

    • show_docstring_attributes (bool) \u2013

      Whether to display the \"Attributes\" section in the object's docstring. Default: True.

    • show_docstring_functions (bool) \u2013

      Whether to display the \"Functions\" or \"Methods\" sections in the object's docstring. Default: True.

    • show_docstring_classes (bool) \u2013

      Whether to display the \"Classes\" section in the object's docstring. Default: True.

    • show_docstring_modules (bool) \u2013

      Whether to display the \"Modules\" section in the object's docstring. Default: True.

    • show_docstring_description (bool) \u2013

      Whether to display the textual block (including admonitions) in the object's docstring. Default: True.

    • show_docstring_examples (bool) \u2013

      Whether to display the \"Examples\" section in the object's docstring. Default: True.

    • show_docstring_other_parameters (bool) \u2013

      Whether to display the \"Other Parameters\" section in the object's docstring. Default: True.

    • show_docstring_parameters (bool) \u2013

      Whether to display the \"Parameters\" section in the object's docstring. Default: True.

    • show_docstring_raises (bool) \u2013

      Whether to display the \"Raises\" section in the object's docstring. Default: True.

    • show_docstring_receives (bool) \u2013

      Whether to display the \"Receives\" section in the object's docstring. Default: True.

    • show_docstring_returns (bool) \u2013

      Whether to display the \"Returns\" section in the object's docstring. Default: True.

    • show_docstring_warns (bool) \u2013

      Whether to display the \"Warns\" section in the object's docstring. Default: True.

    • show_docstring_yields (bool) \u2013

      Whether to display the \"Yields\" section in the object's docstring. Default: True.

    Signatures/annotations options:

    • annotations_path (str) \u2013

      The verbosity for annotations path: brief (recommended), or source (as written in the source). Default: \"brief\".

    • line_length (int) \u2013

      Maximum line length when formatting code/signatures. Default: 60.

    • show_signature (bool) \u2013

      Show methods and functions signatures. Default: True.

    • show_signature_annotations (bool) \u2013

      Show the type annotations in methods and functions signatures. Default: False.

    • signature_crossrefs (bool) \u2013

      Whether to render cross-references for type annotations in signatures. Default: False.

    • separate_signature (bool) \u2013

      Whether to put the whole signature in a code block below the heading. If Black is installed, the signature is also formatted using it. Default: False.

    • unwrap_annotated (bool) \u2013

      Whether to unwrap Annotated types to show only the type without the annotations. Default: False.

    "},{"location":"usage/#finding-modules","title":"Finding modules","text":"

    There are multiple ways to tell the handler where to find your packages/modules.

    The recommended method is to use the paths option, as it's the only one that works with the -f option of MkDocs, allowing to build the documentation from any location on the file system. Indeed, the paths provided with the paths option are computed as relative to the configuration file (mkdocs.yml), so that the current working directory has no impact on the build process: you can build the docs from any location on your filesystem.

    "},{"location":"usage/#using-the-paths-option","title":"Using the paths option","text":"

    This is the recommended method.

    1. mkdocs.yml in root, package in root

      \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc4 mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 package/\n

      mkdocs.yml
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        paths: [.]  # actually not needed, default\n
    2. mkdocs.yml in root, package in subfolder

      \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc4 mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 src/\n    \u2514\u2500\u2500 \ud83d\udcc1 package/\n

      mkdocs.yml
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        paths: [src]\n
    3. mkdocs.yml in subfolder, package in root

      \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc1 docs/\n\u2502   \u2514\u2500\u2500 \ud83d\udcc4 mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 package/\n

      mkdocs.yml
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        paths: [..]\n
    4. mkdocs.yml in subfolder, package in subfolder

      \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc1 docs/\n\u2502   \u2514\u2500\u2500 \ud83d\udcc4 mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 src/\n    \u2514\u2500\u2500 \ud83d\udcc1 package/\n

      mkdocs.yml
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        paths: [../src]\n

    Except for case 1, which is supported by default, we strongly recommend setting the path to your packages using this option, even if it works without it (for example because your project manager automatically adds src to PYTHONPATH), to make sure anyone can build your docs from any location on their filesystem.

    "},{"location":"usage/#using-the-pythonpath-environment-variable","title":"Using the PYTHONPATH environment variable","text":"

    This method has limitations.

    This method might work for you, with your current setup, but not for others trying your build your docs with their own setup/environment. We recommend using the paths method instead.

    You can take advantage of the usual Python loading mechanisms. In Bash and other shells, you can run your command like this (note the prepended PYTHONPATH=...):

    1. mkdocs.yml in root, package in root

      \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc4 mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 package/\n

      PYTHONPATH=. mkdocs build  # actually not needed, default\n
    2. mkdocs.yml in root, package in subfolder

      \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc4 mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 src/\n    \u2514\u2500\u2500 \ud83d\udcc1 package/\n

      PYTHONPATH=src mkdocs build\n
    3. mkdocs.yml in subfolder, package in root

      \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc1 docs/\n\u2502   \u2514\u2500\u2500 \ud83d\udcc4 mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 package/\n

      PYTHONPATH=. mkdocs build -f docs/mkdocs.yml\n
    4. mkdocs.yml in subfolder, package in subfolder

      \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc1 docs/\n\u2502   \u2514\u2500\u2500 \ud83d\udcc4 mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 src/\n    \u2514\u2500\u2500 \ud83d\udcc1 package/\n

      PYTHONPATH=src mkdocs build -f docs/mkdocs.yml\n
    "},{"location":"usage/#installing-your-package-in-the-current-python-environment","title":"Installing your package in the current Python environment","text":"

    This method has limitations.

    This method might work for you, with your current setup, but not for others trying your build your docs with their own setup/environment. We recommend using the paths method instead.

    Install your package in the current environment, and run MkDocs:

    pipPDMPoetry
    . venv/bin/activate\npip install -e .\nmkdocs build\n
    pdm install\npdm run mkdocs build\n
    poetry install\npoetry run mkdocs build\n
    "},{"location":"usage/customization/","title":"Customization","text":"

    It is possible to customize the output of the generated documentation with CSS and/or by overriding templates.

    "},{"location":"usage/customization/#css-classes","title":"CSS classes","text":"

    The following CSS classes are used in the generated HTML:

    • doc: on all the following elements
    • doc-children: on divs containing the children of an object
    • doc-object: on divs containing an object
      • doc-attribute: on divs containing an attribute
      • doc-class: on divs containing a class
      • doc-function: on divs containing a function
      • doc-module: on divs containing a module
    • doc-heading: on objects headings
      • doc-object-name: on spans wrapping objects names/paths in the heading
        • doc-KIND-name: as above, specific to the kind of object (module, class, function, attribute)
    • doc-contents: on divs wrapping the docstring then the children (if any)
      • first: same, but only on the root object's contents div
    • doc-labels: on spans wrapping the object's labels
      • doc-label: on small elements containing a label
        • doc-label-LABEL: same, where LABEL is replaced by the actual label
    • doc-md-description: on divs containing HTML descriptions converted from Markdown docstrings
    • doc-symbol: on code tags of symbol types
      • doc-symbol-heading: on symbol types in headings
      • doc-symbol-toc: on symbol types in the ToC
      • doc-symbol-KIND: specific to the kind of object (module, class, function, method, attribute)

    Example with colorful labels

    CSSResult
    .doc-label { border-radius: 15px; padding: 2px 8px; font-weight: bold; }\n.doc-label-special { background-color: #3330E4; color: white; }\n.doc-label-private { background-color: #F637EC; color: white; }\n.doc-label-property { background-color: #FBB454; color: black; }\n.doc-label-read-only { background-color: #FAEA48; color: black; }\n

    special private property read-only

    "},{"location":"usage/customization/#symbol-types","title":"Symbol types","text":""},{"location":"usage/customization/#colors","title":"Colors","text":"

    You can customize the colors of the symbol types (see show_symbol_type_heading and show_symbol_type_toc) by overriding the values of our CSS variables, for example:

    docs/css/mkdocstrings.css
    [data-md-color-scheme=\"default\"] {\n  --doc-symbol-attribute-fg-color: #0079ff;\n  --doc-symbol-function-fg-color: #00dfa2;\n  --doc-symbol-method-fg-color: #00dfa2;\n  --doc-symbol-class-fg-color: #d1b619;\n  --doc-symbol-module-fg-color: #ff0060;\n\n  --doc-symbol-attribute-bg-color: #0079ff1a;\n  --doc-symbol-function-bg-color: #00dfa21a;\n  --doc-symbol-method-bg-color: #00dfa21a;\n  --doc-symbol-class-bg-color: #d1b6191a;\n  --doc-symbol-module-bg-color: #ff00601a;\n}\n\n[data-md-color-scheme=\"slate\"] {\n  --doc-symbol-attribute-fg-color: #963fb8;\n  --doc-symbol-function-fg-color: #6d67e4;\n  --doc-symbol-method-fg-color: #6d67e4;\n  --doc-symbol-class-fg-color: #46c2cb;\n  --doc-symbol-module-fg-color: #f2f7a1;\n\n  --doc-symbol-attribute-bg-color: #963fb81a;\n  --doc-symbol-function-bg-color: #6d67e41a;\n  --doc-symbol-method-bg-color: #6d67e41a;\n  --doc-symbol-class-bg-color: #46c2cb1a;\n  --doc-symbol-module-bg-color: #f2f7a11a;\n}\n

    The [data-md-color-scheme=\"*\"] selectors work with the Material for MkDocs theme. If you are using another theme, adapt the selectors to this theme if it supports light and dark themes, otherwise just override the variables at root level:

    docs/css/mkdocstrings.css
    :root {\n  --doc-symbol-attribute-fg-color: #0079ff;\n  --doc-symbol-function-fg-color: #00dfa2;\n  --doc-symbol-method-fg-color: #00dfa2;\n  --doc-symbol-class-fg-color: #d1b619;\n  --doc-symbol-module-fg-color: #ff0060;\n\n  --doc-symbol-attribute-bg-color: #0079ff1a;\n  --doc-symbol-function-bg-color: #00dfa21a;\n  --doc-symbol-method-bg-color: #00dfa21a;\n  --doc-symbol-class-bg-color: #d1b6191a;\n  --doc-symbol-module-bg-color: #ff00601a;\n}\n

    Preview

    Try cycling through the themes to see the colors for each theme:

    "},{"location":"usage/customization/#names","title":"Names","text":"

    You can also change the actual symbol names. For example, to use single letters instead of truncated types:

    docs/css/mkdocstrings.css
    .doc-symbol-attribute::after {\n  content: \"A\";\n}\n\n.doc-symbol-function::after {\n  content: \"F\";\n}\n\n.doc-symbol-method::after {\n  content: \"M\";\n}\n\n.doc-symbol-class::after {\n  content: \"C\";\n}\n\n.doc-symbol-module::after {\n  content: \"M\";\n}\n

    Preview

    • Attribute:
    • Function:
    • Method:
    • Class:
    • Module:
    "},{"location":"usage/customization/#templates","title":"Templates","text":"

    Templates are organized into the following tree:

    \ud83d\udcc1 theme/\n\u251c\u2500\u2500 \ud83d\udcc4 attribute.html\n\u251c\u2500\u2500 \ud83d\udcc4 children.html\n\u251c\u2500\u2500 \ud83d\udcc4 class.html\n\u251c\u2500\u2500 \ud83d\udcc1 docstring/\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 admonition.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 attributes.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 classes.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 examples.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 functions.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 modules.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 other_parameters.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 parameters.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 raises.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 receives.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 returns.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 warns.html\n\u2502   \u2514\u2500\u2500 \ud83d\udcc4 yields.html\n\u251c\u2500\u2500 \ud83d\udcc4 docstring.html\n\u251c\u2500\u2500 \ud83d\udcc4 expression.html\n\u251c\u2500\u2500 \ud83d\udcc4 function.html\n\u251c\u2500\u2500 \ud83d\udcc4 labels.html\n\u251c\u2500\u2500 \ud83d\udcc4 language.html\n\u251c\u2500\u2500 \ud83d\udcc1 languages/\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 en.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 ja.html\n\u2502   \u2514\u2500\u2500 \ud83d\udcc4 zh.html\n\u251c\u2500\u2500 \ud83d\udcc4 module.html\n\u251c\u2500\u2500 \ud83d\udcc4 signature.html\n\u251c\u2500\u2500 \ud83d\udcc1 summary/\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 attributes.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 classes.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 functions.html\n\u2502   \u2514\u2500\u2500 \ud83d\udcc4 modules.html\n\u2514\u2500\u2500 \ud83d\udcc4 summary.html\n

    See them in the repository. See the general mkdocstrings documentation to learn how to override them: https://mkdocstrings.github.io/theming/#templates.

    Each one of these templates extends a base version in theme/_base. Example:

    theme/class.html
    {% extends \"_base/class.html\" %}\n

    Some of these templates define Jinja blocks. allowing to customize only parts of a template without having to fully copy-paste it into your project:

    templates/theme/class.html
    {% extends \"_base/class.html\" %}\n{% block contents %}\n  {{ block.super }}\n  Additional contents\n{% endblock contents %}\n
    "},{"location":"usage/customization/#available-blocks","title":"Available blocks","text":"

    Only the templates for the Material for MkDocs provide Jinja blocks. The following tables show the block names, description, and the Jinja context available in their scope.

    "},{"location":"usage/customization/#modulehtml","title":"module.html","text":"
    • heading: The module heading.
    • labels: The module labels.
    • contents: The module contents: docstring and children blocks.
    • docstring: The module docstring.
    • summary: The automatic summaries of members.
    • children: The module children.

    Available context:

    • config: The handler configuration (dictionary).
    • module: The Module instance.
    "},{"location":"usage/customization/#classhtml","title":"class.html","text":"
    • heading: The class heading.
    • labels: The class labels.
    • signature: The class signature.
    • contents: The class contents: bases, docstring, source and children blocks.
    • bases: The class bases.
    • docstring: The class docstring.
    • summary: The automatic summaries of members.
    • source: The class source code.
    • children: The class children.

    Available context:

    • config: The handler configuration (dictionary).
    • class: The Class instance.
    "},{"location":"usage/customization/#functionhtml","title":"function.html","text":"
    • heading: The function heading.
    • labels: The function labels.
    • signature: The function signature.
    • contents: The function contents: docstring and source blocks.
    • docstring: The function docstring.
    • source: The function source code.

    Available context:

    • config: The handler configuration (dictionary).
    • function: The Function instance.
    "},{"location":"usage/customization/#attributehtml","title":"attribute.html","text":"
    • heading: The attribute heading.
    • labels: The attribute labels.
    • signature: The attribute signature.
    • contents: The attribute contents: docstring block.
    • docstring: The attribute docstring.

    Available context:

    • config: The handler configuration (dictionary).
    • function: The Attribute instance.
    "},{"location":"usage/customization/#docstring-sections","title":"Docstring sections","text":"

    In docstring/attributes.html, docstring/functions.html, docstring/classes.html, docstring/modules.html, docstring/other_parameters.html, docstring/parameters.html, docstring/raises.html, docstring/receives.html, docstring/returns.html, docstring/warns.html, and docstring/yields.html:

    • table_style: The section as a table.
    • list_style: The section as a list.
    • spacy_style: The section as a Spacy table.

    Available context:

    • section: The DocstringSection instance (see DocstringSection* subclasses).
    "},{"location":"usage/customization/#style-recommendations","title":"Style recommendations","text":""},{"location":"usage/customization/#material","title":"Material","text":"

    Here are some CSS rules for the Material for MkDocs theme:

    /* Indentation. */\ndiv.doc-contents:not(.first) {\n  padding-left: 25px;\n  border-left: .05rem solid var(--md-typeset-table-color);\n}\n\n/* Mark external links as such. */\na.external::after,\na.autorefs-external::after {\n  /* https://primer.style/octicons/arrow-up-right-24 */\n  mask-image: url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M18.25 15.5a.75.75 0 00.75-.75v-9a.75.75 0 00-.75-.75h-9a.75.75 0 000 1.5h7.19L6.22 16.72a.75.75 0 101.06 1.06L17.5 7.56v7.19c0 .414.336.75.75.75z\"></path></svg>');\n  -webkit-mask-image: url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M18.25 15.5a.75.75 0 00.75-.75v-9a.75.75 0 00-.75-.75h-9a.75.75 0 000 1.5h7.19L6.22 16.72a.75.75 0 101.06 1.06L17.5 7.56v7.19c0 .414.336.75.75.75z\"></path></svg>');\n  content: ' ';\n\n  display: inline-block;\n  vertical-align: middle;\n  position: relative;\n\n  height: 1em;\n  width: 1em;\n  background-color: var(--md-typeset-a-color);\n}\n\na.external:hover::after,\na.autorefs-external:hover::after {\n  background-color: var(--md-accent-fg-color);\n}\n

    "},{"location":"usage/customization/#readthedocs","title":"ReadTheDocs","text":"

    Here are some CSS rules for the built-in ReadTheDocs theme:

    /* Indentation. */\ndiv.doc-contents:not(.first) {\n  padding-left: 25px;\n  border-left: .05rem solid rgba(200, 200, 200, 0.2);\n}\n
    "},{"location":"usage/extensions/","title":"Extensions","text":""},{"location":"usage/extensions/#work-in-progress","title":"Work in Progress!","text":"

    The Python handler supports extensions through mkdocstrings' handler extensions.

    Specifically, additional templates can be added to the handler, and Griffe extensions can instruct the handler to use a particular template for a particular object by setting a value in the Griffe object's extra dictionary:

    griffe_extension.py
    obj = ...  # get a reference to a Griffe object\nif \"mkdocstrings\" not in obj.extra:\n    obj.extra[\"mkdocstrings\"] = {}\nobj.extra[\"mkdocstrings\"][\"template\"] = \"template_name.html\"\n
    "},{"location":"usage/configuration/docstrings/","title":"Docstrings options","text":""},{"location":"usage/configuration/docstrings/#docstring_style","title":"docstring_style","text":"
    • Type str \"google\"

    The docstring style to expect when parsing docstrings.

    Possible values:

    • \"google\": see Google style.
    • \"numpy\": see Numpy style.
    • \"sphinx\": see Sphinx style.
    • None (null or ~ in YAML): no style at all, parse as regular text.
    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          docstring_style: google\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      docstring_style: numpy\n

    Preview

    Every style gets rendered the same way. Here are some docstring examples.

    GoogleNumpySphinx
    def greet(name: str) -> str:\n    \"\"\"Greet someone.\n\n    Parameters:\n        name: The name of the person to greet.\n\n    Returns:\n        A greeting message.\n    \"\"\"\n    return f\"Hello {name}!\"\n
    def greet(name: str) -> str:\n    \"\"\"Greet someone.\n\n    Parameters\n    ----------\n    name\n        The name of the person to greet.\n\n    Returns\n    -------\n    A greeting message.\n    \"\"\"\n    return f\"Hello {name}!\"\n
    def greet(name: str) -> str:\n    \"\"\"Greet someone.\n\n    :param name: The name of the person to greet.\n    :return: A greeting message.\n    \"\"\"\n    return f\"Hello {name}!\"\n
    "},{"location":"usage/configuration/docstrings/#docstring_options","title":"docstring_optionsPrintOKPrintOK","text":"
    • Type dict {}

    The options for the docstring parser.

    • Google-style options
    • Numpydoc-style options

    The Sphinx style does not offer any option.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          docstring_options:\n            ignore_init_summary: false\n            trim_doctest_flags: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      docstring_options:\n        ignore_init_summary: true\n        trim_doctest_flags: false\n
    class PrintOK:\n    \"\"\"Class docstring.\"\"\"\n\n    def __init__(self):\n        \"\"\"Initialize the instance.\n\n        Examples:\n            >>> Class()  # doctest: +NORMALIZE_WHITESPACE\n            ok\n        \"\"\"\n        print(\"ok\")\n

    Preview

    Ignore init summary, trim doctest flagsKeep init summary and doctest flags

    Class docstring.

    __init__

    Examples:

    >>> Class()\nok\n

    Class docstring.

    __init__

    Initialize the instance.

    Examples:

    >>> Class()  # doctest: +NORMALIZE_WHITESPACE\nok\n
    "},{"location":"usage/configuration/docstrings/#docstring_section_style","title":"docstring_section_style","text":"
    • Type str \"table\"

    The style used to render docstring sections.

    A section is a block of text that has a special meaning in a docstring. There are sections for documenting attributes of an object, parameters of a function, exceptions raised by a function, the return value of a function, etc.

    Sections are parsed as structured data and can therefore be rendered in different ways. Possible values:

    • \"table\": a simple table, usually with type, name and description columns
    • \"list\": a simple list, akin to what you get with the ReadTheDocs Sphinx theme
    • \"spacy\": a poor implementation of the amazing tables in Spacy's documentation
    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          docstring_section_style: table\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      docstring_section_style: list\n

    Preview

    TableListSpacy

    Tables work well when you have lots of items with short names, type annotations, descriptions, etc.. With longer strings, the columns risk getting squished horizontally. In that case, the Spacy tables can help.

    Parameters:

    Type Name Description Default int threshold Threshold for something. required bool flag Enable something. False

    Other Parameters:

    Type Name Description Default list[int | float] gravity_forces Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. required VacuumType | Literal[\"regular\"] vacuum_type Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. VacuumType.PLASMA

    Lists work well whatever the length of names, type annotations, descriptions, etc.

    Parameters:

    • threshold (int) \u2014 Threshold for something.
    • flag (bool) \u2014 Enable something.

    Other Parameters:

    • gravity_forces (list[int | float]) \u2014 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    • vacuum_type (VacuumType | Literal[\"regular\"]) \u2014 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Spacy tables work better than regular tables with longer names, type annotations, descriptions, etc., by reserving more horizontal space on the second column.

    Parameters:

    Name Description threshold Threshold for something.TYPE: int DEFAULT: required flag Enable something.TYPE: bool DEFAULT: False

    Other Parameters:

    Name Description gravity_forces Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.TYPE: list[int | float] DEFAULT: required vacuum_type Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.TYPE:VacuumType | Literal[\"regular\"] DEFAULT: VacuumType.PLASMA"},{"location":"usage/configuration/docstrings/#merge_init_into_class","title":"merge_init_into_classThing(value=0)Thing","text":"
    • Type bool False

    Whether to merge the __init__ method into the class' signature and docstring.

    By default, only the class name is rendered in headings. When merging, the __init__ method parameters are added after the class name, like a signature, and the __init__ method docstring is appended to the class' docstring. This option is well used in combination with the ignore_init_summary docstring option, to discard the first line of the __init__ docstring which is not often useful.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          docstring_options:\n            ignore_init_summary: false\n          merge_init_into_class: false\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      docstring_options:\n        ignore_init_summary: true\n      merge_init_into_class: true\n
    class Thing:\n    \"\"\"A class for things.\"\"\"\n\n    def __init__(self, value: int = 0):\n        \"\"\"Initialize a thing.\n\n        Parameters:\n            value: The thing's value.\n        \"\"\"\n        self.value = value\n

    Preview

    Merged, summary discardedUnmerged, summary kept

    Class docstring.

    Parameters:

    Type Name Description Default int value The thing's value. 0

    Class docstring.

    __init__(value=0)

    Initialize a thing.

    Parameters:

    Type Name Description Default int value The thing's value. 0"},{"location":"usage/configuration/docstrings/#show_if_no_docstring","title":"show_if_no_docstringfunction_without_docstringfunction_with_docstringClassWithoutDocstringfunction_with_docstringClassWithoutDocstring","text":"
    • Type bool False

    Show the object heading even if it has no docstring or children with docstrings.

    Without an explicit list of members, members are selected based on filters, and then filtered again to keep only those with docstrings. Checking if a member has a docstring is done recursively: if at least one of its direct or indirect members (lower in the tree) has a docstring, the member is rendered. If the member does not have a docstring, and none of its members have a docstring, it is excluded.

    With this option you can tell the Python handler to skip the docstring check.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_if_no_docstring: false\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_if_no_docstring: true\n
    def function_without_docstring():\n    ...\n\n\ndef function_with_docstring():\n    \"\"\"Hello.\"\"\"\n\n\nclass ClassWithoutDocstring:\n    def method_without_docstring(self):\n        ...\n\n    def method_with_docstring(self):\n        \"\"\"Hello.\"\"\"\n

    Preview

    ShowDon't show

    Hello.

    method_without_docstring method_with_docstring

    Hello.

    Hello.

    method_with_docstring

    Hello.

    "},{"location":"usage/configuration/docstrings/#show_docstring_attributes","title":"show_docstring_attributesClassClass","text":"
    • Type bool True

    Whether to render the \"Attributes\" sections of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_attributes: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_attributes: false\n
    class Class:\n    \"\"\"Summary.\n\n    Attributes:\n        attr: Some attribute.\n    \"\"\"\n\n    attr: int = 1\n

    Preview

    With attributesWithout attributes

    Summary.

    Attributes:

    Type Name Description int attr Some attribute.

    Summary.

    "},{"location":"usage/configuration/docstrings/#show_docstring_functions","title":"show_docstring_functionsmodulemodule","text":"
    • Type bool True

    Whether to render the \"Functions\" or \"Methods\" sections of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_functions: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_functions: false\n
    \"\"\"Summary.\n\nFunctions:\n    foo: Some function.\n\"\"\"\n\n\ndef foo():\n    ...\n\n\nclass Class:\n    \"\"\"Summary.\n\n    Methods:\n        bar: Some method.\n    \"\"\"\n\n    def bar(self):\n        ...\n

    Preview

    With functionsWithout functions

    Summary.

    Functions:

    Name Description foo Some function. Class

    Summary.

    Methods:

    Name Description bar Some method.

    Summary.

    Class

    Summary.

    "},{"location":"usage/configuration/docstrings/#show_docstring_classes","title":"show_docstring_classesmodulemodule","text":"
    • Type bool True

    Whether to render the \"Classes\" sections of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_classes: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_classes: false\n
    \"\"\"Summary.\n\nClasses:\n    Class: Some class.\n\"\"\"\n\n\nclass Class:\n    \"\"\"Summary.\"\"\"\n

    Preview

    With classesWithout classes

    Summary.

    Classes:

    Name Description Class Some class. Class

    Summary.

    Summary.

    Class

    Summary.

    "},{"location":"usage/configuration/docstrings/#show_docstring_modules","title":"show_docstring_modulesmodulemodule","text":"
    • Type bool True

    Whether to render the \"Modules\" sections of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_modules: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_modules: false\n
    \ud83d\udcc1 module/\n\u251c\u2500\u2500 \ud83d\udcc4 __init__.py\n\u2514\u2500\u2500 \ud83d\udcc4 submodule.py\n
    module/__init__.py
    \"\"\"Summary.\n\nModules:\n    submodule: Some module.\n\"\"\"\n

    Preview

    With modulesWithout modules

    Summary.

    Modules:

    Name Description submodule Some module.

    Summary.

    "},{"location":"usage/configuration/docstrings/#show_docstring_description","title":"show_docstring_descriptionClassClass","text":"
    • Type bool True

    Whether to render the textual blocks (including admonitions) of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_description: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_description: false\n
    class Class:\n    \"\"\"Summary.\n\n    Long description.\n\n    Warning: Deprecated\n        Stop using this class.\n\n    Attributes:\n        attr: Some attribute.\n    \"\"\"\n\n    attr: int = 1\n

    Preview

    With description blocksWithout description blocks

    Summary.

    Long description.

    Deprecated

    Stop using this class.

    Attributes:

    Type Name Description int attr Some attribute.

    Attributes:

    Type Name Description int attr Some attribute."},{"location":"usage/configuration/docstrings/#show_docstring_examples","title":"show_docstring_examplesprint_helloprint_hello","text":"
    • Type bool True

    Whether to render the \"Examples\" section of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_examples: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_examples: false\n
    def print_hello():\n    \"\"\"Print hello.\n\n    Examples:\n        >>> print(\"hello\")\n        hello\n    \"\"\"\n    print(\"hello\")\n

    Preview

    With examplesWithout examples

    Print hello.

    Examples:

    >>> print(\"hello\")\nhello\n

    Print hello.

    "},{"location":"usage/configuration/docstrings/#show_docstring_other_parameters","title":"show_docstring_other_parametersdo_somethingdo_something","text":"
    • Type bool True

    Whether to render the \"Other Parameters\" section of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_other_parameters: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_other_parameters: false\n
    def do_something(**kwargs):\n    \"\"\"Do something.\n\n    Other parameters:\n        whatever (int): Some integer.\n    \"\"\"\n

    Preview

    With other parametersWithout other parameters

    Do something.

    Other parameters:

    Type Name Description int whatever Some integer.

    Do something.

    "},{"location":"usage/configuration/docstrings/#show_docstring_parameters","title":"show_docstring_parametersdo_somethingdo_something","text":"
    • Type bool True

    Whether to render the \"Parameters\" section of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_parameters: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_parameters: false\n
    def do_something(whatever: int = 0):\n    \"\"\"Do something.\n\n    Parameters:\n        whatever: Some integer.\n    \"\"\"\n

    Preview

    With parametersWithout parameters

    Do something.

    Parameters:

    Type Name Description Default int whatever Some integer. 0

    Do something.

    "},{"location":"usage/configuration/docstrings/#show_docstring_raises","title":"show_docstring_raisesraise_runtime_errorraise_runtime_error","text":"
    • Type bool True

    Whether to render the \"Raises\" section of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_raises: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_raises: false\n
    def raise_runtime_error():\n    \"\"\"Raise a runtime error.\n\n    Raises:\n        RuntimeError: Not good.\n    \"\"\"\n    raise RuntimeError\n

    Preview

    With exceptionsWithout exceptions

    Raise a runtime error.

    Raises:

    Type Description RuntimeError Not good.

    Raise a runtime error.

    "},{"location":"usage/configuration/docstrings/#show_docstring_receives","title":"show_docstring_receivesiter_skipiter_skip","text":"
    • Type bool True

    Whether to render the \"Receives\" section of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_receives: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_receives: false\n
    def iter_skip(\n    iterable: Iterable[T],\n    initial_skip: int = 0,\n) -> Generator[T, int, None]:\n    \"\"\"Iterate and skip elements.\n\n    Receives:\n        skip: Number of elements to skip.\n    \"\"\"\n    skip = initial_skip\n    for element in iterable:\n        if skip or 0 > 0:\n            skip -= 1\n        else:\n            skip = yield element\n

    Preview

    With received valuesWithout received values

    Iterate and skip elements.

    Receives:

    Type Description int Number of elements to skip.

    Iterate and skip elements.

    "},{"location":"usage/configuration/docstrings/#show_docstring_returns","title":"show_docstring_returnsrandrand","text":"
    • Type bool True

    Whether to render the \"Returns\" section of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_returns: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_returns: false\n
    def rand() -> int:\n    \"\"\"Return a random number.\n\n    Returns:\n        A random number.\n    \"\"\"\n    return random.randint(0, 1000)\n

    Preview

    With return valueWithout return value

    Return a random number.

    Returns:

    Type Description int A random number.

    Return a random number.

    "},{"location":"usage/configuration/docstrings/#show_docstring_warns","title":"show_docstring_warnswarnwarn","text":"
    • Type bool True

    Whether to render the \"Warns\" section of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_warns: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_warns: false\n
    def warn():\n    \"\"\"Warn user.\n\n    Warns:\n        UserWarning: When this is inappropriate.\n    \"\"\"\n    warnings.warn(UserWarning(\"This is inappropriate\"))\n

    Preview

    With warningsWithout warnings

    Warn user.

    Warns:

    Type Description UserWarning When this is inappropriate.

    Warn user.

    "},{"location":"usage/configuration/docstrings/#show_docstring_yields","title":"show_docstring_yieldsiter_skipiter_skip","text":"
    • Type bool True

    Whether to render the \"Yields\" section of docstrings.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_yields: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_docstring_yields: false\n
    def iter_skip(\n    iterable: Iterable[T],\n    initial_skip: int = 0,\n) -> Generator[T, int, None]:\n    \"\"\"Iterate and skip elements.\n\n    Yields:\n        Elements of the iterable.\n    \"\"\"\n    skip = initial_skip\n    for element in iterable:\n        if skip or 0 > 0:\n            skip -= 1\n        else:\n            skip = yield element\n

    Preview

    With yielded valuesWithout yielded values

    Iterate and skip elements.

    Yields:

    Type Description T Elements of the iterable.

    Iterate and skip elements.

    "},{"location":"usage/configuration/general/","title":"General options","text":""},{"location":"usage/configuration/general/#allow_inspection","title":"allow_inspectionSomeClassSomeClass","text":"
    • Type bool True

    Whether to allow inspecting modules (importing them) when it is not possible to visit them (parse their source code).

    When loading data for a given package, Griffe discovers every Python module, compiled or not, and inspects or visits them accordingly.

    If you have compiled modules but also provide stubs for them, you might want to disable the inspection of these modules, because inspection picks up many more members, and sometimes the collected data is inaccurate (depending on the tool that was used to compile the module) or too low-level/technical for API documentation.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          allow_inspection: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.object\n    options:\n      allow_inspection: false\n

    Preview

    With inspectionWithout inspection

    Docstring of the class.

    __eq__

    Method docstring.

    __weakref__

    Method docstring.

    documented_method

    Method docstring.

    Docstring of the class.

    documented_method

    Method docstring.

    "},{"location":"usage/configuration/general/#show_bases","title":"show_basesSomeClass()SomeClass()","text":"
    • Type bool True

    Show the base classes of a class.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_bases: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.object\n    options:\n      show_bases: false\n

    Preview

    With basesWithout bases

    Bases: SomeBaseClass

    Docstring of the class.

    Docstring of the class.

    "},{"location":"usage/configuration/general/#show_source","title":"show_sourcesome_function()some_function()","text":"
    • Type bool True

    Show the source code of this object.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_source: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.object\n    options:\n      show_source: false\n

    Preview

    With sourceWithout source

    Docstring of the function.

    Source code in package/module.py
    def some_function():\n    ...\n

    Docstring of the function.

    "},{"location":"usage/configuration/general/#preload_modules","title":"preload_modulesyour_moduleyour_module","text":"
    • Type list[str] | None None

    Pre-load modules that are not specified directly in autodoc instructions (::: identifier). It is useful when you want to render documentation for a particular member of an object, and this member is imported from another package than its parent.

    For an imported member to be rendered, you need to add it to the __all__ attribute of the importing module. The package from which the imported object originates must be accessible to the handler (see Finding modules).

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          preload_modules:\n          - their_package\n
    or in docs/some_page.md (local configuration)
    ::: your_package.your_module\n    options:\n      preload_modules:\n      - their_package   \n
    your_package/your_module.py
    from their_package.their_module import their_object\n\n__all__ = [\"their_object\"]\n\n# rest of your code\n

    Preview

    With preloaded modulesWithout preloaded modules

    Docstring of your module.

    their_object

    Docstring of their object.

    Docstring of your module.

    "},{"location":"usage/configuration/headings/","title":"Headings options","text":""},{"location":"usage/configuration/headings/#heading_level","title":"heading_level","text":"
    • Type int 2

    The initial heading level to use.

    When injecting documentation for an object, the object itself and its members are rendered. For each layer of objects, we increase the heading level by 1.

    The initial heading level will be used for the first layer. If you set it to 3, then headings will start with <h3>.

    If the heading for the root object is not shown, then the initial heading level is used for its members.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          heading_level: 2\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      heading_level: 3\n

    Preview

    With level 3 and root headingWith level 3, without root heading module (3)

    Docstring of the module.

    ClassA (4)

    Docstring of class A.

    ClassB (4)

    Docstring of class B.

    method_1 (5)

    Docstring of the method.

    Docstring of the module.

    ClassA (3)

    Docstring of class A.

    ClassB (3)

    Docstring of class B.

    method_1 (4)

    Docstring of the method.

    "},{"location":"usage/configuration/headings/#show_root_heading","title":"show_root_headingClassA (2)ClassB (2)method_a1 (2)method_b1 (2)","text":"
    • Type bool False

    Show the heading of the object at the root of the documentation tree (i.e. the object referenced by the identifier after :::).

    It is pretty common to inject documentation for one module per page, especially when following our automatic reference pages recipe. Since each page already has a title, usually being the module's name, we can spare one heading level by not showing the heading for the module itself (heading levels are limited to 6 by the HTML specification).

    Sparing that extra level can be helpful when your objects tree is deeply nested (e.g. method in a class in a class in a module). If your objects tree is not deeply nested, and you are injecting documentation for many different objects on a single page, it might be preferable to render the heading of each object.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_root_heading: false\n
    or in docs/some_page.md (local configuration)
    ::: path.to.ClassA\n    options:\n      show_root_heading: true\n\n::: path.to.ClassB\n    options:\n      show_root_heading: true\n

    Preview

    With root headingWithout root heading

    Docstring of class A.

    method_a1 (3)

    Docstring of the method.

    Docstring of class B.

    method_b1 (3)

    Docstring of the method.

    Docstring of class A.

    Docstring of the method.

    Docstring of class B.

    Docstring of the method.

    "},{"location":"usage/configuration/headings/#show_root_toc_entry","title":"show_root_toc_entry","text":"
    • Type bool True

    If the root heading is not shown, at least add a ToC entry for it.

    If you inject documentation for an object in the middle of a page, after long paragraphs, and without showing the root heading, then you will not be able to link to this particular object as it won't have a permalink and will be \"lost\" in the middle of text. In that case, it is useful to add a hidden anchor to the document, which will also appear in the table of contents.

    In other cases, you might want to disable the entry to avoid polluting the ToC. It is not possible to show the root heading and hide the ToC entry.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_root_toc_entry: true\n
    or in docs/some_page.md (local configuration)
    ## Some heading\n\nLots of text.\n\n::: path.to.object\n    options:\n      show_root_toc_entry: false\n\n## Other heading.\n\nMore text.\n

    Preview

    With ToC entryWithout ToC entry

    Table of contents Some heading object Other heading

    Table of contents Some heading Other heading

    "},{"location":"usage/configuration/headings/#show_root_full_path","title":"show_root_full_pathpackage.module.Class.methodmethod","text":"
    • Type bool True

    Show the full Python path for the root object heading.

    The path of a Python object is the dot-separated list of names under which it is accessible, for example package.module.Class.method.

    With this option you can choose to show the full path of the object you inject documentation for, or just its name. This option impacts only the object you specify, not its members. For members, see the two other options show_root_members_full_path and show_object_full_path.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_root_full_path: true\n
    or in docs/some_page.md (local configuration)
    ::: package.module.Class.method\n    options:\n      show_root_full_path: false\n

    Preview

    With root full pathWithout root full path

    Docstring of the method.

    Docstring of the method.

    "},{"location":"usage/configuration/headings/#show_root_members_full_path","title":"show_root_members_full_pathpackage.module.ClassClass","text":"
    • Type bool False

    Show the full Python path of the root members.

    This option does the same thing as show_root_full_path, but for direct members of the root object instead of the root object itself.

    To show the full path for every member recursively, see show_object_full_path.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_root_members_full_path: true\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      show_root_members_full_path: false\n

    Preview

    With members full pathWithout members full path

    Docstring of the module.

    Docstring of the class.

    method

    Docstring of the method.

    Docstring of the module.

    Docstring of the class.

    method

    Docstring of the method.

    "},{"location":"usage/configuration/headings/#show_object_full_path","title":"show_object_full_pathpackage.module.ClassClass","text":"
    • Type bool False

    Show the full Python path of every object.

    Same as for show_root_members_full_path, but for every member, recursively. This option takes precedence over show_root_members_full_path:

    show_root_members_full_path show_object_full_path Direct root members path False False Name only False True Full True False Full True True Full in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_object_full_path: true\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      show_object_full_path: false\n

    Preview

    With objects full pathWithout objects full path

    Docstring of the module.

    Docstring of the class.

    package.module.Class.method

    Docstring of the method.

    Docstring of the module.

    Docstring of the class.

    method

    Docstring of the method.

    "},{"location":"usage/configuration/headings/#show_category_heading","title":"show_category_headingAttributes (2)Classes (2)module_attribute (2)Class (2)","text":"
    • Type bool False

    When grouped by categories, show a heading for each category. These category headings will appear in the table of contents, allowing you to link to them using their permalinks.

    Not recommended with deeply nested object

    When injecting documentation for deeply nested objects, you'll quickly run out of heading levels, and the objects at the bottom of the tree risk all getting documented using H6 headings, which might decrease the readability of your API docs.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          group_by_category: true\n          show_category_heading: true\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      group_by_category: true\n      show_category_heading: false\n

    Preview

    With category headingsWithout category headings

    Docstring of the module.

    module_attribute (3)

    Docstring of the module attribute.

    Class (3)

    Docstring of the class.

    Attributes (4) class_attribute (5)

    Docstring of the class attribute.

    Methods (4) method (5)

    Docstring of the method.

    Docstring of the module.

    Docstring of the module attribute.

    Docstring of the class.

    class_attribute (3)

    Docstring of the class attribute.

    method (3)

    Docstring of the method.

    "},{"location":"usage/configuration/headings/#show_symbol_type_heading","title":"show_symbol_type_heading attribute function ClassattributefunctionClass","text":"

    Sponsors only \u2014 Insiders 1.1.0

    • Type bool False

    Show the symbol type in headings.

    This option will prefix headings with , , , or types. See also show_symbol_type_toc.

    To customize symbols, see Customizing symbol types.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_symbol_type_heading: true\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      show_symbol_type_heading: false\n

    Preview

    With symbol type in headingsWithout symbol type in headings module

    Docstring of the module.

    Docstring of the module attribute.

    Docstring of the function.

    Docstring of the class.

    method

    Docstring of the method.

    module

    Docstring of the module.

    Docstring of the module attribute.

    Docstring of the function.

    Docstring of the class.

    method

    Docstring of the method.

    "},{"location":"usage/configuration/headings/#show_symbol_type_toc","title":"show_symbol_type_toc","text":"

    Sponsors only \u2014 Insiders 1.1.0

    • Type bool False

    Show the symbol type in the Table of Contents.

    This option will prefix items in the ToC with , , , or types. See also show_symbol_type_heading.

    To customize symbols, see Customizing symbol types.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_symbol_type_toc: true\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      show_symbol_type_toc: false\n

    Preview

    With symbol type in ToCWithout symbol type in ToC
    • module
    • attribute
    • function
    • Class
      • method
    • module
    • attribute
    • function
    • Class
      • method
    "},{"location":"usage/configuration/members/","title":"Members options","text":""},{"location":"usage/configuration/members/#members","title":"membersthis_functionThisClassthis_attributeThisClass","text":"
    • Type list[str] | bool | None None

    An explicit list of members to render.

    Only members declared in this list will be rendered. A member without a docstring will still be rendered, even if show_if_no_docstring is set to false.

    The members will be rendered in the specified order, regardless of the value of members_order.

    Passing a falsy value (no, false in YAML) or an empty list ([]) will tell the Python handler not to render any member. Passing a truthy value (yes, true in YAML) will tell the Python handler to render every member.

    Any given value, except for an explicit None (null in YAML) will tell the handler to ignore filters for the object's members. Filters will still be applied to the next layers of members (grand-children).

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          members:\n          - hello  # (1)\n
    1. Most of the time it won't make sense to use this option at the global level.
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      members:\n      - ThisClass\n      - this_function\n
    package/module.py
    \"\"\"Module docstring.\"\"\"\n\n\ndef this_function():\n    \"\"\"Function docstring.\"\"\"\n\n\nclass ThisClass:\n    \"\"\"Class docstring.\"\"\"\n\n    def method(self):\n        \"\"\"Method docstring.\"\"\"\n\n\nthis_attribute = 0\n\"\"\"Attribute docstring.\"\"\"\n

    Preview

    With members: trueWith members: false or members: []With members: [ThisClass]

    Module docstring.

    Function docstring.

    Class docstring.

    method

    Method docstring.

    Attribute docstring.

    Module docstring.

    Module docstring.

    Class docstring.

    method

    Method docstring.

    The default behavior (with unspecified members or members: null) is to use filters.

    "},{"location":"usage/configuration/members/#inherited_members","title":"inherited_membersBaseMainBaseMain","text":"
    • Type list[str] | bool False

    An explicit list of inherited members (for classes) to render.

    Inherited members are always fetched from classes that are in the same package as the currently rendered class. To fetch members inherited from base classes, themselves coming from external packages, use the preload_modules option. For example, if your class inherits from Pydantic's BaseModel, and you want to render BaseModel's methods in your class, use preload_modules: [pydantic]. The pydantic package must be available in the current environment.

    Passing a falsy value (no, false in YAML) or an empty list ([]) will tell the Python handler not to render any inherited member. Passing a truthy value (yes, true in YAML) will tell the Python handler to render every inherited member.

    When all inherited members are selected with inherited_members: true, it is possible to specify both members and inherited members in the members list:

    inherited_members: true\nmembers:\n- inherited_member_a\n- inherited_member_b\n- member_x\n- member_y\n

    The alternative is not supported:

    inherited_members:\n- inherited_member_a\n- inherited_member_b\nmembers:\n- member_x\n- member_y\n

    ...because it would make members ordering ambiguous/unspecified.

    You can render inherited members only by setting inherited_members: true (or a list of inherited members) and setting members: false:

    inherited_members: true\nmembers: false\n
    inherited_members:\n- inherited_member_a\n- inherited_member_b\nmembers: false\n

    You can render all declared members and all or specific inherited members by leaving members as null (default):

    inherited_members:\n- inherited_member_a\n- inherited_member_b\n# members: null  # (1)\n
    1. In this case, only declared members will be subject to further filtering with filters and docstrings.
    inherited_members: true  # (1)\n# members: null\n
    1. In this case, both declared and inherited members will be subject to further filtering with filters and docstrings.

    You can render all declared members and all or specific inherited members, avoiding further filtering with filters and docstrings by setting members: true:

    inherited_members: true\nmembers: true\n
    inherited_members:\n- inherited_member_a\n- inherited_member_b\nmembers: true\n

    The general rule is that declared or inherited members specified in lists are never filtered out.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          inherited_members: false\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      inherited_members: true\n
    package/module.py
    \"\"\"Module docstring.\"\"\"\n\n\nclass Base:\n    \"\"\"Base class.\"\"\"\n\n    def base(self):\n        \"\"\"Base method.\"\"\"\n\n\nclass Main(Base):\n    \"\"\"Main class.\"\"\"\n\n    def main(self):\n        \"\"\"Main method.\"\"\"\n

    Preview

    With inherited membersWithout inherited members

    Module docstring.

    Base class.

    base

    Base method.

    Main class.

    base

    Base method.

    main

    Main method.

    Module docstring.

    Base class.

    base

    Base method.

    Main class.

    main

    Main method.

    "},{"location":"usage/configuration/members/#members_order","title":"members_orderfunction_afunction_bfunction_cfunction_bfunction_afunction_c","text":"
    • Type str \"alphabetical\"

    The members ordering to use. Possible values:

    • alphabetical: order by the members names.
    • source: order members as they appear in the source file.

    The order applies for all members, recursively. The order will be ignored for members that are explicitely sorted using the members option.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          members_order: alphabetical\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      members_order: source\n
    package/module.py
    \"\"\"Module docstring.\"\"\"\n\n\ndef function_b():\n    \"\"\"Function a.\"\"\"\n\n\ndef function_a():\n    \"\"\"Function b.\"\"\"\n\n\ndef function_c():\n    \"\"\"Function c.\"\"\"\n

    Preview

    With alphabetical orderWith source order

    Module docstring.

    Function a.

    Function b.

    Function c.

    Module docstring.

    Function b.

    Function a.

    Function c.

    "},{"location":"usage/configuration/members/#filters","title":"filtershello_worldhello_world","text":"
    • Type list[str] | None [\"!^_[^_]\"]

    A list of filters applied to filter objects based on their name.

    Filters are regular expressions. These regular expressions are evaluated by Python and so must match the syntax supported by the re module. A filter starting with ! (negative filter) will exclude matching objects instead of including them.

    The default value ([\"!^_[^_]\"]) means: render every object, except those starting with one underscore, unless they start with two underscores. It means that an object whose name is hello, __hello, or __hello__ will be rendered, but not one whose name is _hello.

    Each filter takes precedence over the previous one. This allows for fine-grain selection of objects by adding more specific filters. For example, you can start by unselecting objects that start with _, and add a second filter that re-select objects that start with __. The default filters can therefore be rewritten like this:

    filters:\n- \"!^_\"\n- \"^__\"\n

    If there are no negative filters, the handler considers that everything is unselected first, and then selects things based on your positive filters. If there is at least one negative filter, the handler considers that everything is selected first, and then re-selects/unselects things based on your other filters. In short, filters: [\"a\"] means \"keep nothing except names containing a\", while filters: [\"!a\"] means \"keep everything except names containing a\".

    An empty list of filters tells the Python handler to render every object. The members option takes precedence over filters (filters will still be applied recursively to lower members in the hierarchy).

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          filters:\n          - \"!^_\"\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      filters: []\n
    package/module.py
    def hello():\n    ...\n\n\ndef _world():\n    ...\n

    Preview

    With filters: []With filters: [\"hello\"]With filters: [\"!hello\"]

    Module docstring.

    Function docstring.

    Function docstring.

    Module docstring.

    Function docstring.

    Module docstring.

    Function docstring.

    Common filters

    Here are some common filters that you might to want to use.

    • [\"!^_\"]: exclude all private/protected/special objects
    • [\"!^_\", \"^__init__$\"]: same as above, but keep __init__ methods
    • [\"!^_[^_]\"]: exclude all private/protected objects, keep special ones (default filters)
    "},{"location":"usage/configuration/members/#group_by_category","title":"group_by_categoryattribute_cClassBfunction_afunction_dfunction_aClassBattribute_cfunction_d","text":"
    • Type bool True

    Group the object members by categories: attributes, classes, functions, and modules.

    Members within a same category will be ordered according to the members_order option. You can use the show_category_heading option to also render a heading for each category.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          group_by_category: true\n
    or in docs/some_page.md (local configuration)
    ::: package.module\n    options:\n      group_by_category: false\n
    package/module.py
    def function_a():\n    ...\n\n\nclass ClassB:\n    ...\n\n\nattribute_C = 0\n\n\ndef function_d():\n    ...\n

    Preview

    With category groupingWithout category grouping

    Module docstring.

    Attribute docstring.

    Class docstring.

    Function docstring.

    Function docstring.

    Module docstring.

    Function docstring.

    Class docstring.

    Attribute docstring.

    Function docstring.

    "},{"location":"usage/configuration/members/#show_submodules","title":"show_submodulessubpackage_membersubmodulesubpackage_member","text":"
    • Type bool False

    When rendering a module, show its submodules recursively.

    This is false by default, because most of the time we render only one module per page, and when rendering a package (a tree of modules and their members) on a single page, we quickly run out of heading levels.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_submodules: true\n
    or in docs/some_page.md (local configuration)
    ::: package.subpackage\n    options:\n      show_submodules: false\n
    package
    \ud83d\udcc1 package\n\u251c\u2500\u2500 \ud83d\udcc4 __init__.py\n\u2514\u2500\u2500 \ud83d\udcc1 subpackage\n    \u251c\u2500\u2500 \ud83d\udcc4 __init__.py\n    \u2514\u2500\u2500 \ud83d\udcc4 submodule.py\n

    Preview

    With submodulesWithout submodules

    Subpackage docstring.

    Member docstring.

    Submodule docstring.

    submodule_member

    Member docstring.

    Subpackage docstring.

    Member docstring.

    "},{"location":"usage/configuration/members/#summary","title":"summaryMyClassMyClass","text":"

    Sponsors only \u2014 Insiders 1.2.0

    • Type bool | dict[str, bool] False

    Whether to render summaries of modules, classes, functions (methods) and attributes.

    This option accepts a boolean (yes, true, no, false in YAML) or a dictionary with one or more of the following keys: attributes, functions, classes, modules, with booleans as values. Class methods summary is (de)activated with the functions key. By default, summary is false, and by extension all values are false.

    Examples:

    summary: true\n
    summary: false\n
    summary:\n  attributes: false\n  functions: true\n  modules: false\n

    Summaries will be rendered as the corresponding docstring sections. For example, the summary for attributes will be rendered as an Attributes docstring section. The section will be rendered in accordance with the docstring_section_style option. If the objects appearing in the summary are also rendered on the page (or somewhere else on the site), their name will automatically link to their rendered documentation.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          summary: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      summary: false\n

    Preview

    With all summariesWith methods summary only
    ::: path.to.module.MyClass\n    options:\n      summary: true\n

    Class docstring.

    Methods:

    • my_method1: Summary of the method (first docstring line).
    • my_method2: Summary of the method (first docstring line).

    Attributes:

    • attr1: Summary of the attribute (first docstring line).
    • attr2: Summary of the attribute (first docstring line).
    ::: path.to.module.MyClass\n    options:\n      summary:\n        functions: true\n

    Class docstring.

    Methods:

    • my_method1: Summary of the method (first docstring line).
    • my_method2: Summary of the method (first docstring line).
    "},{"location":"usage/configuration/signatures/","title":"Signatures options","text":""},{"location":"usage/configuration/signatures/#annotations_path","title":"annotations_pathconvert(text, md)convert(text, md)convert(text, md)","text":"
    • Type str \"brief\"

    The verbosity for annotations path.

    Possible values:

    • brief (recommended): render only the last component of each type path, not their full paths. For example, it will render Sequence[Path] and not typing.Sequence[pathlib.Path]. Brief annotations will cross-reference the right object anyway, and show the full path in a tooltip when hovering them.
    • source: render annotations as written in the source. For example if you imported typing as t, it will render typing.Sequence as t.Sequence. Each part will cross-reference the relevant object: t will link to the typing module and Sequence will link to the Sequence type.
    • full: render annotations with their full path (the opposite of brief). For example if you import Sequence and Pattern from typing and annoate something using Sequence[Pattern], it will render as typing.Sequence[typing.Pattern], with each part cross-referencing the corresponding object.
    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          annotations_path: brief\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      annotations_path: source\n

    Preview

    Brief annotationsSource annotationsFull annotations
    import markdown\nimport markupsafe\n\n\ndef convert(text: str, md: markdown.Markdown) -> markupsafe.Markup:\n    \"\"\"Convert text to Markdown.\n\n    Parameters:\n        text: The text to convert.\n        md: A Markdown instance.\n\n    Returns:\n        Converted markup.\n    \"\"\"\n    return markupsafe.Markup(md.convert(text))\n

    Convert text to Markdown.

    Parameters:

    Type Description Default str The text to convert. required Markdown A Markdown instance. required

    Returns:

    Type Name Description Markup text Converted markup.
    import markdown\nfrom markupsafe import Markup\n\n\ndef convert(text: str, md: markdown.Markdown) -> Markup:\n    \"\"\"Convert text to Markdown.\n\n    Parameters:\n        text: The text to convert.\n        md: A Markdown instance.\n\n    Returns:\n        Converted markup.\n    \"\"\"\n    return Markup(md.convert(text))\n

    Convert text to Markdown.

    Parameters:

    Type Description Default str The text to convert. required markdown.Markdown A Markdown instance. required

    Returns:

    Type Name Description Markup text Converted markup.
    from markdown import Markdown\nfrom markupsafe import Markup\n\n\ndef convert(text: str, md: Markdown) -> Markup:\n    \"\"\"Convert text to Markdown.\n\n    Parameters:\n        text: The text to convert.\n        md: A Markdown instance.\n\n    Returns:\n        Converted markup.\n    \"\"\"\n    return Markup(md.convert(text))\n

    Convert text to Markdown.

    Parameters:

    Type Description Default str The text to convert. required markdown.Markdown A Markdown instance. required

    Returns:

    Type Name Description markupsafe.Markup text Converted markup."},{"location":"usage/configuration/signatures/#line_length","title":"line_lengthlong_function_namelong_function_name","text":"
    • Type int 60

    Maximum line length when formatting code/signatures.

    When separating signatures from headings with the separate_signature option, the Python handler will try to format the signatures using Black and the specified line length.

    If Black is not installed, the handler issues an INFO log once.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          separate_signature: true\n          line_length: 60\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      separate_signature: true\n      line_length: 80\n

    Preview

    Line length 60Line length 80
    long_function_name(\n    long_parameter_1=\"hello\",\n    long_parameter_2=\"world\",\n)
    long_function_name(long_parameter_1=\"hello\", long_parameter_2=\"world\")
    "},{"location":"usage/configuration/signatures/#show_signature","title":"show_signaturefunction(param1, param2=None)function","text":"
    • Type bool True

    Show methods and functions signatures.

    Without it, just the function/method name is rendered.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_signature: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      show_signature: false\n

    Preview

    With signatureWithout signature

    Function docstring.

    Function docstring.

    "},{"location":"usage/configuration/signatures/#show_signature_annotations","title":"show_signature_annotationsfunctionfunction","text":"
    • Type bool False

    Show the type annotations in methods and functions signatures.

    Since the heading can become quite long when annotations are rendered, it is usually best to separate the signature from the heading.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          separate_signature: true\n          show_signature_annotations: true\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      separate_signature: true\n      show_signature_annotations: false\n

    Preview

    With signature annotationsWithout signature annotations
    function(\n    param1: list[int | float],\n    param2: bool | None = None,\n) -> float\n

    Function docstring.

    function(param1, param2=None)\n

    Function docstring.

    "},{"location":"usage/configuration/signatures/#separate_signature","title":"separate_signaturefunctionfunction(param1, param2=None)","text":"
    • Type bool False

    Whether to put the whole signature in a code block below the heading.

    When separating signatures from headings, the Python handler will try to format the signatures using Black and the specified line length.

    If Black is not installed, the handler issues an INFO log once.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          separate_signature: false\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      separate_signature: true\n

    Preview

    With separate signatureWithout separate signature
    function(param1, param2=None)\n

    Function docstring.

    Function docstring.

    "},{"location":"usage/configuration/signatures/#signature_crossrefs","title":"signature_crossrefsdo_format_codedo_format_code","text":"

    Sponsors only \u2014 Insiders 1.0.0

    Whether to render cross-references for type annotations in signatures.

    When signatures are separated from headings with the separate_signature option and type annotations are shown with the show_signature_annotations option, this option will render a cross-reference (link) for each type annotation in the signature.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          separate_signature: true\n          show_signature_annotations: true\n          signature_crossrefs: false\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      separate_signature: true\n      show_signature_annotations: true\n      signature_crossrefs: true\n

    Preview

    With signature cross-referencesWithout signature cross-references
    do_format_code(code: str, line_length: int) -> str\n

    Function docstring.

    do_format_code(code: str, line_length: int) -> str\n

    Function docstring.

    "},{"location":"usage/configuration/signatures/#unwrap_annotated","title":"unwrap_annotated","text":"
    • Type bool False

    Whether to unwrap Annotated types to show only the type without the annotations.

    For example, unwrapping Annotated[int, Gt(10)] will render int.

    in mkdocs.yml (global configuration)
    plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          unwrap_annotated: false\n
    or in docs/some_page.md (local configuration)
    ::: path.to.module\n    options:\n      unwrap_annotated: true\n
    "},{"location":"usage/docstrings/google/","title":"Google style","text":""},{"location":"usage/docstrings/google/#work-in-progress","title":"Work in Progress!","text":""},{"location":"usage/docstrings/google/#google-style-admonitions","title":"Google-style admonitions","text":"

    With Google-style docstrings, any section that is not recognized will be transformed into its admonition equivalent. For example:

    DocstringResult
    \"\"\"\nNote:\n    It looks like a section, but it will be rendered as an admonition.\n\nTip: You can even choose a title.\n    This admonition has a custom title!\n\"\"\"\n

    Note

    It looks like a section, but it will be rendered as an admonition.

    You can even choose a title.

    This admonition has a custom title!

    See Napoleon's documentation. See the supported docstring sections on Griffe's documentation.

    "},{"location":"usage/docstrings/numpy/","title":"Numpydoc style","text":""},{"location":"usage/docstrings/numpy/#work-in-progress","title":"Work in Progress!","text":"

    Note

    As Numpy-style is partially supported by the underlying parser, you may experience problems in the building process if your docstring has a Methods section in the class docstring (see #366).

    See Numpydoc's documentation. See the supported docstring sections on Griffe's documentation.

    "},{"location":"usage/docstrings/sphinx/","title":"Sphinx style","text":""},{"location":"usage/docstrings/sphinx/#work-in-progress","title":"Work in Progress!","text":"

    See Sphinx's documentation. See the supported docstring sections on Griffe's documentation.

    "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Overview","text":"mkdocstrings-python

    A Python handler for mkdocstrings.

    The Python handler uses Griffe to collect documentation from Python source code. The word \"griffe\" can sometimes be used instead of \"signature\" in French. Griffe is able to visit the Abstract Syntax Tree (AST) of the source code to extract useful information. It is also able to execute the code (by importing it) and introspect objects in memory when source code is not available. Finally, it can parse docstrings following different styles.

    "},{"location":"#installation","title":"Installation","text":"

    You can install this handler as a mkdocstrings extra:

    pyproject.toml
    # PEP 621 dependencies declaration\n# adapt to your dependencies manager\n[project]\ndependencies = [\n    \"mkdocstrings[python]>=0.18\",\n]\n

    You can also explicitly depend on the handler:

    pyproject.toml
    # PEP 621 dependencies declaration\n# adapt to your dependencies manager\n[project]\ndependencies = [\n    \"mkdocstrings-python\",\n]\n
    "},{"location":"#preview","title":"Preview","text":""},{"location":"#features","title":"Features","text":"
    • Data collection from source code: collection of the object-tree and the docstrings is done thanks to Griffe.

    • Support for type annotations: Griffe collects your type annotations and mkdocstrings uses them to display parameter types or return types. It is even able to automatically add cross-references to other objects from your API, from the standard library or third-party libraries! See how to load inventories to enable it.

    • Recursive documentation of Python objects: just use the module dotted-path as an identifier, and you get the full module docs. You don't need to inject documentation for each class, function, etc.

    • Support for documented attributes: attributes (variables) followed by a docstring (triple-quoted string) will be recognized by Griffe in modules, classes and even in __init__ methods.

    • Multiple docstring-styles support: common support for Google-style, Numpydoc-style, and Sphinx-style docstrings. See Griffe's documentation on docstrings support.

    • Admonition support in Google docstrings: blocks like Note: or Warning: will be transformed to their admonition equivalent. We do not support nested admonitions in docstrings!

    • Every object has a TOC entry: we render a heading for each object, meaning MkDocs picks them into the Table of Contents, which is nicely displayed by the Material theme. Thanks to mkdocstrings cross-reference ability, you can reference other objects within your docstrings, with the classic Markdown syntax: [this object][package.module.object] or directly with [package.module.object][]

    • Source code display: mkdocstrings can add a collapsible div containing the highlighted source code of the Python object.

    "},{"location":"changelog/","title":"Changelog","text":"

    All notable changes to this project will be documented in this file.

    The format is based on Keep a Changelog and this project adheres to Semantic Versioning.

    "},{"location":"changelog/#180-2024-01-08","title":"1.8.0 - 2024-01-08","text":"

    Compare with 1.7.5

    "},{"location":"changelog/#features","title":"Features","text":"
    • Release Insiders features of the $500/month funding goal (bd30106 by Timoth\u00e9e Mazzucotelli). The features and projects related to mkdocstrings-python are:

      • Cross-references for type annotations in signatures
      • Symbol types in headings and table of contents
      • griffe-inherited-docstrings, a Griffe extension for inheriting docstrings
      • griffe2md, a tool to output API docs to Markdown using Griffe

      See the complete list of features and projects here: https://pawamoy.github.io/insiders/#500-plasmavac-user-guide.

    "},{"location":"changelog/#175-2023-11-21","title":"1.7.5 - 2023-11-21","text":"

    Compare with 1.7.4

    "},{"location":"changelog/#bug-fixes","title":"Bug Fixes","text":"
    • Add missing translations (fallback theme) for ReadTheDocs (2fb6513 by Timoth\u00e9e Mazzucotelli). Issue #115
    "},{"location":"changelog/#174-2023-11-12","title":"1.7.4 - 2023-11-12","text":"

    Compare with 1.7.3

    "},{"location":"changelog/#bug-fixes_1","title":"Bug Fixes","text":"
    • Make extension paths relative to config file (5035e92 by Waylan Limberg). PR #112, Co-authored-by: Timoth\u00e9e Mazzucotelli pawamoy@pm.me
    "},{"location":"changelog/#code-refactoring","title":"Code Refactoring","text":"
    • Prepare for Griffe 0.37 (b5bb8a9 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#173-2023-10-09","title":"1.7.3 - 2023-10-09","text":"

    Compare with 1.7.2

    "},{"location":"changelog/#bug-fixes_2","title":"Bug Fixes","text":"
    • Don't deepcopy the local config (1300d2c by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#172-2023-10-05","title":"1.7.2 - 2023-10-05","text":"

    Compare with 1.7.1

    "},{"location":"changelog/#bug-fixes_3","title":"Bug Fixes","text":"
    • Prevent alias resolution error when source-ordering members (67df10c by Timoth\u00e9e Mazzucotelli). Issue griffe#213
    "},{"location":"changelog/#code-refactoring_1","title":"Code Refactoring","text":"
    • Use package relative filepath if filepath is not relative (aa5a3f7 by Timoth\u00e9e Mazzucotelli). Discussion mkdocstrings#622
    "},{"location":"changelog/#171-2023-09-28","title":"1.7.1 - 2023-09-28","text":"

    Compare with 1.7.0

    "},{"location":"changelog/#bug-fixes_4","title":"Bug Fixes","text":"
    • Stop propagation of annotation to next parameter in signature template (3a760ac by Timoth\u00e9e Mazzucotelli). Issue #110
    "},{"location":"changelog/#code-refactoring_2","title":"Code Refactoring","text":"
    • Look into inherited members for __init__ methods when merging docstrings (b97d51f by Timoth\u00e9e Mazzucotelli). Issue #106
    "},{"location":"changelog/#170-2023-09-14","title":"1.7.0 - 2023-09-14","text":"

    Compare with 1.6.3

    "},{"location":"changelog/#features_1","title":"Features","text":"
    • Add option to unwrap Annotated types (53db04b by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#163-2023-09-11","title":"1.6.3 - 2023-09-11","text":"

    Compare with 1.6.2

    "},{"location":"changelog/#bug-fixes_5","title":"Bug Fixes","text":"
    • Make load_external_modules a global-only option (266f41f by Timoth\u00e9e Mazzucotelli). Issue #87
    • Never fail when trying to format code with Black (df24bbc by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_3","title":"Code Refactoring","text":"
    • Wrap docstring section elements (list style) in code tags to prevent spell checker errors (1ae8dd8 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#162-2023-09-05","title":"1.6.2 - 2023-09-05","text":"

    Compare with 1.6.1

    "},{"location":"changelog/#bug-fixes_6","title":"Bug Fixes","text":"
    • Don't render cross-ref spans when they're not enabled (eed51ee by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#161-2023-09-04","title":"1.6.1 - 2023-09-04","text":"

    Compare with 1.6.0

    "},{"location":"changelog/#bug-fixes_7","title":"Bug Fixes","text":"
    • Fix spacing for rendered named items in Yields, Receives and Returns sections (list style) (e12688e by Timoth\u00e9e Mazzucotelli).
    • Fix rendering Receives sections as lists (9ff7e68 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#160-2023-08-27","title":"1.6.0 - 2023-08-27","text":"

    Compare with 1.5.2

    "},{"location":"changelog/#features_2","title":"Features","text":"
    • Add doc-signature CSS class to separate signature code blocks (b6c648f by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_4","title":"Code Refactoring","text":"
    • Add a format_attribute filter, preparing for cross-refs in attribute signatures (8f0ade2 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#152-2023-08-25","title":"1.5.2 - 2023-08-25","text":"

    Compare with 1.5.1

    "},{"location":"changelog/#bug-fixes_8","title":"Bug Fixes","text":"
    • Regression in children template: fix condition for when members are specified (beeebff by Timoth\u00e9e Mazzucotelli). Issue #100
    • Prevent whitespace removal before highlight filter (c6f36c0 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_5","title":"Code Refactoring","text":"
    • Never show full object path in ToC entry (9aa758b by Timoth\u00e9e Mazzucotelli).
    • Sync templates with insiders, remove useless lines (38b317f by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#151-2023-08-24","title":"1.5.1 - 2023-08-24","text":"

    Compare with 1.5.0

    "},{"location":"changelog/#code-refactoring_6","title":"Code Refactoring","text":"
    • Never show full path in separate signature since it would appear in the heading already (9e02049 by Timoth\u00e9e Mazzucotelli).
    • Improve guessing whether an object is public (35eb811 by Timoth\u00e9e Mazzucotelli).
    • Always sort modules alphabetically as source order wouldn't make sense (70c81ce by Timoth\u00e9e Mazzucotelli).
    • Return anchors as a tuple, not a set, to preserve order (736a2b5 by Timoth\u00e9e Mazzucotelli). Related-to #mkdocstrings/crystal#6
    "},{"location":"changelog/#150-2023-08-20","title":"1.5.0 - 2023-08-20","text":"

    Compare with 1.4.0

    "},{"location":"changelog/#features_3","title":"Features","text":"
    • Add support for new Griffe docstring sections: modules, classes, and functions (methods) (d5337af by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#140-2023-08-18","title":"1.4.0 - 2023-08-18","text":"

    Compare with 1.3.0

    "},{"location":"changelog/#features_4","title":"Features","text":"
    • Support new Griffe expressions (in v0.33) (9b8e1b1 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_7","title":"Code Refactoring","text":"
    • Deprecate crossref and multi_crossref filters (4fe3d20 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#130-2023-08-06","title":"1.3.0 - 2023-08-06","text":"

    Compare with 1.2.1

    "},{"location":"changelog/#dependencies","title":"Dependencies","text":"
    • Set upper bound on Griffe (0.33) (ad8c2a3 by Timoth\u00e9e Mazzucotelli). See https://github.com/mkdocstrings/griffe/discussions/195.
    "},{"location":"changelog/#features_5","title":"Features","text":"
    • Show parameter default values within the \"list\" section style too (55f08f3 by Antoine Dechaume). PR #92, Co-authored-by: Timoth\u00e9e Mazzucotelli pawamoy@pm.me
    "},{"location":"changelog/#121-2023-07-20","title":"1.2.1 - 2023-07-20","text":"

    Compare with 1.2.0

    "},{"location":"changelog/#bug-fixes_9","title":"Bug Fixes","text":"
    • Fix members ordering when members are specified with a boolean (c69f9c3 by Timoth\u00e9e Mazzucotelli). Issue #89
    "},{"location":"changelog/#120-2023-07-14","title":"1.2.0 - 2023-07-14","text":"

    Compare with 1.1.2

    "},{"location":"changelog/#features_6","title":"Features","text":"
    • Add Jinja blocks to module, class, function and attribute templates (299fe48 by Timoth\u00e9e Mazzucotelli).
    • Setup infrastructure for I18N, add translations for simplified chinese and japanese (b053b29 by Nyuan Zhang). PR #77
    • Support inheritance (ae42356 by Timoth\u00e9e Mazzucotelli). Issue mkdocstrings#157, Discussion mkdocstrings#536
    "},{"location":"changelog/#bug-fixes_10","title":"Bug Fixes","text":"
    • Don't show None as return annotation of class signatures (3d8724e by Timoth\u00e9e Mazzucotelli). Issue #85
    • Show labels in deterministic order (02619a8 by Oleh Prypin).
    "},{"location":"changelog/#112-2023-06-04","title":"1.1.2 - 2023-06-04","text":"

    Compare with 1.1.1

    "},{"location":"changelog/#code-refactoring_8","title":"Code Refactoring","text":"
    • Keep headings style consistent (CSS) (92032e5 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#111-2023-06-04","title":"1.1.1 - 2023-06-04","text":"

    Compare with 1.1.0

    "},{"location":"changelog/#bug-fixes_11","title":"Bug Fixes","text":"
    • Fix mkdocs and readthedocs themes support (14f18b2 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_9","title":"Code Refactoring","text":"
    • Improve display of paragraphs in docstring sections (439f5e6 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#110-2023-05-25","title":"1.1.0 - 2023-05-25","text":"

    Compare with 1.0.0

    "},{"location":"changelog/#features_7","title":"Features","text":"
    • Support custom templates through objects' extra data (8ff2b06 by Timoth\u00e9e Mazzucotelli). PR #70
    "},{"location":"changelog/#100-2023-05-11","title":"1.0.0 - 2023-05-11","text":"

    Compare with 0.10.1

    "},{"location":"changelog/#breaking-changes","title":"Breaking changes","text":"
    • The signature of the format_signature filter has changed. If you override templates in your project to customize the output, make sure to update the following templates so that they use the new filter signature:

      • class.html
      • expression.html
      • function.html
      • signature.html

      You can see how to use the filter in this commit's changes: f686f4e4.

    We take this as an opportunity to go out of beta and bump the version to 1.0.0. This will allow users to rely on semantic versioning.

    "},{"location":"changelog/#bug-fixes_12","title":"Bug Fixes","text":"
    • Bring compatibility with insiders signature crossrefs feature (f686f4e by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#0101-2023-05-07","title":"0.10.1 - 2023-05-07","text":"

    Compare with 0.10.0

    "},{"location":"changelog/#bug-fixes_13","title":"Bug Fixes","text":"
    • Format signatures with full-path names (685512d by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#0100-2023-05-07","title":"0.10.0 - 2023-05-07","text":"

    Compare with 0.9.0

    "},{"location":"changelog/#features_8","title":"Features","text":"
    • Add option to disallow inspection (40f2f26 by Nyuan Zhang). Issue #68, PR #69
    "},{"location":"changelog/#bug-fixes_14","title":"Bug Fixes","text":"
    • Make admonitions open by default (79cd153 by Timoth\u00e9e Mazzucotelli). Issue #22
    "},{"location":"changelog/#code-refactoring_10","title":"Code Refactoring","text":"
    • Match documented behavior for filtering (all members, list, none) (c7f70c3 by Timoth\u00e9e Mazzucotelli).
    • Switch to an info level log for when black's not installed (f593bb0 by Faster Speeding).
    • Return anchors as a set (e2b820c by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#090-2023-04-03","title":"0.9.0 - 2023-04-03","text":"

    Compare with 0.8.3

    "},{"location":"changelog/#features_9","title":"Features","text":"
    • Allow resolving alias to external modules (02052e2 by Gilad). PR #61, Follow-up of PR #60
    • Allow pre-loading modules (36002cb by Gilad). Issue mkdocstrings/mkdocstrings#503, PR #60
    • Add show options for docstrings (a6c55fb by Jeremy Goh). Issue mkdocstrings/mkdocstrings#466, PR #56
    • Allow custom list of domains for inventories (f5ea6fd by Sorin Sbarnea). Issue mkdocstrings/mkdocstrings#510, PR #49
    "},{"location":"changelog/#bug-fixes_15","title":"Bug Fixes","text":"
    • Prevent alias resolution error when searching for anchors (a190e2c by Timoth\u00e9e Mazzucotelli). Issue #64
    "},{"location":"changelog/#code-refactoring_11","title":"Code Refactoring","text":"
    • Support Griffe 0.26 (075735c by Timoth\u00e9e Mazzucotelli).
    • Log (debug) unresolved aliases (9164742 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#083-2023-01-04","title":"0.8.3 - 2023-01-04","text":"

    Compare with 0.8.2

    "},{"location":"changelog/#code-refactoring_12","title":"Code Refactoring","text":"
    • Change \"unresolved aliases\" log level to DEBUG (dccb818 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#082-2022-11-19","title":"0.8.2 - 2022-11-19","text":"

    Compare with 0.8.1

    "},{"location":"changelog/#bug-fixes_16","title":"Bug Fixes","text":"
    • Fix base directory used to expand globs (34cfa4b by Florian Hofer). PR #45
    "},{"location":"changelog/#081-2022-11-19","title":"0.8.1 - 2022-11-19","text":"

    Compare with 0.8.0

    "},{"location":"changelog/#bug-fixes_17","title":"Bug Fixes","text":"
    • Expand globs relative to configuration file path (0dc45ae by David Vegh). Issue #42, PR #43
    "},{"location":"changelog/#080-2022-11-13","title":"0.8.0 - 2022-11-13","text":"

    Compare with 0.7.1

    "},{"location":"changelog/#features_10","title":"Features","text":"
    • Add support for globs in paths configuration (29edd02 by Andrew Guenther). Issue #33, PR #34
    "},{"location":"changelog/#code-refactoring_13","title":"Code Refactoring","text":"
    • Support Griffe 0.24 (3b9f701 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#071-2022-06-12","title":"0.7.1 - 2022-06-12","text":"

    Compare with 0.7.0

    "},{"location":"changelog/#bug-fixes_18","title":"Bug Fixes","text":"
    • Fix rendering of / in signatures (3e927e4 by Timoth\u00e9e Mazzucotelli). Issue #25
    "},{"location":"changelog/#070-2022-05-28","title":"0.7.0 - 2022-05-28","text":"

    Compare with 0.6.6

    "},{"location":"changelog/#packaging-dependencies","title":"Packaging / Dependencies","text":"
    • Depend on mkdocstrings 0.19 (b6a9a47 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#features_11","title":"Features","text":"
    • Add config option for annotations paths verbosity (b6c9893 by Timoth\u00e9e Mazzucotelli).
    • Use sections titles in SpaCy-styled docstrings (fe16b54 by Timoth\u00e9e Mazzucotelli).
    • Wrap objects names in spans to allow custom styling (0822ff9 by Timoth\u00e9e Mazzucotelli). Issue mkdocstrings/mkdocstrings#240
    • Add Jinja blocks around docstring section styles (aaa79ee by Timoth\u00e9e Mazzucotelli).
    • Add members and filters options (24a6136 by Timoth\u00e9e Mazzucotelli).
    • Add paths option (dd41182 by Timoth\u00e9e Mazzucotelli). Issue mkdocstrings/mkdocstrings#311, PR #20
    "},{"location":"changelog/#bug-fixes_19","title":"Bug Fixes","text":"
    • Fix CSS class on labels (312a709 by Timoth\u00e9e Mazzucotelli).
    • Fix categories rendering (6407cf4 by Timoth\u00e9e Mazzucotelli). Issue #14
    "},{"location":"changelog/#code-refactoring_14","title":"Code Refactoring","text":"
    • Disable show_submodules by default (480d0c3 by Timoth\u00e9e Mazzucotelli).
    • Merge default configuration options in handler (347ce76 by Timoth\u00e9e Mazzucotelli).
    • Reduce number of template debug logs (8fed314 by Timoth\u00e9e Mazzucotelli).
    • Respect show_root_full_path for ToC entries (hidden headings) (8f4c853 by Timoth\u00e9e Mazzucotelli).
    • Bring consistency on headings style (59104c4 by Timoth\u00e9e Mazzucotelli).
    • Stop using deprecated base classes (d5ea1c5 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#066-2022-03-06","title":"0.6.6 - 2022-03-06","text":"

    Compare with 0.6.5

    "},{"location":"changelog/#code-refactoring_15","title":"Code Refactoring","text":"
    • Always hide self and cls parameters (7f579d1 by Timoth\u00e9e Mazzucotelli). Issue #7
    • Use pycon for examples code blocks (6545900 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#065-2022-02-24","title":"0.6.5 - 2022-02-24","text":"

    Compare with 0.6.4

    "},{"location":"changelog/#bug-fixes_20","title":"Bug Fixes","text":"
    • Don't escape signatures return annotations (ac54bfc by Timoth\u00e9e Mazzucotelli). Issue #6
    "},{"location":"changelog/#064-2022-02-22","title":"0.6.4 - 2022-02-22","text":"

    Compare with 0.6.3

    "},{"location":"changelog/#bug-fixes_21","title":"Bug Fixes","text":"
    • Fix rendering of signature return annotation (b92ba3b by Timoth\u00e9e Mazzucotelli). Issue #4
    "},{"location":"changelog/#063-2022-02-20","title":"0.6.3 - 2022-02-20","text":"

    Compare with 0.6.2

    "},{"location":"changelog/#bug-fixes_22","title":"Bug Fixes","text":"
    • Fix examples rendering (a06a7e3 by Timoth\u00e9e Mazzucotelli). Issue mkdocstrings/griffe#46
    "},{"location":"changelog/#062-2022-02-17","title":"0.6.2 - 2022-02-17","text":"

    Compare with 0.6.1

    "},{"location":"changelog/#bug-fixes_23","title":"Bug Fixes","text":"
    • Catch alias resolution errors (b734dd0 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#061-2022-02-17","title":"0.6.1 - 2022-02-17","text":"

    Compare with 0.6.0

    "},{"location":"changelog/#bug-fixes_24","title":"Bug Fixes","text":"
    • Don't pop from fallback config (bde32af by Timoth\u00e9e Mazzucotelli).
    • Fix rendering init method source when merged into class (4a20aea by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#060-2022-02-13","title":"0.6.0 - 2022-02-13","text":"

    Compare with 0.5.4

    "},{"location":"changelog/#features_12","title":"Features","text":"
    • Add option to merge __init__ methods' docstrings into their classes' docstrings (1b4d1c0 by Timoth\u00e9e Mazzucotelli).
    • Support separate attribute signature (e962b88 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#bug-fixes_25","title":"Bug Fixes","text":"
    • Restore full cross-refs paths on hover (ac11970 by Timoth\u00e9e Mazzucotelli).
    • Fix rendering of labels (52919c5 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_16","title":"Code Refactoring","text":"
    • Don't add trailing parentheses in functions heading when separate signature (885696e by Timoth\u00e9e Mazzucotelli).
    • Use more explicit template debug messages (f2122d7 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#054-2022-02-13","title":"0.5.4 - 2022-02-13","text":"

    Compare with 0.5.3

    "},{"location":"changelog/#bug-fixes_26","title":"Bug Fixes","text":"
    • Don't load additional modules during fallback (69b8e25 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#053-2022-02-08","title":"0.5.3 - 2022-02-08","text":"

    Compare with 0.5.2

    "},{"location":"changelog/#bug-fixes_27","title":"Bug Fixes","text":"
    • Allow passing null as docstring style (f526816 by Timoth\u00e9e Mazzucotelli). Issue #2
    "},{"location":"changelog/#052-2022-02-05","title":"0.5.2 - 2022-02-05","text":"

    Compare with 0.5.1

    "},{"location":"changelog/#dependencies_1","title":"Dependencies","text":"
    • Require at least mkdocstrings 0.18 (7abdda4 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#051-2022-02-03","title":"0.5.1 - 2022-02-03","text":"

    Compare with 0.5.0

    "},{"location":"changelog/#dependencies_2","title":"Dependencies","text":"
    • Depend on Griffe >= 0.11.1 (1303557 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_17","title":"Code Refactoring","text":"
    • Move handler into its own module (b787e78 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#050-2022-02-03","title":"0.5.0 - 2022-02-03","text":"

    Compare with 0.4.1

    "},{"location":"changelog/#features_13","title":"Features","text":"
    • Allow changing docstring style of an object (39240c1 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#bug-fixes_28","title":"Bug Fixes","text":"
    • Warn if Black is not installed when formatting signature (b848277 by Timoth\u00e9e Mazzucotelli).
    • Fix missing default for docstring_section_style option (774988e by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_18","title":"Code Refactoring","text":"
    • Change to new way of stripping paragraphs (33d4594 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#041-2022-02-01","title":"0.4.1 - 2022-02-01","text":"

    Compare with 0.4.0

    "},{"location":"changelog/#bug-fixes_29","title":"Bug Fixes","text":"
    • Fix docstring admonitions rendering (a24ae2e by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#040-2022-02-01","title":"0.4.0 - 2022-02-01","text":"

    Compare with 0.3.0

    "},{"location":"changelog/#code-refactoring_19","title":"Code Refactoring","text":"
    • Use the new mkdocstrings_handlers namespace (23c9023 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#030-2022-01-14","title":"0.3.0 - 2022-01-14","text":"

    Compare with 0.2.0

    "},{"location":"changelog/#features_14","title":"Features","text":"
    • Support griffe 0.10 (28061de by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#dependencies_3","title":"Dependencies","text":"
    • Require griffe 0.10 (cfbd7bb by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_20","title":"Code Refactoring","text":"
    • Use new logger patching utility (4cdb292 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#020-2021-12-28","title":"0.2.0 - 2021-12-28","text":"

    Compare with 0.1.0

    "},{"location":"changelog/#dependencies_4","title":"Dependencies","text":"
    • Depend on griffe >= 0.7.1 (34f7ebd by Timoth\u00e9e Mazzucotelli).
    • Upgrade griffe, no upper bound (8f0aa42 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#features_15","title":"Features","text":"
    • Add show_signature rendering option (0f07c2e by Will Da Silva).
    "},{"location":"changelog/#bug-fixes_30","title":"Bug Fixes","text":"
    • Fix templates for named docstring elements (47868a1 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#010-2021-12-19","title":"0.1.0 - 2021-12-19","text":"

    Compare with first commit

    "},{"location":"changelog/#features_16","title":"Features","text":"
    • Implement handler and add templates (dbb580a by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#bug-fixes_31","title":"Bug Fixes","text":"
    • Fix separate signature feature (da6e81c by Timoth\u00e9e Mazzucotelli).
    • Fix signature template (parameters annotations) (b34ead0 by Timoth\u00e9e Mazzucotelli).
    • Only show source when present (c270d68 by Timoth\u00e9e Mazzucotelli).
    "},{"location":"changelog/#code-refactoring_21","title":"Code Refactoring","text":"
    • Return all known anchors (9bbfe14 by Timoth\u00e9e Mazzucotelli).
    • Update for griffe 0.4.0 (831aabb by Timoth\u00e9e Mazzucotelli).
    "},{"location":"code_of_conduct/","title":"Contributor Covenant Code of Conduct","text":""},{"location":"code_of_conduct/#our-pledge","title":"Our Pledge","text":"

    We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

    We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

    "},{"location":"code_of_conduct/#our-standards","title":"Our Standards","text":"

    Examples of behavior that contributes to a positive environment for our community include:

    • Demonstrating empathy and kindness toward other people
    • Being respectful of differing opinions, viewpoints, and experiences
    • Giving and gracefully accepting constructive feedback
    • Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
    • Focusing on what is best not just for us as individuals, but for the overall community

    Examples of unacceptable behavior include:

    • The use of sexualized language or imagery, and sexual attention or advances of any kind
    • Trolling, insulting or derogatory comments, and personal or political attacks
    • Public or private harassment
    • Publishing others' private information, such as a physical or email address, without their explicit permission
    • Other conduct which could reasonably be considered inappropriate in a professional setting
    "},{"location":"code_of_conduct/#enforcement-responsibilities","title":"Enforcement Responsibilities","text":"

    Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

    Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

    "},{"location":"code_of_conduct/#scope","title":"Scope","text":"

    This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

    "},{"location":"code_of_conduct/#enforcement","title":"Enforcement","text":"

    Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at pawamoy@pm.me. All complaints will be reviewed and investigated promptly and fairly.

    All community leaders are obligated to respect the privacy and security of the reporter of any incident.

    "},{"location":"code_of_conduct/#enforcement-guidelines","title":"Enforcement Guidelines","text":"

    Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

    "},{"location":"code_of_conduct/#1-correction","title":"1. Correction","text":"

    Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

    Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

    "},{"location":"code_of_conduct/#2-warning","title":"2. Warning","text":"

    Community Impact: A violation through a single incident or series of actions.

    Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

    "},{"location":"code_of_conduct/#3-temporary-ban","title":"3. Temporary Ban","text":"

    Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

    Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

    "},{"location":"code_of_conduct/#4-permanent-ban","title":"4. Permanent Ban","text":"

    Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

    Consequence: A permanent ban from any sort of public interaction within the community.

    "},{"location":"code_of_conduct/#attribution","title":"Attribution","text":"

    This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.

    Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    "},{"location":"contributing/","title":"Contributing","text":"

    Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given.

    "},{"location":"contributing/#environment-setup","title":"Environment setup","text":"

    Nothing easier!

    Fork and clone the repository, then:

    cd python\nmake setup\n

    Note

    If it fails for some reason, you'll need to install PDM manually.

    You can install it with:

    python3 -m pip install --user pipx\npipx install pdm\n

    Now you can try running make setup again, or simply pdm install.

    You now have the dependencies installed.

    Run make help to see all the available actions!

    "},{"location":"contributing/#tasks","title":"Tasks","text":"

    This project uses duty to run tasks. A Makefile is also provided. The Makefile will try to run certain tasks on multiple Python versions. If for some reason you don't want to run the task on multiple Python versions, you run the task directly with pdm run duty TASK.

    The Makefile detects if a virtual environment is activated, so make will work the same with the virtualenv activated or not.

    If you work in VSCode, we provide an action to configure VSCode for the project.

    "},{"location":"contributing/#development","title":"Development","text":"

    As usual:

    1. create a new branch: git switch -c feature-or-bugfix-name
    2. edit the code and/or the documentation

    Before committing:

    1. run make format to auto-format the code
    2. run make check to check everything (fix any warning)
    3. run make test to run the tests (fix any issue)
    4. if you updated the documentation or the project dependencies:
      1. run make docs
      2. go to http://localhost:8000 and check that everything looks good
    5. follow our commit message convention

    If you are unsure about how to fix or ignore a warning, just let the continuous integration fail, and we will help you during review.

    Don't bother updating the changelog, we will take care of this.

    "},{"location":"contributing/#commit-message-convention","title":"Commit message convention","text":"

    Commit messages must follow our convention based on the Angular style or the Karma convention:

    <type>[(scope)]: Subject\n\n[Body]\n

    Subject and body must be valid Markdown. Subject must have proper casing (uppercase for first letter if it makes sense), but no dot at the end, and no punctuation in general.

    Scope and body are optional. Type can be:

    • build: About packaging, building wheels, etc.
    • chore: About packaging or repo/files management.
    • ci: About Continuous Integration.
    • deps: Dependencies update.
    • docs: About documentation.
    • feat: New feature.
    • fix: Bug fix.
    • perf: About performance.
    • refactor: Changes that are not features or bug fixes.
    • style: A change in code style/format.
    • tests: About tests.

    If you write a body, please add trailers at the end (for example issues and PR references, or co-authors), without relying on GitHub's flavored Markdown:

    Body.\n\nIssue #10: https://github.com/namespace/project/issues/10\nRelated to PR namespace/other-project#15: https://github.com/namespace/other-project/pull/15\n

    These \"trailers\" must appear at the end of the body, without any blank lines between them. The trailer title can contain any character except colons :. We expect a full URI for each trailer, not just GitHub autolinks (for example, full GitHub URLs for commits and issues, not the hash or the #issue-number).

    We do not enforce a line length on commit messages summary and body, but please avoid very long summaries, and very long lines in the body, unless they are part of code blocks that must not be wrapped.

    "},{"location":"contributing/#pull-requests-guidelines","title":"Pull requests guidelines","text":"

    Link to any related issue in the Pull Request message.

    During the review, we recommend using fixups:

    # SHA is the SHA of the commit you want to fix\ngit commit --fixup=SHA\n

    Once all the changes are approved, you can squash your commits:

    git rebase -i --autosquash main\n

    And force-push:

    git push -f\n

    If this seems all too complicated, you can push or force-push each new commit, and we will squash them ourselves if needed, before merging.

    "},{"location":"credits/","title":"Credits","text":""},{"location":"credits/#exec-1--credits","title":"Credits","text":"

    These projects were used to build mkdocstrings-python. Thank you!

    python | pdm | copier-pdm

    "},{"location":"credits/#exec-1--runtime-dependencies","title":"Runtime dependencies","text":"Project Summary Version (accepted) Version (last resolved) License click Composable command line interface toolkit >=7.0 8.1.7 BSD-3-Clause colorama Cross-platform colored terminal text. >=0.4 0.4.6 BSD License ghp-import Copy your docs directly to the gh-pages branch. >=1.0 2.1.0 Apache Software License griffe Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API. >=0.37 0.38.1 ISC importlib-metadata Read metadata from Python packages >=4.6; python_version < \"3.10\" 7.0.1 ? jinja2 A very fast and expressive template engine. >=2.11.1 3.1.2 BSD-3-Clause markdown Python implementation of John Gruber's Markdown. >=3.3 3.5.1 BSD License markupsafe Safely add untrusted strings to HTML/XML markup. >=1.1 2.1.3 BSD-3-Clause mergedeep A deep merge function for \ud83d\udc0d. >=1.3.4 1.3.4 MIT License mkdocs Project documentation with Markdown. >=1.4 1.5.3 BSD License mkdocs-autorefs Automatically link across pages in MkDocs. >=0.3.1 0.5.0 ISC mkdocstrings Automatic documentation from sources, for MkDocs. >=0.20 0.24.0 ISC packaging Core utilities for Python packages >=20.5 23.2 BSD License pathspec Utility library for gitignore style pattern matching of file paths. >=0.11.1 0.12.1 Mozilla Public License 2.0 (MPL 2.0) platformdirs A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\". >=2.2.0 4.1.0 MIT License pymdown-extensions Extension pack for Python Markdown. >=6.3 10.7 MIT License python-dateutil Extensions to the standard Python datetime module >=2.8.1 2.8.2 Dual License pyyaml YAML parser and emitter for Python 6.0.1 MIT pyyaml-env-tag A custom YAML tag for referencing environment variables in YAML files. >=0.1 0.1 MIT License six Python 2 and 3 compatibility utilities >=1.5 1.16.0 MIT typing-extensions Backported and Experimental Type Hints for Python 3.8+ >=4.1; python_version < \"3.10\" 4.9.0 Python Software Foundation License watchdog Filesystem events monitoring >=2.0 3.0.0 Apache License 2.0 zipp Backport of pathlib-compatible object wrapper for zip files >=0.5 3.17.0 ?"},{"location":"credits/#exec-1--development-dependencies","title":"Development dependencies","text":"Project Summary Version (accepted) Version (last resolved) License ansimarkup Produce colored terminal text with an xml-like markup ~=1.4 1.5.0 Revised BSD License appdirs A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\". >=1.4 1.4.4 MIT babel Internationalization utilities ~=2.10 2.14.0 BSD-3-Clause black The uncompromising code formatter. >=23.9 23.12.1 MIT blacken-docs Run Black on Python code blocks in documentation files. >=1.16 1.16.0 MIT certifi Python package for providing Mozilla's CA Bundle. >=2017.4.17 2023.11.17 MPL-2.0 charset-normalizer The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. <4,>=2 3.3.2 MIT click Composable command line interface toolkit >=8.0.0 8.1.7 BSD-3-Clause colorama Cross-platform colored terminal text. ; platform_system == \"Windows\" 0.4.6 BSD License coverage Code coverage measurement for Python [toml]>=5.2.1 7.4.0 Apache-2.0 csscompressor A python port of YUI CSS Compressor >=0.9.5 0.9.5 BSD dparse A parser for Python dependency files >=0.6.2 0.6.3 MIT license duty A simple task runner. >=0.10 1.1.0 ISC exceptiongroup Backport of PEP 654 (exception groups) >=1.0.0rc8; python_version < \"3.11\" 1.2.0 ? execnet execnet: rapid multi-Python deployment >=1.1 2.0.2 MIT License failprint Run a command, print its output only if it fails. !=1.0.0,>=0.11 1.0.2 ISC ghp-import Copy your docs directly to the gh-pages branch. >=1.0 2.1.0 Apache Software License git-changelog Automatic Changelog generator using Jinja2 templates. >=2.3 2.4.0 ISC gitdb Git Object Database <5,>=4.0.1 4.0.11 BSD License gitpython GitPython is a Python library used to interact with Git repositories 3.1.40 BSD htmlmin2 An HTML Minifier >=0.1.13 0.1.13 BSD idna Internationalized Domain Names in Applications (IDNA) <4,>=2.5 3.6 BSD License importlib-metadata Read metadata from Python packages >=4.3; python_version < \"3.10\" 7.0.1 ? iniconfig brain-dead simple config-ini parsing 2.0.0 MIT License jinja2 A very fast and expressive template engine. <4,>=2.11 3.1.2 BSD-3-Clause jsmin JavaScript minifier. >=3.0.1 3.0.1 MIT License markdown Python implementation of John Gruber's Markdown. <4.0.0,>=3.3.3 3.5.1 BSD License markdown-callouts Markdown extension: a classier syntax for admonitions >=0.3 0.3.0 MIT markdown-exec Utilities to execute code blocks in Markdown files. >=1.7 1.8.0 ISC markupsafe Safely add untrusted strings to HTML/XML markup. >=2.0 2.1.3 BSD-3-Clause mergedeep A deep merge function for \ud83d\udc0d. >=1.3.4 1.3.4 MIT License mkdocs Project documentation with Markdown. >=1.5 1.5.3 BSD License mkdocs-coverage MkDocs plugin to integrate your coverage HTML report into your site. >=1.0 1.0.0 ISC mkdocs-gen-files MkDocs plugin to programmatically generate documentation pages during the build >=0.5 0.5.0 MIT License mkdocs-git-committers-plugin-2 An MkDocs plugin to create a list of contributors on the page. The git-committers plugin will seed the template context with a list of GitHub or GitLab committers and other useful GIT info such as last modified date >=1.2 2.2.3 MIT mkdocs-literate-nav MkDocs plugin to specify the navigation in Markdown instead of YAML >=0.6 0.6.1 MIT License mkdocs-material Documentation that simply works >=9.4 9.5.3 MIT License mkdocs-material-extensions Extension pack for Python Markdown and MkDocs Material. ~=1.3 1.3.1 MIT License mkdocs-minify-plugin An MkDocs plugin to minify HTML, JS or CSS files prior to being written to disk >=0.7 0.7.2 MIT mypy Optional static typing for Python >=1.5 1.8.0 MIT mypy-extensions Type system extensions for programs checked with the mypy type checker. >=0.4.3 1.0.0 MIT License packaging Core utilities for Python packages >=22.0 23.2 BSD License paginate Divides large result sets into pages for easier browsing ~=0.5 0.5.6 MIT pathspec Utility library for gitignore style pattern matching of file paths. >=0.9.0 0.12.1 Mozilla Public License 2.0 (MPL 2.0) platformdirs A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\". >=2 4.1.0 MIT License pluggy plugin and hook calling mechanisms for python <2.0,>=0.12 1.3.0 MIT ptyprocess Run a subprocess in a pseudo terminal ~=0.6; sys_platform != \"win32\" 0.7.0 ISC License (ISCL) pygments Pygments is a syntax highlighting package written in Python. ~=2.16 2.17.2 BSD-2-Clause pymdown-extensions Extension pack for Python Markdown. >=9 10.7 MIT License pytest pytest: simple powerful testing with Python >=7.4 7.4.4 MIT pytest-cov Pytest plugin for measuring coverage. >=4.1 4.1.0 MIT pytest-randomly Pytest plugin to randomly order tests and control random.seed. >=3.15 3.15.0 MIT pytest-xdist pytest xdist plugin for distributed testing, most importantly across multiple CPUs >=3.3 3.5.0 MIT python-dateutil Extensions to the standard Python datetime module >=2.8.1 2.8.2 Dual License pytz World timezone definitions, modern and historical >=2015.7; python_version < \"3.9\" 2023.3.post1 ? pyyaml YAML parser and emitter for Python >=5.1 6.0.1 MIT pyyaml-env-tag A custom YAML tag for referencing environment variables in YAML files. >=0.1 0.1 MIT License regex Alternative regular expression module, to replace re. >=2022.4 2023.12.25 Apache Software License requests Python HTTP for Humans. 2.31.0 Apache 2.0 ruamel-yaml ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order >=0.17.21 0.18.5 MIT license ruamel-yaml-clib C version of reader, parser and emitter for ruamel.yaml derived from libyaml >=0.2.7; platform_python_implementation == \"CPython\" and python_version < \"3.13\" 0.2.8 MIT ruff An extremely fast Python linter and code formatter, written in Rust. >=0.0 0.1.11 MIT safety Checks installed dependencies for known vulnerabilities and licenses. >=2.3 2.3.4 MIT license semver Python helper for Semantic Versioning (https://semver.org) >=2.13 3.0.2 BSD setuptools Easily download, build, install, upgrade, and uninstall Python packages >=19.3 69.0.3 MIT License six Python 2 and 3 compatibility utilities >=1.5 1.16.0 MIT smmap A pure Python implementation of a sliding window memory map manager <6,>=3.0.1 5.0.1 BSD tomli A lil' TOML parser >=2.0; python_version < '3.11' 2.0.1 ? types-markdown Typing stubs for Markdown >=3.5 3.5.0.20240106 Apache-2.0 license types-pyyaml Typing stubs for PyYAML >=6.0 6.0.12.12 Apache-2.0 license typing-extensions Backported and Experimental Type Hints for Python 3.8+ >=4.0.1; python_version < \"3.11\" 4.9.0 Python Software Foundation License urllib3 HTTP library with thread-safe connection pooling, file post, and more. <3,>=1.21.1 2.1.0 MIT License watchdog Filesystem events monitoring >=2.0 3.0.0 Apache License 2.0 zipp Backport of pathlib-compatible object wrapper for zip files >=0.5 3.17.0 ?

    More credits from the author

    "},{"location":"license/","title":"License","text":"
    ISC License\n\nCopyright (c) 2021, Timoth\u00e9e Mazzucotelli\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted, provided that the above\ncopyright notice and this permission notice appear in all copies.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\nWITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\nANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\nWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\nACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\nOR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n
    "},{"location":"insiders/","title":"Insiders","text":"

    mkdocstrings-python follows the sponsorware release strategy, which means that new features are first exclusively released to sponsors as part of Insiders. Read on to learn what sponsorships achieve, how to become a sponsor to get access to Insiders, and what's in it for you!

    "},{"location":"insiders/#what-is-insiders","title":"What is Insiders?","text":"

    mkdocstrings-python Insiders is a private fork of mkdocstrings-python, hosted as a private GitHub repository. Almost1 all new features are developed as part of this fork, which means that they are immediately available to all eligible sponsors, as they are made collaborators of this repository.

    Every feature is tied to a funding goal in monthly subscriptions. When a funding goal is hit, the features that are tied to it are merged back into mkdocstrings-python and released for general availability, making them available to all users. Bugfixes are always released in tandem.

    Sponsorships start as low as $10 a month.2

    "},{"location":"insiders/#what-sponsorships-achieve","title":"What sponsorships achieve","text":"

    Sponsorships make this project sustainable, as they buy the maintainers of this project time \u2013 a very scarce resource \u2013 which is spent on the development of new features, bug fixing, stability improvement, issue triage and general support. The biggest bottleneck in Open Source is time.3

    If you're unsure if you should sponsor this project, check out the list of completed funding goals to learn whether you're already using features that were developed with the help of sponsorships.

    "},{"location":"insiders/#whats-in-it-for-me","title":"What's in it for me?","text":"

    The moment you become a sponsor, you'll get immediate access to 7 additional features that you can start using right away, and which are currently exclusively available to sponsors:

    • griffe-inherited-docstrings \u2014 [Project] Griffe extension for inheriting docstrings
    • Automatic rendering of function signature overloads
    • Auto-summary of object members
    • griffe-typing-deprecated \u2014 [Project] Griffe extension for @typing.deprecated (PEP 702)
    • griffe-pydantic \u2014 [Project] Griffe extension for Pydantic
    • Symbol types in headings and table of contents
    • Cross-references for type annotations in signatures
    "},{"location":"insiders/#how-to-become-a-sponsor","title":"How to become a sponsor","text":"

    Thanks for your interest in sponsoring! In order to become an eligible sponsor with your GitHub account, visit pawamoy's sponsor profile, and complete a sponsorship of $10 a month or more. You can use your individual or organization GitHub account for sponsoring.

    Important: If you're sponsoring @pawamoy through a GitHub organization, please send a short email to pawamoy@pm.me with the name of your organization and the GitHub account of the individual that should be added as a collaborator.4

    You can cancel your sponsorship anytime.5

    \u00a0 Join our awesome sponsors

    If you sponsor publicly, you're automatically added here with a link to your profile and avatar to show your support for mkdocstrings-python. Alternatively, if you wish to keep your sponsorship private, you'll be a silent +1. You can select visibility during checkout and change it afterwards.

    "},{"location":"insiders/#funding","title":"Funding","text":""},{"location":"insiders/#goals","title":"Goals","text":"

    The following section lists all funding goals. Each goal contains a list of features prefixed with a checkmark symbol, denoting whether a feature is already available or planned, but not yet implemented. When the funding goal is hit, the features are released for general availability.

    "},{"location":"insiders/#500-plasmavac-user-guide","title":"$ 500 \u2014 PlasmaVac User Guide","text":"
    • Cross-references for type annotations in signatures
    • Symbol types in headings and table of contents
    • griffe-inherited-docstrings \u2014 [Project] Griffe extension for inheriting docstrings
    "},{"location":"insiders/#1000-gravifridge-user-manual","title":"$ 1,000 \u2014 GraviFridge User Manual","text":"
    • Auto-summary of object members
    • Automatic rendering of function signature overloads
    • griffe-pydantic \u2014 [Project] Griffe extension for Pydantic
    • griffe-typing-deprecated \u2014 [Project] Griffe extension for @typing.deprecated (PEP 702)
    "},{"location":"insiders/#frequently-asked-questions","title":"Frequently asked questions","text":""},{"location":"insiders/#compatibility","title":"Compatibility","text":"

    We're building an open source project and want to allow outside collaborators to use mkdocstrings-python locally without having access to Insiders. Is this still possible?

    Yes. Insiders is compatible with mkdocstrings-python. Almost all new features and configuration options are either backward-compatible or implemented behind feature flags. Most Insiders features enhance the overall experience, though while these features add value for the users of your project, they shouldn't be necessary for previewing when making changes to content.

    "},{"location":"insiders/#payment","title":"Payment","text":"

    We don't want to pay for sponsorship every month. Are there any other options?

    Yes. You can sponsor on a yearly basis by switching your GitHub account to a yearly billing cycle. If for some reason you cannot do that, you could also create a dedicated GitHub account with a yearly billing cycle, which you only use for sponsoring (some sponsors already do that).

    If you have any problems or further questions, please reach out to pawamoy@pm.me.

    "},{"location":"insiders/#terms","title":"Terms","text":"

    Are we allowed to use Insiders under the same terms and conditions as mkdocstrings-python?

    Yes. Whether you're an individual or a company, you may use mkdocstrings-python Insiders precisely under the same terms as mkdocstrings-python, which are given by the ISC License. However, we kindly ask you to respect our fair use policy:

    • Please don't distribute the source code of Insiders. You may freely use it for public, private or commercial projects, privately fork or mirror it, but please don't make the source code public, as it would counteract the sponsorware strategy.

    • If you cancel your subscription, you're automatically removed as a collaborator and will miss out on all future updates of Insiders. However, you may use the latest version that's available to you as long as you like. Just remember that GitHub deletes private forks.

    1. In general, every new feature is first exclusively released to sponsors, but sometimes upstream dependencies enhance existing features that must be supported by mkdocstrings-python.\u00a0\u21a9

    2. Note that $10 a month is the minimum amount to become eligible for Insiders. While GitHub Sponsors also allows to sponsor lower amounts or one-time amounts, those can't be granted access to Insiders due to technical reasons. Such contributions are still very much welcome as they help ensuring the project's sustainability.\u00a0\u21a9

    3. Making an Open Source project sustainable is exceptionally hard: maintainers burn out, projects are abandoned. That's not great and very unpredictable. The sponsorware model ensures that if you decide to use mkdocstrings-python, you can be sure that bugs are fixed quickly and new features are added regularly.\u00a0\u21a9

    4. It's currently not possible to grant access to each member of an organization, as GitHub only allows for adding users. Thus, after sponsoring, please send an email to pawamoy@pm.me, stating which account should become a collaborator of the Insiders repository. We're working on a solution which will make access to organizations much simpler. To ensure that access is not tied to a particular individual GitHub account, create a bot account (i.e. a GitHub account that is not tied to a specific individual), and use this account for the sponsoring. After being added to the list of collaborators, the bot account can create a private fork of the private Insiders GitHub repository, and grant access to all members of the organizations.\u00a0\u21a9

    5. If you cancel your sponsorship, GitHub schedules a cancellation request which will become effective at the end of the billing cycle. This means that even though you cancel your sponsorship, you will keep your access to Insiders as long as your cancellation isn't effective. All charges are processed by GitHub through Stripe. As we don't receive any information regarding your payment, and GitHub doesn't offer refunds, sponsorships are non-refundable.\u00a0\u21a9

    "},{"location":"insiders/changelog/","title":"Changelog","text":""},{"location":"insiders/changelog/#mkdocstrings-python-insiders","title":"mkdocstrings-python Insiders","text":""},{"location":"insiders/changelog/#1.5.1","title":"1.5.1 September 12, 2023","text":"
    • Prevent empty auto-summarized Methods section.
    "},{"location":"insiders/changelog/#1.5.0","title":"1.5.0 September 05, 2023","text":"
    • Render function signature overloads.
    "},{"location":"insiders/changelog/#1.4.0","title":"1.4.0 August 27, 2023","text":"
    • Render cross-references in attribute signatures.
    "},{"location":"insiders/changelog/#1.3.0","title":"1.3.0 August 24, 2023","text":"
    • Add \"method\" symbol type.
    "},{"location":"insiders/changelog/#1.2.0","title":"1.2.0 August 20, 2023","text":"
    • Add member auto-summaries.
    "},{"location":"insiders/changelog/#1.1.4","title":"1.1.4 July 17, 2023","text":"
    • Fix heading level increment for class members.
    "},{"location":"insiders/changelog/#1.1.3","title":"1.1.3 July 17, 2023","text":"
    • Fix heading level (avoid with clause preventing to decrease it).
    "},{"location":"insiders/changelog/#1.1.2","title":"1.1.2 July 15, 2023","text":"
    • Use non-breaking spaces after symbol types.
    "},{"location":"insiders/changelog/#1.1.1","title":"1.1.1 June 27, 2023","text":"
    • Correctly escape expressions in signatures and other rendered types.
    "},{"location":"insiders/changelog/#1.1.0","title":"1.1.0 June 4, 2023","text":"
    • Add Symbol types in headings and table of contents.
    "},{"location":"insiders/changelog/#1.0.0","title":"1.0.0 May 10, 2023","text":"
    • Add cross-references for type annotations in signatures. Make sure to update your local templates as the signature of the format_signature filter has changed. The templates that must be updated: class.html, expression.html, function.html and signature.html.
    "},{"location":"insiders/installation/","title":"Getting started with Insiders","text":"

    mkdocstrings-python Insiders is a compatible drop-in replacement for mkdocstrings-python, and can be installed similarly using pip or git. Note that in order to access the Insiders repository, you need to become an eligible sponsor of @pawamoy on GitHub.

    "},{"location":"insiders/installation/#installation","title":"Installation","text":""},{"location":"insiders/installation/#with-pypi-insiders","title":"with PyPI Insiders","text":"

    PyPI Insiders is a tool that helps you keep up-to-date versions of Insiders projects in the PyPI index of your choice (self-hosted, Google registry, Artifactory, etc.).

    See how to install it and how to use it.

    "},{"location":"insiders/installation/#with-pip-sshhttps","title":"with pip (ssh/https)","text":"

    mkdocstrings-python Insiders can be installed with pip using SSH:

    pip install git+ssh://git@github.com/pawamoy-insiders/mkdocstrings-python.git\n

    Or using HTTPS:

    pip install git+https://${GH_TOKEN}@github.com/pawamoy-insiders/mkdocstrings-python.git\n
    How to get a GitHub personal access token

    The GH_TOKEN environment variable is a GitHub token. It can be obtained by creating a personal access token for your GitHub account. It will give you access to the Insiders repository, programmatically, from the command line or GitHub Actions workflows:

    1. Go to https://github.com/settings/tokens
    2. Click on Generate a new token
    3. Enter a name and select the repo scope
    4. Generate the token and store it in a safe place

    Note that the personal access token must be kept secret at all times, as it allows the owner to access your private repositories.

    "},{"location":"insiders/installation/#with-pip-self-hosted","title":"with pip (self-hosted)","text":"

    Self-hosting the Insiders package makes it possible to depend on mkdocstrings-python normally, while transparently downloading and installing the Insiders version locally. It means that you can specify your dependencies normally, and your contributors without access to Insiders will get the public version, while you get the Insiders version on your machine.

    Limitation

    With this method, there is no way to force the installation of an Insiders version rather than a public version. If there is a public version that is more recent than your self-hosted Insiders version, the public version will take precedence. Remember to regularly update your self-hosted versions by uploading latest distributions.

    You can build the distributions for Insiders yourself, by cloning the repository and using build to build the distributions, or you can download them from our GitHub Releases. You can upload these distributions to a private PyPI-like registry (Artifactory, Google Cloud, pypiserver, etc.) with Twine:

    # download distributions in ~/dists, then upload with:\ntwine upload --repository-url https://your-private-index.com ~/dists/*\n

    You might also need to provide a username and password/token to authenticate against the registry. Please check Twine's documentation.

    You can then configure pip (or other tools) to look for packages into your package index. For example, with pip:

    pip config set global.extra-index-url https://your-private-index.com/simple\n

    Note that the URL might differ depending on whether your are uploading a package (with Twine) or installing a package (with pip), and depending on the registry you are using (Artifactory, Google Cloud, etc.). Please check the documentation of your registry to learn how to configure your environment.

    We kindly ask that you do not upload the distributions to public registries, as it is against our Terms of use.

    Full example with pypiserver

    In this example we use pypiserver to serve a local PyPI index.

    pip install --user pypiserver\n# or pipx install pypiserver\n\n# create a packages directory\nmkdir -p ~/.local/pypiserver/packages\n\n# run the pypi server without authentication\npypi-server run -p 8080 -a . -P . ~/.local/pypiserver/packages &\n

    We can configure the credentials to access the server in ~/.pypirc:

    .pypirc
    [distutils]\nindex-servers =\n    local\n\n[local]\nrepository: http://localhost:8080\nusername:\npassword:\n

    We then clone the Insiders repository, build distributions and upload them to our local server:

    # clone the repository\ngit clone git@github.com:pawamoy-insiders/mkdocstrings-python\ncd python\n\n# install build\npip install --user build\n# or pipx install build\n\n# checkout latest tag\ngit checkout $(git describe --tags --abbrev=0)\n\n# build the distributions\npyproject-build\n\n# upload them to our local server\ntwine upload -r local dist/* --skip-existing\n

    Finally, we configure pip, and for example PDM, to use our local index to find packages:

    pip config set global.extra-index-url http://localhost:8080/simple\npdm config pypi.extra.url http://localhost:8080/simple\n

    Now when running pip install mkdocstrings-python, or resolving dependencies with PDM, both tools will look into our local index and find the Insiders version. Remember to update your local index regularly!

    "},{"location":"insiders/installation/#with-git","title":"with git","text":"

    Of course, you can use mkdocstrings-python Insiders directly from git:

    git clone git@github.com:pawamoy-insiders/mkdocstrings-python\n

    When cloning from git, the package must be installed:

    pip install -e python\n
    "},{"location":"insiders/installation/#upgrading","title":"Upgrading","text":"

    When upgrading Insiders, you should always check the version of mkdocstrings-python which makes up the first part of the version qualifier. For example, a version like 8.x.x.4.x.x means that Insiders 4.x.x is currently based on 8.x.x.

    If the major version increased, it's a good idea to consult the changelog and go through the steps to ensure your configuration is up to date and all necessary changes have been made.

    "},{"location":"reference/SUMMARY/","title":"SUMMARY","text":"
    • mkdocstrings_handlers
      • python
        • debug
        • handler
        • rendering
    "},{"location":"reference/mkdocstrings_handlers/python/","title":"Index","text":""},{"location":"reference/mkdocstrings_handlers/python/#mkdocstrings_handlers.python","title":"python","text":"

    This package implements a handler for the Python language.

    Modules:

    • debug \u2013

      Debugging utilities.

    • handler \u2013

      This module implements a handler for the Python language.

    • rendering \u2013

      This module implements rendering utilities.

    Functions:

    • get_handler \u2013

      Simply return an instance of PythonHandler.

    "},{"location":"reference/mkdocstrings_handlers/python/#mkdocstrings_handlers.python.get_handler","title":"get_handler","text":"
    get_handler(\n    *,\n    theme: str,\n    custom_templates: str | None = None,\n    config_file_path: str | None = None,\n    paths: list[str] | None = None,\n    locale: str = \"en\",\n    load_external_modules: bool = False,\n    **config: Any\n) -> PythonHandler\n

    Simply return an instance of PythonHandler.

    Parameters:

    • theme (str) \u2013

      The theme to use when rendering contents.

    • custom_templates (str | None, default: None ) \u2013

      Directory containing custom templates.

    • config_file_path (str | None, default: None ) \u2013

      The MkDocs configuration file path.

    • paths (list[str] | None, default: None ) \u2013

      A list of paths to use as Griffe search paths.

    • locale (str, default: 'en' ) \u2013

      The locale to use when rendering content.

    • load_external_modules (bool, default: False ) \u2013

      Load external modules when resolving aliases.

    • **config (Any, default: {} ) \u2013

      Configuration passed to the handler.

    Returns:

    • PythonHandler \u2013

      An instance of PythonHandler.

    "},{"location":"reference/mkdocstrings_handlers/python/debug/","title":" debug","text":""},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug","title":"debug","text":"

    Debugging utilities.

    Classes:

    • Environment \u2013

      Dataclass to store environment information.

    • Package \u2013

      Dataclass describing a Python package.

    • Variable \u2013

      Dataclass describing an environment variable.

    Functions:

    • get_debug_info \u2013

      Get debug/environment information.

    • get_version \u2013

      Get version of the given distribution.

    • print_debug_info \u2013

      Print debug/environment information.

    "},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Environment","title":"Environment dataclass","text":"

    Dataclass to store environment information.

    Attributes:

    • interpreter_name (str) \u2013

      Python interpreter name.

    • interpreter_version (str) \u2013

      Python interpreter version.

    • packages (list[Package]) \u2013

      Installed packages.

    • platform (str) \u2013

      Operating System.

    • variables (list[Variable]) \u2013

      Environment variables.

    "},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Environment.interpreter_name","title":"interpreter_name instance-attribute","text":"
    interpreter_name: str\n

    Python interpreter name.

    "},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Environment.interpreter_version","title":"interpreter_version instance-attribute","text":"
    interpreter_version: str\n

    Python interpreter version.

    "},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Environment.packages","title":"packages instance-attribute","text":"
    packages: list[Package]\n

    Installed packages.

    "},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Environment.platform","title":"platform instance-attribute","text":"
    platform: str\n

    Operating System.

    "},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Environment.variables","title":"variables instance-attribute","text":"
    variables: list[Variable]\n

    Environment variables.

    "},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Package","title":"Package dataclass","text":"

    Dataclass describing a Python package.

    Attributes:

    • name (str) \u2013

      Package name.

    • version (str) \u2013

      Package version.

    "},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Package.name","title":"name instance-attribute","text":"
    name: str\n

    Package name.

    "},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Package.version","title":"version instance-attribute","text":"
    version: str\n

    Package version.

    "},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Variable","title":"Variable dataclass","text":"

    Dataclass describing an environment variable.

    Attributes:

    • name (str) \u2013

      Variable name.

    • value (str) \u2013

      Variable value.

    "},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Variable.name","title":"name instance-attribute","text":"
    name: str\n

    Variable name.

    "},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.Variable.value","title":"value instance-attribute","text":"
    value: str\n

    Variable value.

    "},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.get_debug_info","title":"get_debug_info","text":"
    get_debug_info() -> Environment\n

    Get debug/environment information.

    Returns:

    • Environment \u2013

      Environment information.

    "},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.get_version","title":"get_version","text":"
    get_version(dist: str = 'mkdocstrings-python') -> str\n

    Get version of the given distribution.

    Parameters:

    • dist (str, default: 'mkdocstrings-python' ) \u2013

      A distribution name.

    Returns:

    • str \u2013

      A version number.

    "},{"location":"reference/mkdocstrings_handlers/python/debug/#mkdocstrings_handlers.python.debug.print_debug_info","title":"print_debug_info","text":"
    print_debug_info() -> None\n

    Print debug/environment information.

    "},{"location":"reference/mkdocstrings_handlers/python/handler/","title":" handler","text":""},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler","title":"handler","text":"

    This module implements a handler for the Python language.

    Classes:

    • PythonHandler \u2013

      The Python handler class.

    Functions:

    • get_handler \u2013

      Simply return an instance of PythonHandler.

    "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler","title":"PythonHandler","text":"
    PythonHandler(\n    *args: Any,\n    config_file_path: str | None = None,\n    paths: list[str] | None = None,\n    locale: str = \"en\",\n    load_external_modules: bool = False,\n    **kwargs: Any\n)\n

    Bases: BaseHandler

    The Python handler class.

    Parameters:

    • *args (Any, default: () ) \u2013

      Handler name, theme and custom templates.

    • config_file_path (str | None, default: None ) \u2013

      The MkDocs configuration file path.

    • paths (list[str] | None, default: None ) \u2013

      A list of paths to use as Griffe search paths.

    • locale (str, default: 'en' ) \u2013

      The locale to use when rendering content.

    • load_external_modules (bool, default: False ) \u2013

      Load external modules when resolving aliases.

    • **kwargs (Any, default: {} ) \u2013

      Same thing, but with keyword arguments.

    Methods:

    • do_convert_markdown \u2013

      Render Markdown text; for use inside templates.

    • do_heading \u2013

      Render an HTML heading and register it for the table of contents. For use inside templates.

    • get_extended_templates_dirs \u2013

      Load template extensions for the given handler, return their templates directories.

    • get_headings \u2013

      Return and clear the headings gathered so far.

    • get_templates_dir \u2013

      Return the path to the handler's templates directory.

    • load_inventory \u2013

      Yield items and their URLs from an inventory file streamed from in_file.

    • normalize_extension_paths \u2013

      Resolve extension paths relative to config file.

    • teardown \u2013

      Teardown the handler.

    Attributes:

    • default_config (dict) \u2013

      Default handler configuration.

    • domain (str) \u2013

      The cross-documentation domain/language for this handler.

    • enable_inventory (bool) \u2013

      Whether this handler is interested in enabling the creation of the objects.inv Sphinx inventory file.

    • extra_css \u2013

      Extra CSS.

    • fallback_config (dict) \u2013

      The configuration used to collect item during autorefs fallback.

    • fallback_theme \u2013

      The fallback theme.

    • name (str) \u2013

      The handler's name, for example \"python\".

    "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.default_config","title":"default_config class-attribute","text":"
    default_config: dict = {\n    \"docstring_style\": \"google\",\n    \"docstring_options\": {},\n    \"show_symbol_type_heading\": False,\n    \"show_symbol_type_toc\": False,\n    \"show_root_heading\": False,\n    \"show_root_toc_entry\": True,\n    \"show_root_full_path\": True,\n    \"show_root_members_full_path\": False,\n    \"show_object_full_path\": False,\n    \"show_category_heading\": False,\n    \"show_if_no_docstring\": False,\n    \"show_signature\": True,\n    \"show_signature_annotations\": False,\n    \"signature_crossrefs\": False,\n    \"separate_signature\": False,\n    \"line_length\": 60,\n    \"merge_init_into_class\": False,\n    \"show_docstring_attributes\": True,\n    \"show_docstring_functions\": True,\n    \"show_docstring_classes\": True,\n    \"show_docstring_modules\": True,\n    \"show_docstring_description\": True,\n    \"show_docstring_examples\": True,\n    \"show_docstring_other_parameters\": True,\n    \"show_docstring_parameters\": True,\n    \"show_docstring_raises\": True,\n    \"show_docstring_receives\": True,\n    \"show_docstring_returns\": True,\n    \"show_docstring_warns\": True,\n    \"show_docstring_yields\": True,\n    \"show_source\": True,\n    \"show_bases\": True,\n    \"show_submodules\": False,\n    \"group_by_category\": True,\n    \"heading_level\": 2,\n    \"members_order\": value,\n    \"docstring_section_style\": \"table\",\n    \"members\": None,\n    \"inherited_members\": False,\n    \"filters\": [\"!^_[^_]\"],\n    \"annotations_path\": \"brief\",\n    \"preload_modules\": None,\n    \"allow_inspection\": True,\n    \"summary\": False,\n    \"unwrap_annotated\": False,\n}\n

    Default handler configuration.

    General options:

    • allow_inspection (bool) \u2013

      Whether to allow inspecting modules when visiting them is not possible. Default: True.

    • show_bases (bool) \u2013

      Show the base classes of a class. Default: True.

    • show_source (bool) \u2013

      Show the source code of this object. Default: True.

    • preload_modules (list[str] | None) \u2013

      Pre-load modules that are not specified directly in autodoc instructions (::: identifier). It is useful when you want to render documentation for a particular member of an object, and this member is imported from another package than its parent.

      For an imported member to be rendered, you need to add it to the __all__ attribute of the importing module.

      The modules must be listed as an array of strings. Default: None.

    Headings options:

    • heading_level (int) \u2013

      The initial heading level to use. Default: 2.

    • show_root_heading (bool) \u2013

      Show the heading of the object at the root of the documentation tree (i.e. the object referenced by the identifier after :::). Default: False.

    • show_root_toc_entry (bool) \u2013

      If the root heading is not shown, at least add a ToC entry for it. Default: True.

    • show_root_full_path (bool) \u2013

      Show the full Python path for the root object heading. Default: True.

    • show_root_members_full_path (bool) \u2013

      Show the full Python path of the root members. Default: False.

    • show_object_full_path (bool) \u2013

      Show the full Python path of every object. Default: False.

    • show_category_heading (bool) \u2013

      When grouped by categories, show a heading for each category. Default: False.

    • show_symbol_type_heading (bool) \u2013

      Show the symbol type in headings (e.g. mod, class, meth, func and attr). Default: False.

    • show_symbol_type_toc (bool) \u2013

      Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr). Default: False.

    Members options:

    • inherited_members (list[str] | bool | None) \u2013

      A boolean, or an explicit list of inherited members to render. If true, select all inherited members, which can then be filtered with members. If false or empty list, do not select any inherited member. Default: False.

    • members (list[str] | bool | None) \u2013

      A boolean, or an explicit list of members to render. If true, select all members without further filtering. If false or empty list, do not render members. If none, select all members and apply further filtering with filters and docstrings. Default: None.

    • members_order (str) \u2013

      The members ordering to use. Options: alphabetical - order by the members names, source - order members as they appear in the source file. Default: \"alphabetical\".

    • filters (list[str] | None) \u2013

      A list of filters applied to filter objects based on their name. A filter starting with ! will exclude matching objects instead of including them. The members option takes precedence over filters (filters will still be applied recursively to lower members in the hierarchy). Default: [\"!^_[^_]\"].

    • group_by_category (bool) \u2013

      Group the object's children by categories: attributes, classes, functions, and modules. Default: True.

    • show_submodules (bool) \u2013

      When rendering a module, show its submodules recursively. Default: False.

    • summary (bool | dict[str, bool]) \u2013

      Whether to render summaries of modules, classes, functions (methods) and attributes.

    Docstrings options:

    • docstring_style (str) \u2013

      The docstring style to use: google, numpy, sphinx, or None. Default: \"google\".

    • docstring_options (dict) \u2013

      The options for the docstring parser. See parsers under griffe.docstrings.

    • docstring_section_style (str) \u2013

      The style used to render docstring sections. Options: table, list, spacy. Default: \"table\".

    • merge_init_into_class (bool) \u2013

      Whether to merge the __init__ method into the class' signature and docstring. Default: False.

    • show_if_no_docstring (bool) \u2013

      Show the object heading even if it has no docstring or children with docstrings. Default: False.

    • show_docstring_attributes (bool) \u2013

      Whether to display the \"Attributes\" section in the object's docstring. Default: True.

    • show_docstring_functions (bool) \u2013

      Whether to display the \"Functions\" or \"Methods\" sections in the object's docstring. Default: True.

    • show_docstring_classes (bool) \u2013

      Whether to display the \"Classes\" section in the object's docstring. Default: True.

    • show_docstring_modules (bool) \u2013

      Whether to display the \"Modules\" section in the object's docstring. Default: True.

    • show_docstring_description (bool) \u2013

      Whether to display the textual block (including admonitions) in the object's docstring. Default: True.

    • show_docstring_examples (bool) \u2013

      Whether to display the \"Examples\" section in the object's docstring. Default: True.

    • show_docstring_other_parameters (bool) \u2013

      Whether to display the \"Other Parameters\" section in the object's docstring. Default: True.

    • show_docstring_parameters (bool) \u2013

      Whether to display the \"Parameters\" section in the object's docstring. Default: True.

    • show_docstring_raises (bool) \u2013

      Whether to display the \"Raises\" section in the object's docstring. Default: True.

    • show_docstring_receives (bool) \u2013

      Whether to display the \"Receives\" section in the object's docstring. Default: True.

    • show_docstring_returns (bool) \u2013

      Whether to display the \"Returns\" section in the object's docstring. Default: True.

    • show_docstring_warns (bool) \u2013

      Whether to display the \"Warns\" section in the object's docstring. Default: True.

    • show_docstring_yields (bool) \u2013

      Whether to display the \"Yields\" section in the object's docstring. Default: True.

    Signatures/annotations options:

    • annotations_path (str) \u2013

      The verbosity for annotations path: brief (recommended), or source (as written in the source). Default: \"brief\".

    • line_length (int) \u2013

      Maximum line length when formatting code/signatures. Default: 60.

    • show_signature (bool) \u2013

      Show methods and functions signatures. Default: True.

    • show_signature_annotations (bool) \u2013

      Show the type annotations in methods and functions signatures. Default: False.

    • signature_crossrefs (bool) \u2013

      Whether to render cross-references for type annotations in signatures. Default: False.

    • separate_signature (bool) \u2013

      Whether to put the whole signature in a code block below the heading. If Black is installed, the signature is also formatted using it. Default: False.

    • unwrap_annotated (bool) \u2013

      Whether to unwrap Annotated types to show only the type without the annotations. Default: False.

    "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.domain","title":"domain class-attribute instance-attribute","text":"
    domain: str = 'py'\n

    The cross-documentation domain/language for this handler.

    "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.enable_inventory","title":"enable_inventory class-attribute instance-attribute","text":"
    enable_inventory: bool = True\n

    Whether this handler is interested in enabling the creation of the objects.inv Sphinx inventory file.

    "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.extra_css","title":"extra_css class-attribute instance-attribute","text":"
    extra_css = ''\n

    Extra CSS.

    "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.fallback_config","title":"fallback_config class-attribute","text":"
    fallback_config: dict = {'fallback': True}\n

    The configuration used to collect item during autorefs fallback.

    "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.fallback_theme","title":"fallback_theme class-attribute instance-attribute","text":"
    fallback_theme = 'material'\n

    The fallback theme.

    "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.name","title":"name class-attribute instance-attribute","text":"
    name: str = ''\n

    The handler's name, for example \"python\".

    "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.do_convert_markdown","title":"do_convert_markdown","text":"
    do_convert_markdown(\n    text: str,\n    heading_level: int,\n    html_id: str = \"\",\n    *,\n    strip_paragraph: bool = False\n) -> Markup\n

    Render Markdown text; for use inside templates.

    Parameters:

    • text (str) \u2013

      The text to convert.

    • heading_level (int) \u2013

      The base heading level to start all Markdown headings from.

    • html_id (str, default: '' ) \u2013

      The HTML id of the element that's considered the parent of this element.

    • strip_paragraph (bool, default: False ) \u2013

      Whether to exclude the

      tag from around the whole output.

      Returns:

      • Markup \u2013

        An HTML string.

      "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.do_heading","title":"do_heading","text":"
      do_heading(\n    content: Markup,\n    heading_level: int,\n    *,\n    role: str | None = None,\n    hidden: bool = False,\n    toc_label: str | None = None,\n    **attributes: str\n) -> Markup\n

      Render an HTML heading and register it for the table of contents. For use inside templates.

      Parameters:

      • content (Markup) \u2013

        The HTML within the heading.

      • heading_level (int) \u2013

        The level of heading (e.g. 3 -> h3).

      • role (str | None, default: None ) \u2013

        An optional role for the object bound to this heading.

      • hidden (bool, default: False ) \u2013

        If True, only register it for the table of contents, don't render anything.

      • toc_label (str | None, default: None ) \u2013

        The title to use in the table of contents ('data-toc-label' attribute).

      • **attributes (str, default: {} ) \u2013

        Any extra HTML attributes of the heading.

      Returns:

      • Markup \u2013

        An HTML string.

      "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.get_extended_templates_dirs","title":"get_extended_templates_dirs","text":"
      get_extended_templates_dirs(handler: str) -> list[Path]\n

      Load template extensions for the given handler, return their templates directories.

      Parameters:

      • handler (str) \u2013

        The name of the handler to get the extended templates directory of.

      Returns:

      • list[Path] \u2013

        The extensions templates directories.

      "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.get_headings","title":"get_headings","text":"
      get_headings() -> Sequence[Element]\n

      Return and clear the headings gathered so far.

      Returns:

      • Sequence[Element] \u2013

        A list of HTML elements.

      "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.get_templates_dir","title":"get_templates_dir","text":"
      get_templates_dir(handler: str | None = None) -> Path\n

      Return the path to the handler's templates directory.

      Override to customize how the templates directory is found.

      Parameters:

      • handler (str | None, default: None ) \u2013

        The name of the handler to get the templates directory of.

      Raises:

      • ModuleNotFoundError \u2013

        When no such handler is installed.

      • FileNotFoundError \u2013

        When the templates directory cannot be found.

      Returns:

      • Path \u2013

        The templates directory path.

      "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.load_inventory","title":"load_inventory classmethod","text":"
      load_inventory(\n    in_file: BinaryIO,\n    url: str,\n    base_url: str | None = None,\n    domains: list[str] | None = None,\n    **kwargs: Any\n) -> Iterator[tuple[str, str]]\n

      Yield items and their URLs from an inventory file streamed from in_file.

      This implements mkdocstrings' load_inventory \"protocol\" (see mkdocstrings.plugin).

      Parameters:

      • in_file (BinaryIO) \u2013

        The binary file-like object to read the inventory from.

      • url (str) \u2013

        The URL that this file is being streamed from (used to guess base_url).

      • base_url (str | None, default: None ) \u2013

        The URL that this inventory's sub-paths are relative to.

      • domains (list[str] | None, default: None ) \u2013

        A list of domain strings to filter the inventory by, when not passed, \"py\" will be used.

      • **kwargs (Any, default: {} ) \u2013

        Ignore additional arguments passed from the config.

      Yields:

      • str \u2013

        Tuples of (item identifier, item URL).

      "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.normalize_extension_paths","title":"normalize_extension_paths","text":"
      normalize_extension_paths(extensions: Sequence) -> Sequence\n

      Resolve extension paths relative to config file.

      "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.PythonHandler.teardown","title":"teardown","text":"
      teardown() -> None\n

      Teardown the handler.

      This method should be implemented to, for example, terminate a subprocess that was started when creating the handler instance.

      "},{"location":"reference/mkdocstrings_handlers/python/handler/#mkdocstrings_handlers.python.handler.get_handler","title":"get_handler","text":"
      get_handler(\n    *,\n    theme: str,\n    custom_templates: str | None = None,\n    config_file_path: str | None = None,\n    paths: list[str] | None = None,\n    locale: str = \"en\",\n    load_external_modules: bool = False,\n    **config: Any\n) -> PythonHandler\n

      Simply return an instance of PythonHandler.

      Parameters:

      • theme (str) \u2013

        The theme to use when rendering contents.

      • custom_templates (str | None, default: None ) \u2013

        Directory containing custom templates.

      • config_file_path (str | None, default: None ) \u2013

        The MkDocs configuration file path.

      • paths (list[str] | None, default: None ) \u2013

        A list of paths to use as Griffe search paths.

      • locale (str, default: 'en' ) \u2013

        The locale to use when rendering content.

      • load_external_modules (bool, default: False ) \u2013

        Load external modules when resolving aliases.

      • **config (Any, default: {} ) \u2013

        Configuration passed to the handler.

      Returns:

      • PythonHandler \u2013

        An instance of PythonHandler.

      "},{"location":"reference/mkdocstrings_handlers/python/rendering/","title":" rendering","text":""},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering","title":"rendering","text":"

      This module implements rendering utilities.

      Classes:

      • Order \u2013

        Enumeration for the possible members ordering.

      Functions:

      • do_as_attributes_section \u2013

        Build an attributes section from a list of attributes.

      • do_as_classes_section \u2013

        Build a classes section from a list of classes.

      • do_as_functions_section \u2013

        Build a functions section from a list of functions.

      • do_as_modules_section \u2013

        Build a modules section from a list of modules.

      • do_crossref \u2013

        Deprecated. Filter to create cross-references.

      • do_filter_objects \u2013

        Filter a dictionary of objects based on their docstrings.

      • do_format_attribute \u2013

        Format an attribute using Black.

      • do_format_code \u2013

        Format code using Black.

      • do_format_signature \u2013

        Format a signature using Black.

      • do_get_template \u2013

        Get the template name used to render an object.

      • do_multi_crossref \u2013

        Deprecated. Filter to create cross-references.

      • do_order_members \u2013

        Order members given an ordering method.

      • do_split_path \u2013

        Split object paths for building cross-references.

      "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.Order","title":"Order","text":"

      Bases: Enum

      Enumeration for the possible members ordering.

      Attributes:

      • alphabetical \u2013

        Alphabetical order.

      • source \u2013

        Source code order.

      "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.Order.alphabetical","title":"alphabetical class-attribute instance-attribute","text":"
      alphabetical = 'alphabetical'\n

      Alphabetical order.

      "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.Order.source","title":"source class-attribute instance-attribute","text":"
      source = 'source'\n

      Source code order.

      "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_as_attributes_section","title":"do_as_attributes_section","text":"
      do_as_attributes_section(\n    context: Context,\n    attributes: Sequence[Attribute],\n    *,\n    check_public: bool = True\n) -> DocstringSectionAttributes\n

      Build an attributes section from a list of attributes.

      Parameters:

      • attributes (Sequence[Attribute]) \u2013

        The attributes to build the section from.

      • check_public (bool, default: True ) \u2013

        Whether to check if the attribute is public.

      Returns:

      • DocstringSectionAttributes \u2013

        An attributes docstring section.

      "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_as_classes_section","title":"do_as_classes_section","text":"
      do_as_classes_section(\n    context: Context,\n    classes: Sequence[Class],\n    *,\n    check_public: bool = True\n) -> DocstringSectionClasses\n

      Build a classes section from a list of classes.

      Parameters:

      • classes (Sequence[Class]) \u2013

        The classes to build the section from.

      • check_public (bool, default: True ) \u2013

        Whether to check if the class is public.

      Returns:

      • DocstringSectionClasses \u2013

        A classes docstring section.

      "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_as_functions_section","title":"do_as_functions_section","text":"
      do_as_functions_section(\n    context: Context,\n    functions: Sequence[Function],\n    *,\n    check_public: bool = True\n) -> DocstringSectionFunctions\n

      Build a functions section from a list of functions.

      Parameters:

      • functions (Sequence[Function]) \u2013

        The functions to build the section from.

      • check_public (bool, default: True ) \u2013

        Whether to check if the function is public.

      Returns:

      • DocstringSectionFunctions \u2013

        A functions docstring section.

      "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_as_modules_section","title":"do_as_modules_section","text":"
      do_as_modules_section(\n    context: Context,\n    modules: Sequence[Module],\n    *,\n    check_public: bool = True\n) -> DocstringSectionModules\n

      Build a modules section from a list of modules.

      Parameters:

      • modules (Sequence[Module]) \u2013

        The modules to build the section from.

      • check_public (bool, default: True ) \u2013

        Whether to check if the module is public.

      Returns:

      • DocstringSectionModules \u2013

        A modules docstring section.

      "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_crossref","title":"do_crossref","text":"
      do_crossref(path: str, *, brief: bool = True) -> Markup\n

      Deprecated. Filter to create cross-references.

      Parameters:

      • path (str) \u2013

        The path to link to.

      • brief (bool, default: True ) \u2013

        Show only the last part of the path, add full path as hover.

      Returns:

      • Markup \u2013

        Markup text.

      "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_filter_objects","title":"do_filter_objects","text":"
      do_filter_objects(\n    objects_dictionary: dict[str, Object | Alias],\n    *,\n    filters: Sequence[tuple[Pattern, bool]] | None = None,\n    members_list: bool | list[str] | None = None,\n    inherited_members: bool | list[str] = False,\n    keep_no_docstrings: bool = True\n) -> list[Object | Alias]\n

      Filter a dictionary of objects based on their docstrings.

      Parameters:

      • objects_dictionary (dict[str, Object | Alias]) \u2013

        The dictionary of objects.

      • filters (Sequence[tuple[Pattern, bool]] | None, default: None ) \u2013

        Filters to apply, based on members' names. Each element is a tuple: a pattern, and a boolean indicating whether to reject the object if the pattern matches.

      • members_list (bool | list[str] | None, default: None ) \u2013

        An optional, explicit list of members to keep. When given and empty, return an empty list. When given and not empty, ignore filters and docstrings presence/absence.

      • inherited_members (bool | list[str], default: False ) \u2013

        Whether to keep inherited members or exclude them.

      • keep_no_docstrings (bool, default: True ) \u2013

        Whether to keep objects with no/empty docstrings (recursive check).

      Returns:

      • list[Object | Alias] \u2013

        A list of objects.

      "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_format_attribute","title":"do_format_attribute","text":"
      do_format_attribute(\n    context: Context,\n    attribute_path: Markup,\n    attribute: Attribute,\n    line_length: int,\n    *,\n    crossrefs: bool = False\n) -> str\n

      Format an attribute using Black.

      Parameters:

      • context (Context) \u2013

        Jinja context, passed automatically.

      • attribute_path (Markup) \u2013

        The path of the callable we render the signature of.

      • attribute (Attribute) \u2013

        The attribute we render the signature of.

      • line_length (int) \u2013

        The line length to give to Black.

      • crossrefs (bool, default: False ) \u2013

        Whether to cross-reference types in the signature.

      Returns:

      • str \u2013

        The same code, formatted.

      "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_format_code","title":"do_format_code","text":"
      do_format_code(code: str, line_length: int) -> str\n

      Format code using Black.

      Parameters:

      • code (str) \u2013

        The code to format.

      • line_length (int) \u2013

        The line length to give to Black.

      Returns:

      • str \u2013

        The same code, formatted.

      "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_format_signature","title":"do_format_signature","text":"
      do_format_signature(\n    context: Context,\n    callable_path: Markup,\n    function: Function,\n    line_length: int,\n    *,\n    annotations: bool | None = None,\n    crossrefs: bool = False\n) -> str\n

      Format a signature using Black.

      Parameters:

      • context (Context) \u2013

        Jinja context, passed automatically.

      • callable_path (Markup) \u2013

        The path of the callable we render the signature of.

      • function (Function) \u2013

        The function we render the signature of.

      • line_length (int) \u2013

        The line length to give to Black.

      • annotations (bool | None, default: None ) \u2013

        Whether to show type annotations.

      • crossrefs (bool, default: False ) \u2013

        Whether to cross-reference types in the signature.

      Returns:

      • str \u2013

        The same code, formatted.

      "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_get_template","title":"do_get_template","text":"
      do_get_template(obj: Object) -> str\n

      Get the template name used to render an object.

      Parameters:

      • obj (Object) \u2013

        A Griffe object.

      Returns:

      • str \u2013

        A template name.

      "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_multi_crossref","title":"do_multi_crossref","text":"
      do_multi_crossref(\n    text: str, *, code: bool = True\n) -> Markup\n

      Deprecated. Filter to create cross-references.

      Parameters:

      • text (str) \u2013

        The text to scan.

      • code (bool, default: True ) \u2013

        Whether to wrap the result in a code tag.

      Returns:

      • Markup \u2013

        Markup text.

      "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_order_members","title":"do_order_members","text":"
      do_order_members(\n    members: Sequence[Object | Alias],\n    order: Order,\n    members_list: bool | list[str] | None,\n) -> Sequence[Object | Alias]\n

      Order members given an ordering method.

      Parameters:

      • members (Sequence[Object | Alias]) \u2013

        The members to order.

      • order (Order) \u2013

        The ordering method.

      • members_list (bool | list[str] | None) \u2013

        An optional member list (manual ordering).

      Returns:

      • Sequence[Object | Alias] \u2013

        The same members, ordered.

      "},{"location":"reference/mkdocstrings_handlers/python/rendering/#mkdocstrings_handlers.python.rendering.do_split_path","title":"do_split_path","text":"
      do_split_path(\n    path: str, full_path: str\n) -> list[tuple[str, str]]\n

      Split object paths for building cross-references.

      Parameters:

      • path (str) \u2013

        The path to split.

      Returns:

      • list[tuple[str, str]] \u2013

        A list of pairs (title, full path).

      "},{"location":"usage/","title":"Usage","text":"

      This is the documentation for the NEW Python handler.

      To read the documentation for the LEGACY handler, go to the legacy handler documentation.

      "},{"location":"usage/#installation","title":"Installation","text":"

      You can install this handler as a mkdocstrings extra:

      pyproject.toml
      # PEP 621 dependencies declaration\n# adapt to your dependencies manager\n[project]\ndependencies = [\n    \"mkdocstrings[python]>=0.18\",\n]\n

      You can also explicitly depend on the handler:

      pyproject.toml
      # PEP 621 dependencies declaration\n# adapt to your dependencies manager\n[project]\ndependencies = [\n    \"mkdocstrings-python\",\n]\n

      The Python handler is the default mkdocstrings handler. You can change the default handler, or explicitely set the Python handler as default by defining the default_handler configuration option of mkdocstrings in mkdocs.yml:

      mkdocs.yml
      plugins:\n- mkdocstrings:\n    default_handler: python\n
      "},{"location":"usage/#injecting-documentation","title":"Injecting documentation","text":"

      With the Python handler installed and configured as default handler, you can inject documentation for a module, class, function, or any other Python object with mkdocstrings' autodoc syntax, in your Markdown pages:

      ::: path.to.object\n

      If another handler was defined as default handler, you can explicitely ask for the Python handler to be used when injecting documentation with the handler option:

      ::: path.to.object\n    handler: python\n
      "},{"location":"usage/#configuration","title":"Configuration","text":"

      When installed, the Python handler becomes the default mkdocstrings handler. You can configure it in mkdocs.yml:

      mkdocs.yml
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        ...  # the Python handler configuration\n
      "},{"location":"usage/#global-only-options","title":"Global-only options","text":"

      Some options are global only, and go directly under the handler's name.

      "},{"location":"usage/#import","title":"import","text":"

      This option is used to import Sphinx-compatible objects inventories from other documentation sites. For example, you can import the standard library objects inventory like this:

      mkdocs.yml
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        import:\n        - https://docs.python-requests.org/en/master/objects.inv\n

      When importing an inventory, you enable automatic cross-references to other documentation sites like the standard library docs or any third-party package docs. Typically, you want to import the inventories of your project's dependencies, at least those that are used in the public API.

      See mkdocstrings' documentation on inventories for more details.

      Additionally, the Python handler accepts a domains option in the import items, which allows to select the inventory domains to select. By default the Python handler only selects the py domain (for Python objects). You might find useful to also enable the std domain:

      mkdocs.yml
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        import:\n        - url: https://docs.python-requests.org/en/master/objects.inv\n          domains: [std, py]\n

      Note

      The import option is common to all handlers, however they might implement it differently, or not even implement it.

      "},{"location":"usage/#paths","title":"paths","text":"

      This option is used to provide filesystem paths in which to search for Python modules. Non-absolute paths are computed as relative to MkDocs configuration file. Example:

      mkdocs.yml
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        paths: [src]  # search packages in the src folder\n

      More details at Finding modules.

      "},{"location":"usage/#load_external_modules","title":"load_external_modules","text":"

      This option allows resolving aliases (imports) to any external module. Modules are considered external when they are not part of the package your are injecting documentation for. Enabling this option will tell the handler to resolve aliases recursively when they are made public through the __all__ variable.

      Use with caution

      This can load a lot of modules through Griffe, slowing down your build or triggering errors that Griffe does not yet handle. We recommend using the preload_modules option instead, which acts as an include-list rather than as include-all.

      Example:

      mkdocs.yml
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        load_external_modules: true\n
      "},{"location":"usage/#globallocal-options","title":"Global/local options","text":"

      The other options can be used both globally and locally, under the options key. For example, globally:

      mkdocs.yml
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          do_something: true\n

      ...and locally, overriding the global configuration:

      docs/some_page.md
      ::: package.module.class\n    options:\n      do_something: false\n

      These options affect how the documentation is collected from sources and rendered. See the following tables summarizing the options, and get more details for each option in the following pages:

      • General options: various options that do not fit in the other categories
      • Headings options: options related to headings and the table of contents (or sidebar, depending on the theme used)
      • Members options: options related to filtering or ordering members in the generated documentation
      • Docstrings options: options related to docstrings (parsing and rendering)
      • Signature options: options related to signatures and type annotations
      "},{"location":"usage/#options-summary","title":"Options summary","text":"

      Default handler configuration.

      General options:

      • allow_inspection (bool) \u2013

        Whether to allow inspecting modules when visiting them is not possible. Default: True.

      • show_bases (bool) \u2013

        Show the base classes of a class. Default: True.

      • show_source (bool) \u2013

        Show the source code of this object. Default: True.

      • preload_modules (list[str] | None) \u2013

        Pre-load modules that are not specified directly in autodoc instructions (::: identifier). It is useful when you want to render documentation for a particular member of an object, and this member is imported from another package than its parent.

        For an imported member to be rendered, you need to add it to the __all__ attribute of the importing module.

        The modules must be listed as an array of strings. Default: None.

      Headings options:

      • heading_level (int) \u2013

        The initial heading level to use. Default: 2.

      • show_root_heading (bool) \u2013

        Show the heading of the object at the root of the documentation tree (i.e. the object referenced by the identifier after :::). Default: False.

      • show_root_toc_entry (bool) \u2013

        If the root heading is not shown, at least add a ToC entry for it. Default: True.

      • show_root_full_path (bool) \u2013

        Show the full Python path for the root object heading. Default: True.

      • show_root_members_full_path (bool) \u2013

        Show the full Python path of the root members. Default: False.

      • show_object_full_path (bool) \u2013

        Show the full Python path of every object. Default: False.

      • show_category_heading (bool) \u2013

        When grouped by categories, show a heading for each category. Default: False.

      • show_symbol_type_heading (bool) \u2013

        Show the symbol type in headings (e.g. mod, class, meth, func and attr). Default: False.

      • show_symbol_type_toc (bool) \u2013

        Show the symbol type in the Table of Contents (e.g. mod, class, methd, func and attr). Default: False.

      Members options:

      • inherited_members (list[str] | bool | None) \u2013

        A boolean, or an explicit list of inherited members to render. If true, select all inherited members, which can then be filtered with members. If false or empty list, do not select any inherited member. Default: False.

      • members (list[str] | bool | None) \u2013

        A boolean, or an explicit list of members to render. If true, select all members without further filtering. If false or empty list, do not render members. If none, select all members and apply further filtering with filters and docstrings. Default: None.

      • members_order (str) \u2013

        The members ordering to use. Options: alphabetical - order by the members names, source - order members as they appear in the source file. Default: \"alphabetical\".

      • filters (list[str] | None) \u2013

        A list of filters applied to filter objects based on their name. A filter starting with ! will exclude matching objects instead of including them. The members option takes precedence over filters (filters will still be applied recursively to lower members in the hierarchy). Default: [\"!^_[^_]\"].

      • group_by_category (bool) \u2013

        Group the object's children by categories: attributes, classes, functions, and modules. Default: True.

      • show_submodules (bool) \u2013

        When rendering a module, show its submodules recursively. Default: False.

      • summary (bool | dict[str, bool]) \u2013

        Whether to render summaries of modules, classes, functions (methods) and attributes.

      Docstrings options:

      • docstring_style (str) \u2013

        The docstring style to use: google, numpy, sphinx, or None. Default: \"google\".

      • docstring_options (dict) \u2013

        The options for the docstring parser. See parsers under griffe.docstrings.

      • docstring_section_style (str) \u2013

        The style used to render docstring sections. Options: table, list, spacy. Default: \"table\".

      • merge_init_into_class (bool) \u2013

        Whether to merge the __init__ method into the class' signature and docstring. Default: False.

      • show_if_no_docstring (bool) \u2013

        Show the object heading even if it has no docstring or children with docstrings. Default: False.

      • show_docstring_attributes (bool) \u2013

        Whether to display the \"Attributes\" section in the object's docstring. Default: True.

      • show_docstring_functions (bool) \u2013

        Whether to display the \"Functions\" or \"Methods\" sections in the object's docstring. Default: True.

      • show_docstring_classes (bool) \u2013

        Whether to display the \"Classes\" section in the object's docstring. Default: True.

      • show_docstring_modules (bool) \u2013

        Whether to display the \"Modules\" section in the object's docstring. Default: True.

      • show_docstring_description (bool) \u2013

        Whether to display the textual block (including admonitions) in the object's docstring. Default: True.

      • show_docstring_examples (bool) \u2013

        Whether to display the \"Examples\" section in the object's docstring. Default: True.

      • show_docstring_other_parameters (bool) \u2013

        Whether to display the \"Other Parameters\" section in the object's docstring. Default: True.

      • show_docstring_parameters (bool) \u2013

        Whether to display the \"Parameters\" section in the object's docstring. Default: True.

      • show_docstring_raises (bool) \u2013

        Whether to display the \"Raises\" section in the object's docstring. Default: True.

      • show_docstring_receives (bool) \u2013

        Whether to display the \"Receives\" section in the object's docstring. Default: True.

      • show_docstring_returns (bool) \u2013

        Whether to display the \"Returns\" section in the object's docstring. Default: True.

      • show_docstring_warns (bool) \u2013

        Whether to display the \"Warns\" section in the object's docstring. Default: True.

      • show_docstring_yields (bool) \u2013

        Whether to display the \"Yields\" section in the object's docstring. Default: True.

      Signatures/annotations options:

      • annotations_path (str) \u2013

        The verbosity for annotations path: brief (recommended), or source (as written in the source). Default: \"brief\".

      • line_length (int) \u2013

        Maximum line length when formatting code/signatures. Default: 60.

      • show_signature (bool) \u2013

        Show methods and functions signatures. Default: True.

      • show_signature_annotations (bool) \u2013

        Show the type annotations in methods and functions signatures. Default: False.

      • signature_crossrefs (bool) \u2013

        Whether to render cross-references for type annotations in signatures. Default: False.

      • separate_signature (bool) \u2013

        Whether to put the whole signature in a code block below the heading. If Black is installed, the signature is also formatted using it. Default: False.

      • unwrap_annotated (bool) \u2013

        Whether to unwrap Annotated types to show only the type without the annotations. Default: False.

      "},{"location":"usage/#finding-modules","title":"Finding modules","text":"

      There are multiple ways to tell the handler where to find your packages/modules.

      The recommended method is to use the paths option, as it's the only one that works with the -f option of MkDocs, allowing to build the documentation from any location on the file system. Indeed, the paths provided with the paths option are computed as relative to the configuration file (mkdocs.yml), so that the current working directory has no impact on the build process: you can build the docs from any location on your filesystem.

      "},{"location":"usage/#using-the-paths-option","title":"Using the paths option","text":"

      This is the recommended method.

      1. mkdocs.yml in root, package in root

        \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc4 mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 package/\n

        mkdocs.yml
        plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        paths: [.]  # actually not needed, default\n
      2. mkdocs.yml in root, package in subfolder

        \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc4 mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 src/\n    \u2514\u2500\u2500 \ud83d\udcc1 package/\n

        mkdocs.yml
        plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        paths: [src]\n
      3. mkdocs.yml in subfolder, package in root

        \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc1 docs/\n\u2502   \u2514\u2500\u2500 \ud83d\udcc4 mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 package/\n

        mkdocs.yml
        plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        paths: [..]\n
      4. mkdocs.yml in subfolder, package in subfolder

        \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc1 docs/\n\u2502   \u2514\u2500\u2500 \ud83d\udcc4 mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 src/\n    \u2514\u2500\u2500 \ud83d\udcc1 package/\n

        mkdocs.yml
        plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        paths: [../src]\n

      Except for case 1, which is supported by default, we strongly recommend setting the path to your packages using this option, even if it works without it (for example because your project manager automatically adds src to PYTHONPATH), to make sure anyone can build your docs from any location on their filesystem.

      "},{"location":"usage/#using-the-pythonpath-environment-variable","title":"Using the PYTHONPATH environment variable","text":"

      This method has limitations.

      This method might work for you, with your current setup, but not for others trying your build your docs with their own setup/environment. We recommend using the paths method instead.

      You can take advantage of the usual Python loading mechanisms. In Bash and other shells, you can run your command like this (note the prepended PYTHONPATH=...):

      1. mkdocs.yml in root, package in root

        \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc4 mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 package/\n

        PYTHONPATH=. mkdocs build  # actually not needed, default\n
      2. mkdocs.yml in root, package in subfolder

        \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc4 mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 src/\n    \u2514\u2500\u2500 \ud83d\udcc1 package/\n

        PYTHONPATH=src mkdocs build\n
      3. mkdocs.yml in subfolder, package in root

        \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc1 docs/\n\u2502   \u2514\u2500\u2500 \ud83d\udcc4 mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 package/\n

        PYTHONPATH=. mkdocs build -f docs/mkdocs.yml\n
      4. mkdocs.yml in subfolder, package in subfolder

        \ud83d\udcc1 root/\n\u251c\u2500\u2500 \ud83d\udcc1 docs/\n\u2502   \u2514\u2500\u2500 \ud83d\udcc4 mkdocs.yml\n\u2514\u2500\u2500 \ud83d\udcc1 src/\n    \u2514\u2500\u2500 \ud83d\udcc1 package/\n

        PYTHONPATH=src mkdocs build -f docs/mkdocs.yml\n
      "},{"location":"usage/#installing-your-package-in-the-current-python-environment","title":"Installing your package in the current Python environment","text":"

      This method has limitations.

      This method might work for you, with your current setup, but not for others trying your build your docs with their own setup/environment. We recommend using the paths method instead.

      Install your package in the current environment, and run MkDocs:

      pipPDMPoetry
      . venv/bin/activate\npip install -e .\nmkdocs build\n
      pdm install\npdm run mkdocs build\n
      poetry install\npoetry run mkdocs build\n
      "},{"location":"usage/customization/","title":"Customization","text":"

      It is possible to customize the output of the generated documentation with CSS and/or by overriding templates.

      "},{"location":"usage/customization/#css-classes","title":"CSS classes","text":"

      The following CSS classes are used in the generated HTML:

      • doc: on all the following elements
      • doc-children: on divs containing the children of an object
      • doc-object: on divs containing an object
        • doc-attribute: on divs containing an attribute
        • doc-class: on divs containing a class
        • doc-function: on divs containing a function
        • doc-module: on divs containing a module
      • doc-heading: on objects headings
        • doc-object-name: on spans wrapping objects names/paths in the heading
          • doc-KIND-name: as above, specific to the kind of object (module, class, function, attribute)
      • doc-contents: on divs wrapping the docstring then the children (if any)
        • first: same, but only on the root object's contents div
      • doc-labels: on spans wrapping the object's labels
        • doc-label: on small elements containing a label
          • doc-label-LABEL: same, where LABEL is replaced by the actual label
      • doc-md-description: on divs containing HTML descriptions converted from Markdown docstrings
      • doc-symbol: on code tags of symbol types
        • doc-symbol-heading: on symbol types in headings
        • doc-symbol-toc: on symbol types in the ToC
        • doc-symbol-KIND: specific to the kind of object (module, class, function, method, attribute)

      Example with colorful labels

      CSSResult
      .doc-label { border-radius: 15px; padding: 2px 8px; font-weight: bold; }\n.doc-label-special { background-color: #3330E4; color: white; }\n.doc-label-private { background-color: #F637EC; color: white; }\n.doc-label-property { background-color: #FBB454; color: black; }\n.doc-label-read-only { background-color: #FAEA48; color: black; }\n

      special private property read-only

      "},{"location":"usage/customization/#symbol-types","title":"Symbol types","text":""},{"location":"usage/customization/#colors","title":"Colors","text":"

      You can customize the colors of the symbol types (see show_symbol_type_heading and show_symbol_type_toc) by overriding the values of our CSS variables, for example:

      docs/css/mkdocstrings.css
      [data-md-color-scheme=\"default\"] {\n  --doc-symbol-attribute-fg-color: #0079ff;\n  --doc-symbol-function-fg-color: #00dfa2;\n  --doc-symbol-method-fg-color: #00dfa2;\n  --doc-symbol-class-fg-color: #d1b619;\n  --doc-symbol-module-fg-color: #ff0060;\n\n  --doc-symbol-attribute-bg-color: #0079ff1a;\n  --doc-symbol-function-bg-color: #00dfa21a;\n  --doc-symbol-method-bg-color: #00dfa21a;\n  --doc-symbol-class-bg-color: #d1b6191a;\n  --doc-symbol-module-bg-color: #ff00601a;\n}\n\n[data-md-color-scheme=\"slate\"] {\n  --doc-symbol-attribute-fg-color: #963fb8;\n  --doc-symbol-function-fg-color: #6d67e4;\n  --doc-symbol-method-fg-color: #6d67e4;\n  --doc-symbol-class-fg-color: #46c2cb;\n  --doc-symbol-module-fg-color: #f2f7a1;\n\n  --doc-symbol-attribute-bg-color: #963fb81a;\n  --doc-symbol-function-bg-color: #6d67e41a;\n  --doc-symbol-method-bg-color: #6d67e41a;\n  --doc-symbol-class-bg-color: #46c2cb1a;\n  --doc-symbol-module-bg-color: #f2f7a11a;\n}\n

      The [data-md-color-scheme=\"*\"] selectors work with the Material for MkDocs theme. If you are using another theme, adapt the selectors to this theme if it supports light and dark themes, otherwise just override the variables at root level:

      docs/css/mkdocstrings.css
      :root {\n  --doc-symbol-attribute-fg-color: #0079ff;\n  --doc-symbol-function-fg-color: #00dfa2;\n  --doc-symbol-method-fg-color: #00dfa2;\n  --doc-symbol-class-fg-color: #d1b619;\n  --doc-symbol-module-fg-color: #ff0060;\n\n  --doc-symbol-attribute-bg-color: #0079ff1a;\n  --doc-symbol-function-bg-color: #00dfa21a;\n  --doc-symbol-method-bg-color: #00dfa21a;\n  --doc-symbol-class-bg-color: #d1b6191a;\n  --doc-symbol-module-bg-color: #ff00601a;\n}\n

      Preview

      Try cycling through the themes to see the colors for each theme:

      "},{"location":"usage/customization/#names","title":"Names","text":"

      You can also change the actual symbol names. For example, to use single letters instead of truncated types:

      docs/css/mkdocstrings.css
      .doc-symbol-attribute::after {\n  content: \"A\";\n}\n\n.doc-symbol-function::after {\n  content: \"F\";\n}\n\n.doc-symbol-method::after {\n  content: \"M\";\n}\n\n.doc-symbol-class::after {\n  content: \"C\";\n}\n\n.doc-symbol-module::after {\n  content: \"M\";\n}\n

      Preview

      • Attribute:
      • Function:
      • Method:
      • Class:
      • Module:
      "},{"location":"usage/customization/#templates","title":"Templates","text":"

      Templates are organized into the following tree:

      \ud83d\udcc1 theme/\n\u251c\u2500\u2500 \ud83d\udcc4 attribute.html\n\u251c\u2500\u2500 \ud83d\udcc4 children.html\n\u251c\u2500\u2500 \ud83d\udcc4 class.html\n\u251c\u2500\u2500 \ud83d\udcc1 docstring/\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 admonition.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 attributes.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 classes.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 examples.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 functions.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 modules.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 other_parameters.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 parameters.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 raises.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 receives.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 returns.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 warns.html\n\u2502   \u2514\u2500\u2500 \ud83d\udcc4 yields.html\n\u251c\u2500\u2500 \ud83d\udcc4 docstring.html\n\u251c\u2500\u2500 \ud83d\udcc4 expression.html\n\u251c\u2500\u2500 \ud83d\udcc4 function.html\n\u251c\u2500\u2500 \ud83d\udcc4 labels.html\n\u251c\u2500\u2500 \ud83d\udcc4 language.html\n\u251c\u2500\u2500 \ud83d\udcc1 languages/\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 en.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 ja.html\n\u2502   \u2514\u2500\u2500 \ud83d\udcc4 zh.html\n\u251c\u2500\u2500 \ud83d\udcc4 module.html\n\u251c\u2500\u2500 \ud83d\udcc4 signature.html\n\u251c\u2500\u2500 \ud83d\udcc1 summary/\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 attributes.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 classes.html\n\u2502   \u251c\u2500\u2500 \ud83d\udcc4 functions.html\n\u2502   \u2514\u2500\u2500 \ud83d\udcc4 modules.html\n\u2514\u2500\u2500 \ud83d\udcc4 summary.html\n

      See them in the repository. See the general mkdocstrings documentation to learn how to override them: https://mkdocstrings.github.io/theming/#templates.

      Each one of these templates extends a base version in theme/_base. Example:

      theme/class.html
      {% extends \"_base/class.html\" %}\n

      Some of these templates define Jinja blocks. allowing to customize only parts of a template without having to fully copy-paste it into your project:

      templates/theme/class.html
      {% extends \"_base/class.html\" %}\n{% block contents %}\n  {{ block.super }}\n  Additional contents\n{% endblock contents %}\n
      "},{"location":"usage/customization/#available-blocks","title":"Available blocks","text":"

      Only the templates for the Material for MkDocs provide Jinja blocks. The following tables show the block names, description, and the Jinja context available in their scope.

      "},{"location":"usage/customization/#modulehtml","title":"module.html","text":"
      • heading: The module heading.
      • labels: The module labels.
      • contents: The module contents: docstring and children blocks.
      • docstring: The module docstring.
      • summary: The automatic summaries of members.
      • children: The module children.

      Available context:

      • config: The handler configuration (dictionary).
      • module: The Module instance.
      "},{"location":"usage/customization/#classhtml","title":"class.html","text":"
      • heading: The class heading.
      • labels: The class labels.
      • signature: The class signature.
      • contents: The class contents: bases, docstring, source and children blocks.
      • bases: The class bases.
      • docstring: The class docstring.
      • summary: The automatic summaries of members.
      • source: The class source code.
      • children: The class children.

      Available context:

      • config: The handler configuration (dictionary).
      • class: The Class instance.
      "},{"location":"usage/customization/#functionhtml","title":"function.html","text":"
      • heading: The function heading.
      • labels: The function labels.
      • signature: The function signature.
      • contents: The function contents: docstring and source blocks.
      • docstring: The function docstring.
      • source: The function source code.

      Available context:

      • config: The handler configuration (dictionary).
      • function: The Function instance.
      "},{"location":"usage/customization/#attributehtml","title":"attribute.html","text":"
      • heading: The attribute heading.
      • labels: The attribute labels.
      • signature: The attribute signature.
      • contents: The attribute contents: docstring block.
      • docstring: The attribute docstring.

      Available context:

      • config: The handler configuration (dictionary).
      • function: The Attribute instance.
      "},{"location":"usage/customization/#docstring-sections","title":"Docstring sections","text":"

      In docstring/attributes.html, docstring/functions.html, docstring/classes.html, docstring/modules.html, docstring/other_parameters.html, docstring/parameters.html, docstring/raises.html, docstring/receives.html, docstring/returns.html, docstring/warns.html, and docstring/yields.html:

      • table_style: The section as a table.
      • list_style: The section as a list.
      • spacy_style: The section as a Spacy table.

      Available context:

      • section: The DocstringSection instance (see DocstringSection* subclasses).
      "},{"location":"usage/customization/#style-recommendations","title":"Style recommendations","text":""},{"location":"usage/customization/#material","title":"Material","text":"

      Here are some CSS rules for the Material for MkDocs theme:

      /* Indentation. */\ndiv.doc-contents:not(.first) {\n  padding-left: 25px;\n  border-left: .05rem solid var(--md-typeset-table-color);\n}\n\n/* Mark external links as such. */\na.external::after,\na.autorefs-external::after {\n  /* https://primer.style/octicons/arrow-up-right-24 */\n  mask-image: url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M18.25 15.5a.75.75 0 00.75-.75v-9a.75.75 0 00-.75-.75h-9a.75.75 0 000 1.5h7.19L6.22 16.72a.75.75 0 101.06 1.06L17.5 7.56v7.19c0 .414.336.75.75.75z\"></path></svg>');\n  -webkit-mask-image: url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M18.25 15.5a.75.75 0 00.75-.75v-9a.75.75 0 00-.75-.75h-9a.75.75 0 000 1.5h7.19L6.22 16.72a.75.75 0 101.06 1.06L17.5 7.56v7.19c0 .414.336.75.75.75z\"></path></svg>');\n  content: ' ';\n\n  display: inline-block;\n  vertical-align: middle;\n  position: relative;\n\n  height: 1em;\n  width: 1em;\n  background-color: var(--md-typeset-a-color);\n}\n\na.external:hover::after,\na.autorefs-external:hover::after {\n  background-color: var(--md-accent-fg-color);\n}\n

      "},{"location":"usage/customization/#readthedocs","title":"ReadTheDocs","text":"

      Here are some CSS rules for the built-in ReadTheDocs theme:

      /* Indentation. */\ndiv.doc-contents:not(.first) {\n  padding-left: 25px;\n  border-left: .05rem solid rgba(200, 200, 200, 0.2);\n}\n
      "},{"location":"usage/extensions/","title":"Extensions","text":""},{"location":"usage/extensions/#work-in-progress","title":"Work in Progress!","text":"

      The Python handler supports extensions through mkdocstrings' handler extensions.

      Specifically, additional templates can be added to the handler, and Griffe extensions can instruct the handler to use a particular template for a particular object by setting a value in the Griffe object's extra dictionary:

      griffe_extension.py
      obj = ...  # get a reference to a Griffe object\nif \"mkdocstrings\" not in obj.extra:\n    obj.extra[\"mkdocstrings\"] = {}\nobj.extra[\"mkdocstrings\"][\"template\"] = \"template_name.html\"\n
      "},{"location":"usage/configuration/docstrings/","title":"Docstrings options","text":""},{"location":"usage/configuration/docstrings/#docstring_style","title":"docstring_style","text":"
      • Type str \"google\"

      The docstring style to expect when parsing docstrings.

      Possible values:

      • \"google\": see Google style.
      • \"numpy\": see Numpy style.
      • \"sphinx\": see Sphinx style.
      • None (null or ~ in YAML): no style at all, parse as regular text.
      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          docstring_style: google\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      docstring_style: numpy\n

      Preview

      Every style gets rendered the same way. Here are some docstring examples.

      GoogleNumpySphinx
      def greet(name: str) -> str:\n    \"\"\"Greet someone.\n\n    Parameters:\n        name: The name of the person to greet.\n\n    Returns:\n        A greeting message.\n    \"\"\"\n    return f\"Hello {name}!\"\n
      def greet(name: str) -> str:\n    \"\"\"Greet someone.\n\n    Parameters\n    ----------\n    name\n        The name of the person to greet.\n\n    Returns\n    -------\n    A greeting message.\n    \"\"\"\n    return f\"Hello {name}!\"\n
      def greet(name: str) -> str:\n    \"\"\"Greet someone.\n\n    :param name: The name of the person to greet.\n    :return: A greeting message.\n    \"\"\"\n    return f\"Hello {name}!\"\n
      "},{"location":"usage/configuration/docstrings/#docstring_options","title":"docstring_optionsPrintOKPrintOK","text":"
      • Type dict {}

      The options for the docstring parser.

      • Google-style options
      • Numpydoc-style options

      The Sphinx style does not offer any option.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          docstring_options:\n            ignore_init_summary: false\n            trim_doctest_flags: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      docstring_options:\n        ignore_init_summary: true\n        trim_doctest_flags: false\n
      class PrintOK:\n    \"\"\"Class docstring.\"\"\"\n\n    def __init__(self):\n        \"\"\"Initialize the instance.\n\n        Examples:\n            >>> Class()  # doctest: +NORMALIZE_WHITESPACE\n            ok\n        \"\"\"\n        print(\"ok\")\n

      Preview

      Ignore init summary, trim doctest flagsKeep init summary and doctest flags

      Class docstring.

      __init__

      Examples:

      >>> Class()\nok\n

      Class docstring.

      __init__

      Initialize the instance.

      Examples:

      >>> Class()  # doctest: +NORMALIZE_WHITESPACE\nok\n
      "},{"location":"usage/configuration/docstrings/#docstring_section_style","title":"docstring_section_style","text":"
      • Type str \"table\"

      The style used to render docstring sections.

      A section is a block of text that has a special meaning in a docstring. There are sections for documenting attributes of an object, parameters of a function, exceptions raised by a function, the return value of a function, etc.

      Sections are parsed as structured data and can therefore be rendered in different ways. Possible values:

      • \"table\": a simple table, usually with type, name and description columns
      • \"list\": a simple list, akin to what you get with the ReadTheDocs Sphinx theme
      • \"spacy\": a poor implementation of the amazing tables in Spacy's documentation
      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          docstring_section_style: table\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      docstring_section_style: list\n

      Preview

      TableListSpacy

      Tables work well when you have lots of items with short names, type annotations, descriptions, etc.. With longer strings, the columns risk getting squished horizontally. In that case, the Spacy tables can help.

      Parameters:

      Type Name Description Default int threshold Threshold for something. required bool flag Enable something. False

      Other Parameters:

      Type Name Description Default list[int | float] gravity_forces Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. required VacuumType | Literal[\"regular\"] vacuum_type Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. VacuumType.PLASMA

      Lists work well whatever the length of names, type annotations, descriptions, etc.

      Parameters:

      • threshold (int) \u2014 Threshold for something.
      • flag (bool) \u2014 Enable something.

      Other Parameters:

      • gravity_forces (list[int | float]) \u2014 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
      • vacuum_type (VacuumType | Literal[\"regular\"]) \u2014 Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

      Spacy tables work better than regular tables with longer names, type annotations, descriptions, etc., by reserving more horizontal space on the second column.

      Parameters:

      Name Description threshold Threshold for something.TYPE: int DEFAULT: required flag Enable something.TYPE: bool DEFAULT: False

      Other Parameters:

      Name Description gravity_forces Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.TYPE: list[int | float] DEFAULT: required vacuum_type Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.TYPE:VacuumType | Literal[\"regular\"] DEFAULT: VacuumType.PLASMA"},{"location":"usage/configuration/docstrings/#merge_init_into_class","title":"merge_init_into_classThing(value=0)Thing","text":"
      • Type bool False

      Whether to merge the __init__ method into the class' signature and docstring.

      By default, only the class name is rendered in headings. When merging, the __init__ method parameters are added after the class name, like a signature, and the __init__ method docstring is appended to the class' docstring. This option is well used in combination with the ignore_init_summary docstring option, to discard the first line of the __init__ docstring which is not often useful.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          docstring_options:\n            ignore_init_summary: false\n          merge_init_into_class: false\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      docstring_options:\n        ignore_init_summary: true\n      merge_init_into_class: true\n
      class Thing:\n    \"\"\"A class for things.\"\"\"\n\n    def __init__(self, value: int = 0):\n        \"\"\"Initialize a thing.\n\n        Parameters:\n            value: The thing's value.\n        \"\"\"\n        self.value = value\n

      Preview

      Merged, summary discardedUnmerged, summary kept

      Class docstring.

      Parameters:

      Type Name Description Default int value The thing's value. 0

      Class docstring.

      __init__(value=0)

      Initialize a thing.

      Parameters:

      Type Name Description Default int value The thing's value. 0"},{"location":"usage/configuration/docstrings/#show_if_no_docstring","title":"show_if_no_docstringfunction_without_docstringfunction_with_docstringClassWithoutDocstringfunction_with_docstringClassWithoutDocstring","text":"
      • Type bool False

      Show the object heading even if it has no docstring or children with docstrings.

      Without an explicit list of members, members are selected based on filters, and then filtered again to keep only those with docstrings. Checking if a member has a docstring is done recursively: if at least one of its direct or indirect members (lower in the tree) has a docstring, the member is rendered. If the member does not have a docstring, and none of its members have a docstring, it is excluded.

      With this option you can tell the Python handler to skip the docstring check.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_if_no_docstring: false\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      show_if_no_docstring: true\n
      def function_without_docstring():\n    ...\n\n\ndef function_with_docstring():\n    \"\"\"Hello.\"\"\"\n\n\nclass ClassWithoutDocstring:\n    def method_without_docstring(self):\n        ...\n\n    def method_with_docstring(self):\n        \"\"\"Hello.\"\"\"\n

      Preview

      ShowDon't show

      Hello.

      method_without_docstring method_with_docstring

      Hello.

      Hello.

      method_with_docstring

      Hello.

      "},{"location":"usage/configuration/docstrings/#show_docstring_attributes","title":"show_docstring_attributesClassClass","text":"
      • Type bool True

      Whether to render the \"Attributes\" sections of docstrings.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_attributes: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      show_docstring_attributes: false\n
      class Class:\n    \"\"\"Summary.\n\n    Attributes:\n        attr: Some attribute.\n    \"\"\"\n\n    attr: int = 1\n

      Preview

      With attributesWithout attributes

      Summary.

      Attributes:

      Type Name Description int attr Some attribute.

      Summary.

      "},{"location":"usage/configuration/docstrings/#show_docstring_functions","title":"show_docstring_functionsmodulemodule","text":"
      • Type bool True

      Whether to render the \"Functions\" or \"Methods\" sections of docstrings.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_functions: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      show_docstring_functions: false\n
      \"\"\"Summary.\n\nFunctions:\n    foo: Some function.\n\"\"\"\n\n\ndef foo():\n    ...\n\n\nclass Class:\n    \"\"\"Summary.\n\n    Methods:\n        bar: Some method.\n    \"\"\"\n\n    def bar(self):\n        ...\n

      Preview

      With functionsWithout functions

      Summary.

      Functions:

      Name Description foo Some function. Class

      Summary.

      Methods:

      Name Description bar Some method.

      Summary.

      Class

      Summary.

      "},{"location":"usage/configuration/docstrings/#show_docstring_classes","title":"show_docstring_classesmodulemodule","text":"
      • Type bool True

      Whether to render the \"Classes\" sections of docstrings.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_classes: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      show_docstring_classes: false\n
      \"\"\"Summary.\n\nClasses:\n    Class: Some class.\n\"\"\"\n\n\nclass Class:\n    \"\"\"Summary.\"\"\"\n

      Preview

      With classesWithout classes

      Summary.

      Classes:

      Name Description Class Some class. Class

      Summary.

      Summary.

      Class

      Summary.

      "},{"location":"usage/configuration/docstrings/#show_docstring_modules","title":"show_docstring_modulesmodulemodule","text":"
      • Type bool True

      Whether to render the \"Modules\" sections of docstrings.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_modules: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      show_docstring_modules: false\n
      \ud83d\udcc1 module/\n\u251c\u2500\u2500 \ud83d\udcc4 __init__.py\n\u2514\u2500\u2500 \ud83d\udcc4 submodule.py\n
      module/__init__.py
      \"\"\"Summary.\n\nModules:\n    submodule: Some module.\n\"\"\"\n

      Preview

      With modulesWithout modules

      Summary.

      Modules:

      Name Description submodule Some module.

      Summary.

      "},{"location":"usage/configuration/docstrings/#show_docstring_description","title":"show_docstring_descriptionClassClass","text":"
      • Type bool True

      Whether to render the textual blocks (including admonitions) of docstrings.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_description: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      show_docstring_description: false\n
      class Class:\n    \"\"\"Summary.\n\n    Long description.\n\n    Warning: Deprecated\n        Stop using this class.\n\n    Attributes:\n        attr: Some attribute.\n    \"\"\"\n\n    attr: int = 1\n

      Preview

      With description blocksWithout description blocks

      Summary.

      Long description.

      Deprecated

      Stop using this class.

      Attributes:

      Type Name Description int attr Some attribute.

      Attributes:

      Type Name Description int attr Some attribute."},{"location":"usage/configuration/docstrings/#show_docstring_examples","title":"show_docstring_examplesprint_helloprint_hello","text":"
      • Type bool True

      Whether to render the \"Examples\" section of docstrings.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_examples: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      show_docstring_examples: false\n
      def print_hello():\n    \"\"\"Print hello.\n\n    Examples:\n        >>> print(\"hello\")\n        hello\n    \"\"\"\n    print(\"hello\")\n

      Preview

      With examplesWithout examples

      Print hello.

      Examples:

      >>> print(\"hello\")\nhello\n

      Print hello.

      "},{"location":"usage/configuration/docstrings/#show_docstring_other_parameters","title":"show_docstring_other_parametersdo_somethingdo_something","text":"
      • Type bool True

      Whether to render the \"Other Parameters\" section of docstrings.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_other_parameters: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      show_docstring_other_parameters: false\n
      def do_something(**kwargs):\n    \"\"\"Do something.\n\n    Other parameters:\n        whatever (int): Some integer.\n    \"\"\"\n

      Preview

      With other parametersWithout other parameters

      Do something.

      Other parameters:

      Type Name Description int whatever Some integer.

      Do something.

      "},{"location":"usage/configuration/docstrings/#show_docstring_parameters","title":"show_docstring_parametersdo_somethingdo_something","text":"
      • Type bool True

      Whether to render the \"Parameters\" section of docstrings.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_parameters: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      show_docstring_parameters: false\n
      def do_something(whatever: int = 0):\n    \"\"\"Do something.\n\n    Parameters:\n        whatever: Some integer.\n    \"\"\"\n

      Preview

      With parametersWithout parameters

      Do something.

      Parameters:

      Type Name Description Default int whatever Some integer. 0

      Do something.

      "},{"location":"usage/configuration/docstrings/#show_docstring_raises","title":"show_docstring_raisesraise_runtime_errorraise_runtime_error","text":"
      • Type bool True

      Whether to render the \"Raises\" section of docstrings.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_raises: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      show_docstring_raises: false\n
      def raise_runtime_error():\n    \"\"\"Raise a runtime error.\n\n    Raises:\n        RuntimeError: Not good.\n    \"\"\"\n    raise RuntimeError\n

      Preview

      With exceptionsWithout exceptions

      Raise a runtime error.

      Raises:

      Type Description RuntimeError Not good.

      Raise a runtime error.

      "},{"location":"usage/configuration/docstrings/#show_docstring_receives","title":"show_docstring_receivesiter_skipiter_skip","text":"
      • Type bool True

      Whether to render the \"Receives\" section of docstrings.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_receives: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      show_docstring_receives: false\n
      def iter_skip(\n    iterable: Iterable[T],\n    initial_skip: int = 0,\n) -> Generator[T, int, None]:\n    \"\"\"Iterate and skip elements.\n\n    Receives:\n        skip: Number of elements to skip.\n    \"\"\"\n    skip = initial_skip\n    for element in iterable:\n        if skip or 0 > 0:\n            skip -= 1\n        else:\n            skip = yield element\n

      Preview

      With received valuesWithout received values

      Iterate and skip elements.

      Receives:

      Type Description int Number of elements to skip.

      Iterate and skip elements.

      "},{"location":"usage/configuration/docstrings/#show_docstring_returns","title":"show_docstring_returnsrandrand","text":"
      • Type bool True

      Whether to render the \"Returns\" section of docstrings.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_returns: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      show_docstring_returns: false\n
      def rand() -> int:\n    \"\"\"Return a random number.\n\n    Returns:\n        A random number.\n    \"\"\"\n    return random.randint(0, 1000)\n

      Preview

      With return valueWithout return value

      Return a random number.

      Returns:

      Type Description int A random number.

      Return a random number.

      "},{"location":"usage/configuration/docstrings/#show_docstring_warns","title":"show_docstring_warnswarnwarn","text":"
      • Type bool True

      Whether to render the \"Warns\" section of docstrings.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_warns: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      show_docstring_warns: false\n
      def warn():\n    \"\"\"Warn user.\n\n    Warns:\n        UserWarning: When this is inappropriate.\n    \"\"\"\n    warnings.warn(UserWarning(\"This is inappropriate\"))\n

      Preview

      With warningsWithout warnings

      Warn user.

      Warns:

      Type Description UserWarning When this is inappropriate.

      Warn user.

      "},{"location":"usage/configuration/docstrings/#show_docstring_yields","title":"show_docstring_yieldsiter_skipiter_skip","text":"
      • Type bool True

      Whether to render the \"Yields\" section of docstrings.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_docstring_yields: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      show_docstring_yields: false\n
      def iter_skip(\n    iterable: Iterable[T],\n    initial_skip: int = 0,\n) -> Generator[T, int, None]:\n    \"\"\"Iterate and skip elements.\n\n    Yields:\n        Elements of the iterable.\n    \"\"\"\n    skip = initial_skip\n    for element in iterable:\n        if skip or 0 > 0:\n            skip -= 1\n        else:\n            skip = yield element\n

      Preview

      With yielded valuesWithout yielded values

      Iterate and skip elements.

      Yields:

      Type Description T Elements of the iterable.

      Iterate and skip elements.

      "},{"location":"usage/configuration/general/","title":"General options","text":""},{"location":"usage/configuration/general/#allow_inspection","title":"allow_inspectionSomeClassSomeClass","text":"
      • Type bool True

      Whether to allow inspecting modules (importing them) when it is not possible to visit them (parse their source code).

      When loading data for a given package, Griffe discovers every Python module, compiled or not, and inspects or visits them accordingly.

      If you have compiled modules but also provide stubs for them, you might want to disable the inspection of these modules, because inspection picks up many more members, and sometimes the collected data is inaccurate (depending on the tool that was used to compile the module) or too low-level/technical for API documentation.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          allow_inspection: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.object\n    options:\n      allow_inspection: false\n

      Preview

      With inspectionWithout inspection

      Docstring of the class.

      __eq__

      Method docstring.

      __weakref__

      Method docstring.

      documented_method

      Method docstring.

      Docstring of the class.

      documented_method

      Method docstring.

      "},{"location":"usage/configuration/general/#show_bases","title":"show_basesSomeClass()SomeClass()","text":"
      • Type bool True

      Show the base classes of a class.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_bases: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.object\n    options:\n      show_bases: false\n

      Preview

      With basesWithout bases

      Bases: SomeBaseClass

      Docstring of the class.

      Docstring of the class.

      "},{"location":"usage/configuration/general/#show_source","title":"show_sourcesome_function()some_function()","text":"
      • Type bool True

      Show the source code of this object.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_source: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.object\n    options:\n      show_source: false\n

      Preview

      With sourceWithout source

      Docstring of the function.

      Source code in package/module.py
      def some_function():\n    ...\n

      Docstring of the function.

      "},{"location":"usage/configuration/general/#preload_modules","title":"preload_modulesyour_moduleyour_module","text":"
      • Type list[str] | None None

      Pre-load modules that are not specified directly in autodoc instructions (::: identifier). It is useful when you want to render documentation for a particular member of an object, and this member is imported from another package than its parent.

      For an imported member to be rendered, you need to add it to the __all__ attribute of the importing module. The package from which the imported object originates must be accessible to the handler (see Finding modules).

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          preload_modules:\n          - their_package\n
      or in docs/some_page.md (local configuration)
      ::: your_package.your_module\n    options:\n      preload_modules:\n      - their_package   \n
      your_package/your_module.py
      from their_package.their_module import their_object\n\n__all__ = [\"their_object\"]\n\n# rest of your code\n

      Preview

      With preloaded modulesWithout preloaded modules

      Docstring of your module.

      their_object

      Docstring of their object.

      Docstring of your module.

      "},{"location":"usage/configuration/headings/","title":"Headings options","text":""},{"location":"usage/configuration/headings/#heading_level","title":"heading_level","text":"
      • Type int 2

      The initial heading level to use.

      When injecting documentation for an object, the object itself and its members are rendered. For each layer of objects, we increase the heading level by 1.

      The initial heading level will be used for the first layer. If you set it to 3, then headings will start with <h3>.

      If the heading for the root object is not shown, then the initial heading level is used for its members.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          heading_level: 2\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      heading_level: 3\n

      Preview

      With level 3 and root headingWith level 3, without root heading module (3)

      Docstring of the module.

      ClassA (4)

      Docstring of class A.

      ClassB (4)

      Docstring of class B.

      method_1 (5)

      Docstring of the method.

      Docstring of the module.

      ClassA (3)

      Docstring of class A.

      ClassB (3)

      Docstring of class B.

      method_1 (4)

      Docstring of the method.

      "},{"location":"usage/configuration/headings/#show_root_heading","title":"show_root_headingClassA (2)ClassB (2)method_a1 (2)method_b1 (2)","text":"
      • Type bool False

      Show the heading of the object at the root of the documentation tree (i.e. the object referenced by the identifier after :::).

      It is pretty common to inject documentation for one module per page, especially when following our automatic reference pages recipe. Since each page already has a title, usually being the module's name, we can spare one heading level by not showing the heading for the module itself (heading levels are limited to 6 by the HTML specification).

      Sparing that extra level can be helpful when your objects tree is deeply nested (e.g. method in a class in a class in a module). If your objects tree is not deeply nested, and you are injecting documentation for many different objects on a single page, it might be preferable to render the heading of each object.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_root_heading: false\n
      or in docs/some_page.md (local configuration)
      ::: path.to.ClassA\n    options:\n      show_root_heading: true\n\n::: path.to.ClassB\n    options:\n      show_root_heading: true\n

      Preview

      With root headingWithout root heading

      Docstring of class A.

      method_a1 (3)

      Docstring of the method.

      Docstring of class B.

      method_b1 (3)

      Docstring of the method.

      Docstring of class A.

      Docstring of the method.

      Docstring of class B.

      Docstring of the method.

      "},{"location":"usage/configuration/headings/#show_root_toc_entry","title":"show_root_toc_entry","text":"
      • Type bool True

      If the root heading is not shown, at least add a ToC entry for it.

      If you inject documentation for an object in the middle of a page, after long paragraphs, and without showing the root heading, then you will not be able to link to this particular object as it won't have a permalink and will be \"lost\" in the middle of text. In that case, it is useful to add a hidden anchor to the document, which will also appear in the table of contents.

      In other cases, you might want to disable the entry to avoid polluting the ToC. It is not possible to show the root heading and hide the ToC entry.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_root_toc_entry: true\n
      or in docs/some_page.md (local configuration)
      ## Some heading\n\nLots of text.\n\n::: path.to.object\n    options:\n      show_root_toc_entry: false\n\n## Other heading.\n\nMore text.\n

      Preview

      With ToC entryWithout ToC entry

      Table of contents Some heading object Other heading

      Table of contents Some heading Other heading

      "},{"location":"usage/configuration/headings/#show_root_full_path","title":"show_root_full_pathpackage.module.Class.methodmethod","text":"
      • Type bool True

      Show the full Python path for the root object heading.

      The path of a Python object is the dot-separated list of names under which it is accessible, for example package.module.Class.method.

      With this option you can choose to show the full path of the object you inject documentation for, or just its name. This option impacts only the object you specify, not its members. For members, see the two other options show_root_members_full_path and show_object_full_path.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_root_full_path: true\n
      or in docs/some_page.md (local configuration)
      ::: package.module.Class.method\n    options:\n      show_root_full_path: false\n

      Preview

      With root full pathWithout root full path

      Docstring of the method.

      Docstring of the method.

      "},{"location":"usage/configuration/headings/#show_root_members_full_path","title":"show_root_members_full_pathpackage.module.ClassClass","text":"
      • Type bool False

      Show the full Python path of the root members.

      This option does the same thing as show_root_full_path, but for direct members of the root object instead of the root object itself.

      To show the full path for every member recursively, see show_object_full_path.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_root_members_full_path: true\n
      or in docs/some_page.md (local configuration)
      ::: package.module\n    options:\n      show_root_members_full_path: false\n

      Preview

      With members full pathWithout members full path

      Docstring of the module.

      Docstring of the class.

      method

      Docstring of the method.

      Docstring of the module.

      Docstring of the class.

      method

      Docstring of the method.

      "},{"location":"usage/configuration/headings/#show_object_full_path","title":"show_object_full_pathpackage.module.ClassClass","text":"
      • Type bool False

      Show the full Python path of every object.

      Same as for show_root_members_full_path, but for every member, recursively. This option takes precedence over show_root_members_full_path:

      show_root_members_full_path show_object_full_path Direct root members path False False Name only False True Full True False Full True True Full in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_object_full_path: true\n
      or in docs/some_page.md (local configuration)
      ::: package.module\n    options:\n      show_object_full_path: false\n

      Preview

      With objects full pathWithout objects full path

      Docstring of the module.

      Docstring of the class.

      package.module.Class.method

      Docstring of the method.

      Docstring of the module.

      Docstring of the class.

      method

      Docstring of the method.

      "},{"location":"usage/configuration/headings/#show_category_heading","title":"show_category_headingAttributes (2)Classes (2)module_attribute (2)Class (2)","text":"
      • Type bool False

      When grouped by categories, show a heading for each category. These category headings will appear in the table of contents, allowing you to link to them using their permalinks.

      Not recommended with deeply nested object

      When injecting documentation for deeply nested objects, you'll quickly run out of heading levels, and the objects at the bottom of the tree risk all getting documented using H6 headings, which might decrease the readability of your API docs.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          group_by_category: true\n          show_category_heading: true\n
      or in docs/some_page.md (local configuration)
      ::: package.module\n    options:\n      group_by_category: true\n      show_category_heading: false\n

      Preview

      With category headingsWithout category headings

      Docstring of the module.

      module_attribute (3)

      Docstring of the module attribute.

      Class (3)

      Docstring of the class.

      Attributes (4) class_attribute (5)

      Docstring of the class attribute.

      Methods (4) method (5)

      Docstring of the method.

      Docstring of the module.

      Docstring of the module attribute.

      Docstring of the class.

      class_attribute (3)

      Docstring of the class attribute.

      method (3)

      Docstring of the method.

      "},{"location":"usage/configuration/headings/#show_symbol_type_heading","title":"show_symbol_type_heading attribute function ClassattributefunctionClass","text":"

      Insiders 1.1.0

      • Type bool False

      Show the symbol type in headings.

      This option will prefix headings with , , , or types. See also show_symbol_type_toc.

      To customize symbols, see Customizing symbol types.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_symbol_type_heading: true\n
      or in docs/some_page.md (local configuration)
      ::: package.module\n    options:\n      show_symbol_type_heading: false\n

      Preview

      With symbol type in headingsWithout symbol type in headings module

      Docstring of the module.

      Docstring of the module attribute.

      Docstring of the function.

      Docstring of the class.

      method

      Docstring of the method.

      module

      Docstring of the module.

      Docstring of the module attribute.

      Docstring of the function.

      Docstring of the class.

      method

      Docstring of the method.

      "},{"location":"usage/configuration/headings/#show_symbol_type_toc","title":"show_symbol_type_toc","text":"

      Insiders 1.1.0

      • Type bool False

      Show the symbol type in the Table of Contents.

      This option will prefix items in the ToC with , , , or types. See also show_symbol_type_heading.

      To customize symbols, see Customizing symbol types.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_symbol_type_toc: true\n
      or in docs/some_page.md (local configuration)
      ::: package.module\n    options:\n      show_symbol_type_toc: false\n

      Preview

      With symbol type in ToCWithout symbol type in ToC
      • module
      • attribute
      • function
      • Class
        • method
      • module
      • attribute
      • function
      • Class
        • method
      "},{"location":"usage/configuration/members/","title":"Members options","text":""},{"location":"usage/configuration/members/#members","title":"membersthis_functionThisClassthis_attributeThisClass","text":"
      • Type list[str] | bool | None None

      An explicit list of members to render.

      Only members declared in this list will be rendered. A member without a docstring will still be rendered, even if show_if_no_docstring is set to false.

      The members will be rendered in the specified order, regardless of the value of members_order.

      Passing a falsy value (no, false in YAML) or an empty list ([]) will tell the Python handler not to render any member. Passing a truthy value (yes, true in YAML) will tell the Python handler to render every member.

      Any given value, except for an explicit None (null in YAML) will tell the handler to ignore filters for the object's members. Filters will still be applied to the next layers of members (grand-children).

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          members:\n          - hello  # (1)\n
      1. Most of the time it won't make sense to use this option at the global level.
      or in docs/some_page.md (local configuration)
      ::: package.module\n    options:\n      members:\n      - ThisClass\n      - this_function\n
      package/module.py
      \"\"\"Module docstring.\"\"\"\n\n\ndef this_function():\n    \"\"\"Function docstring.\"\"\"\n\n\nclass ThisClass:\n    \"\"\"Class docstring.\"\"\"\n\n    def method(self):\n        \"\"\"Method docstring.\"\"\"\n\n\nthis_attribute = 0\n\"\"\"Attribute docstring.\"\"\"\n

      Preview

      With members: trueWith members: false or members: []With members: [ThisClass]

      Module docstring.

      Function docstring.

      Class docstring.

      method

      Method docstring.

      Attribute docstring.

      Module docstring.

      Module docstring.

      Class docstring.

      method

      Method docstring.

      The default behavior (with unspecified members or members: null) is to use filters.

      "},{"location":"usage/configuration/members/#inherited_members","title":"inherited_membersBaseMainBaseMain","text":"
      • Type list[str] | bool False

      An explicit list of inherited members (for classes) to render.

      Inherited members are always fetched from classes that are in the same package as the currently rendered class. To fetch members inherited from base classes, themselves coming from external packages, use the preload_modules option. For example, if your class inherits from Pydantic's BaseModel, and you want to render BaseModel's methods in your class, use preload_modules: [pydantic]. The pydantic package must be available in the current environment.

      Passing a falsy value (no, false in YAML) or an empty list ([]) will tell the Python handler not to render any inherited member. Passing a truthy value (yes, true in YAML) will tell the Python handler to render every inherited member.

      When all inherited members are selected with inherited_members: true, it is possible to specify both members and inherited members in the members list:

      inherited_members: true\nmembers:\n- inherited_member_a\n- inherited_member_b\n- member_x\n- member_y\n

      The alternative is not supported:

      inherited_members:\n- inherited_member_a\n- inherited_member_b\nmembers:\n- member_x\n- member_y\n

      ...because it would make members ordering ambiguous/unspecified.

      You can render inherited members only by setting inherited_members: true (or a list of inherited members) and setting members: false:

      inherited_members: true\nmembers: false\n
      inherited_members:\n- inherited_member_a\n- inherited_member_b\nmembers: false\n

      You can render all declared members and all or specific inherited members by leaving members as null (default):

      inherited_members:\n- inherited_member_a\n- inherited_member_b\n# members: null  # (1)\n
      1. In this case, only declared members will be subject to further filtering with filters and docstrings.
      inherited_members: true  # (1)\n# members: null\n
      1. In this case, both declared and inherited members will be subject to further filtering with filters and docstrings.

      You can render all declared members and all or specific inherited members, avoiding further filtering with filters and docstrings by setting members: true:

      inherited_members: true\nmembers: true\n
      inherited_members:\n- inherited_member_a\n- inherited_member_b\nmembers: true\n

      The general rule is that declared or inherited members specified in lists are never filtered out.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          inherited_members: false\n
      or in docs/some_page.md (local configuration)
      ::: package.module\n    options:\n      inherited_members: true\n
      package/module.py
      \"\"\"Module docstring.\"\"\"\n\n\nclass Base:\n    \"\"\"Base class.\"\"\"\n\n    def base(self):\n        \"\"\"Base method.\"\"\"\n\n\nclass Main(Base):\n    \"\"\"Main class.\"\"\"\n\n    def main(self):\n        \"\"\"Main method.\"\"\"\n

      Preview

      With inherited membersWithout inherited members

      Module docstring.

      Base class.

      base

      Base method.

      Main class.

      base

      Base method.

      main

      Main method.

      Module docstring.

      Base class.

      base

      Base method.

      Main class.

      main

      Main method.

      "},{"location":"usage/configuration/members/#members_order","title":"members_orderfunction_afunction_bfunction_cfunction_bfunction_afunction_c","text":"
      • Type str \"alphabetical\"

      The members ordering to use. Possible values:

      • alphabetical: order by the members names.
      • source: order members as they appear in the source file.

      The order applies for all members, recursively. The order will be ignored for members that are explicitely sorted using the members option.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          members_order: alphabetical\n
      or in docs/some_page.md (local configuration)
      ::: package.module\n    options:\n      members_order: source\n
      package/module.py
      \"\"\"Module docstring.\"\"\"\n\n\ndef function_b():\n    \"\"\"Function a.\"\"\"\n\n\ndef function_a():\n    \"\"\"Function b.\"\"\"\n\n\ndef function_c():\n    \"\"\"Function c.\"\"\"\n

      Preview

      With alphabetical orderWith source order

      Module docstring.

      Function a.

      Function b.

      Function c.

      Module docstring.

      Function b.

      Function a.

      Function c.

      "},{"location":"usage/configuration/members/#filters","title":"filtershello_worldhello_world","text":"
      • Type list[str] | None [\"!^_[^_]\"]

      A list of filters applied to filter objects based on their name.

      Filters are regular expressions. These regular expressions are evaluated by Python and so must match the syntax supported by the re module. A filter starting with ! (negative filter) will exclude matching objects instead of including them.

      The default value ([\"!^_[^_]\"]) means: render every object, except those starting with one underscore, unless they start with two underscores. It means that an object whose name is hello, __hello, or __hello__ will be rendered, but not one whose name is _hello.

      Each filter takes precedence over the previous one. This allows for fine-grain selection of objects by adding more specific filters. For example, you can start by unselecting objects that start with _, and add a second filter that re-select objects that start with __. The default filters can therefore be rewritten like this:

      filters:\n- \"!^_\"\n- \"^__\"\n

      If there are no negative filters, the handler considers that everything is unselected first, and then selects things based on your positive filters. If there is at least one negative filter, the handler considers that everything is selected first, and then re-selects/unselects things based on your other filters. In short, filters: [\"a\"] means \"keep nothing except names containing a\", while filters: [\"!a\"] means \"keep everything except names containing a\".

      An empty list of filters tells the Python handler to render every object. The members option takes precedence over filters (filters will still be applied recursively to lower members in the hierarchy).

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          filters:\n          - \"!^_\"\n
      or in docs/some_page.md (local configuration)
      ::: package.module\n    options:\n      filters: []\n
      package/module.py
      def hello():\n    ...\n\n\ndef _world():\n    ...\n

      Preview

      With filters: []With filters: [\"hello\"]With filters: [\"!hello\"]

      Module docstring.

      Function docstring.

      Function docstring.

      Module docstring.

      Function docstring.

      Module docstring.

      Function docstring.

      Common filters

      Here are some common filters that you might to want to use.

      • [\"!^_\"]: exclude all private/protected/special objects
      • [\"!^_\", \"^__init__$\"]: same as above, but keep __init__ methods
      • [\"!^_[^_]\"]: exclude all private/protected objects, keep special ones (default filters)
      "},{"location":"usage/configuration/members/#group_by_category","title":"group_by_categoryattribute_cClassBfunction_afunction_dfunction_aClassBattribute_cfunction_d","text":"
      • Type bool True

      Group the object members by categories: attributes, classes, functions, and modules.

      Members within a same category will be ordered according to the members_order option. You can use the show_category_heading option to also render a heading for each category.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          group_by_category: true\n
      or in docs/some_page.md (local configuration)
      ::: package.module\n    options:\n      group_by_category: false\n
      package/module.py
      def function_a():\n    ...\n\n\nclass ClassB:\n    ...\n\n\nattribute_C = 0\n\n\ndef function_d():\n    ...\n

      Preview

      With category groupingWithout category grouping

      Module docstring.

      Attribute docstring.

      Class docstring.

      Function docstring.

      Function docstring.

      Module docstring.

      Function docstring.

      Class docstring.

      Attribute docstring.

      Function docstring.

      "},{"location":"usage/configuration/members/#show_submodules","title":"show_submodulessubpackage_membersubmodulesubpackage_member","text":"
      • Type bool False

      When rendering a module, show its submodules recursively.

      This is false by default, because most of the time we render only one module per page, and when rendering a package (a tree of modules and their members) on a single page, we quickly run out of heading levels.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_submodules: true\n
      or in docs/some_page.md (local configuration)
      ::: package.subpackage\n    options:\n      show_submodules: false\n
      package
      \ud83d\udcc1 package\n\u251c\u2500\u2500 \ud83d\udcc4 __init__.py\n\u2514\u2500\u2500 \ud83d\udcc1 subpackage\n    \u251c\u2500\u2500 \ud83d\udcc4 __init__.py\n    \u2514\u2500\u2500 \ud83d\udcc4 submodule.py\n

      Preview

      With submodulesWithout submodules

      Subpackage docstring.

      Member docstring.

      Submodule docstring.

      submodule_member

      Member docstring.

      Subpackage docstring.

      Member docstring.

      "},{"location":"usage/configuration/members/#summary","title":"summaryMyClassMyClass","text":"

      Sponsors only \u2014 Insiders 1.2.0

      • Type bool | dict[str, bool] False

      Whether to render summaries of modules, classes, functions (methods) and attributes.

      This option accepts a boolean (yes, true, no, false in YAML) or a dictionary with one or more of the following keys: attributes, functions, classes, modules, with booleans as values. Class methods summary is (de)activated with the functions key. By default, summary is false, and by extension all values are false.

      Examples:

      summary: true\n
      summary: false\n
      summary:\n  attributes: false\n  functions: true\n  modules: false\n

      Summaries will be rendered as the corresponding docstring sections. For example, the summary for attributes will be rendered as an Attributes docstring section. The section will be rendered in accordance with the docstring_section_style option. If the objects appearing in the summary are also rendered on the page (or somewhere else on the site), their name will automatically link to their rendered documentation.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          summary: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      summary: false\n

      Preview

      With all summariesWith methods summary only
      ::: path.to.module.MyClass\n    options:\n      summary: true\n

      Class docstring.

      Methods:

      • my_method1: Summary of the method (first docstring line).
      • my_method2: Summary of the method (first docstring line).

      Attributes:

      • attr1: Summary of the attribute (first docstring line).
      • attr2: Summary of the attribute (first docstring line).
      ::: path.to.module.MyClass\n    options:\n      summary:\n        functions: true\n

      Class docstring.

      Methods:

      • my_method1: Summary of the method (first docstring line).
      • my_method2: Summary of the method (first docstring line).
      "},{"location":"usage/configuration/signatures/","title":"Signatures options","text":""},{"location":"usage/configuration/signatures/#annotations_path","title":"annotations_pathconvert(text, md)convert(text, md)convert(text, md)","text":"
      • Type str \"brief\"

      The verbosity for annotations path.

      Possible values:

      • brief (recommended): render only the last component of each type path, not their full paths. For example, it will render Sequence[Path] and not typing.Sequence[pathlib.Path]. Brief annotations will cross-reference the right object anyway, and show the full path in a tooltip when hovering them.
      • source: render annotations as written in the source. For example if you imported typing as t, it will render typing.Sequence as t.Sequence. Each part will cross-reference the relevant object: t will link to the typing module and Sequence will link to the Sequence type.
      • full: render annotations with their full path (the opposite of brief). For example if you import Sequence and Pattern from typing and annoate something using Sequence[Pattern], it will render as typing.Sequence[typing.Pattern], with each part cross-referencing the corresponding object.
      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          annotations_path: brief\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      annotations_path: source\n

      Preview

      Brief annotationsSource annotationsFull annotations
      import markdown\nimport markupsafe\n\n\ndef convert(text: str, md: markdown.Markdown) -> markupsafe.Markup:\n    \"\"\"Convert text to Markdown.\n\n    Parameters:\n        text: The text to convert.\n        md: A Markdown instance.\n\n    Returns:\n        Converted markup.\n    \"\"\"\n    return markupsafe.Markup(md.convert(text))\n

      Convert text to Markdown.

      Parameters:

      Type Description Default str The text to convert. required Markdown A Markdown instance. required

      Returns:

      Type Name Description Markup text Converted markup.
      import markdown\nfrom markupsafe import Markup\n\n\ndef convert(text: str, md: markdown.Markdown) -> Markup:\n    \"\"\"Convert text to Markdown.\n\n    Parameters:\n        text: The text to convert.\n        md: A Markdown instance.\n\n    Returns:\n        Converted markup.\n    \"\"\"\n    return Markup(md.convert(text))\n

      Convert text to Markdown.

      Parameters:

      Type Description Default str The text to convert. required markdown.Markdown A Markdown instance. required

      Returns:

      Type Name Description Markup text Converted markup.
      from markdown import Markdown\nfrom markupsafe import Markup\n\n\ndef convert(text: str, md: Markdown) -> Markup:\n    \"\"\"Convert text to Markdown.\n\n    Parameters:\n        text: The text to convert.\n        md: A Markdown instance.\n\n    Returns:\n        Converted markup.\n    \"\"\"\n    return Markup(md.convert(text))\n

      Convert text to Markdown.

      Parameters:

      Type Description Default str The text to convert. required markdown.Markdown A Markdown instance. required

      Returns:

      Type Name Description markupsafe.Markup text Converted markup."},{"location":"usage/configuration/signatures/#line_length","title":"line_lengthlong_function_namelong_function_name","text":"
      • Type int 60

      Maximum line length when formatting code/signatures.

      When separating signatures from headings with the separate_signature option, the Python handler will try to format the signatures using Black and the specified line length.

      If Black is not installed, the handler issues an INFO log once.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          separate_signature: true\n          line_length: 60\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      separate_signature: true\n      line_length: 80\n

      Preview

      Line length 60Line length 80
      long_function_name(\n    long_parameter_1=\"hello\",\n    long_parameter_2=\"world\",\n)
      long_function_name(long_parameter_1=\"hello\", long_parameter_2=\"world\")
      "},{"location":"usage/configuration/signatures/#show_signature","title":"show_signaturefunction(param1, param2=None)function","text":"
      • Type bool True

      Show methods and functions signatures.

      Without it, just the function/method name is rendered.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          show_signature: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      show_signature: false\n

      Preview

      With signatureWithout signature

      Function docstring.

      Function docstring.

      "},{"location":"usage/configuration/signatures/#show_signature_annotations","title":"show_signature_annotationsfunctionfunction","text":"
      • Type bool False

      Show the type annotations in methods and functions signatures.

      Since the heading can become quite long when annotations are rendered, it is usually best to separate the signature from the heading.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          separate_signature: true\n          show_signature_annotations: true\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      separate_signature: true\n      show_signature_annotations: false\n

      Preview

      With signature annotationsWithout signature annotations
      function(\n    param1: list[int | float],\n    param2: bool | None = None,\n) -> float\n

      Function docstring.

      function(param1, param2=None)\n

      Function docstring.

      "},{"location":"usage/configuration/signatures/#separate_signature","title":"separate_signaturefunctionfunction(param1, param2=None)","text":"
      • Type bool False

      Whether to put the whole signature in a code block below the heading.

      When separating signatures from headings, the Python handler will try to format the signatures using Black and the specified line length.

      If Black is not installed, the handler issues an INFO log once.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          separate_signature: false\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      separate_signature: true\n

      Preview

      With separate signatureWithout separate signature
      function(param1, param2=None)\n

      Function docstring.

      Function docstring.

      "},{"location":"usage/configuration/signatures/#signature_crossrefs","title":"signature_crossrefsdo_format_codedo_format_code","text":"

      Insiders 1.0.0

      Whether to render cross-references for type annotations in signatures.

      When signatures are separated from headings with the separate_signature option and type annotations are shown with the show_signature_annotations option, this option will render a cross-reference (link) for each type annotation in the signature.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          separate_signature: true\n          show_signature_annotations: true\n          signature_crossrefs: false\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      separate_signature: true\n      show_signature_annotations: true\n      signature_crossrefs: true\n

      Preview

      With signature cross-referencesWithout signature cross-references
      do_format_code(code: str, line_length: int) -> str\n

      Function docstring.

      do_format_code(code: str, line_length: int) -> str\n

      Function docstring.

      "},{"location":"usage/configuration/signatures/#unwrap_annotated","title":"unwrap_annotated","text":"
      • Type bool False

      Whether to unwrap Annotated types to show only the type without the annotations.

      For example, unwrapping Annotated[int, Gt(10)] will render int.

      in mkdocs.yml (global configuration)
      plugins:\n- mkdocstrings:\n    handlers:\n      python:\n        options:\n          unwrap_annotated: false\n
      or in docs/some_page.md (local configuration)
      ::: path.to.module\n    options:\n      unwrap_annotated: true\n
      "},{"location":"usage/docstrings/google/","title":"Google style","text":""},{"location":"usage/docstrings/google/#work-in-progress","title":"Work in Progress!","text":""},{"location":"usage/docstrings/google/#google-style-admonitions","title":"Google-style admonitions","text":"

      With Google-style docstrings, any section that is not recognized will be transformed into its admonition equivalent. For example:

      DocstringResult
      \"\"\"\nNote:\n    It looks like a section, but it will be rendered as an admonition.\n\nTip: You can even choose a title.\n    This admonition has a custom title!\n\"\"\"\n

      Note

      It looks like a section, but it will be rendered as an admonition.

      You can even choose a title.

      This admonition has a custom title!

      See Napoleon's documentation. See the supported docstring sections on Griffe's documentation.

      "},{"location":"usage/docstrings/numpy/","title":"Numpydoc style","text":""},{"location":"usage/docstrings/numpy/#work-in-progress","title":"Work in Progress!","text":"

      Note

      As Numpy-style is partially supported by the underlying parser, you may experience problems in the building process if your docstring has a Methods section in the class docstring (see #366).

      See Numpydoc's documentation. See the supported docstring sections on Griffe's documentation.

      "},{"location":"usage/docstrings/sphinx/","title":"Sphinx style","text":""},{"location":"usage/docstrings/sphinx/#work-in-progress","title":"Work in Progress!","text":"

      See Sphinx's documentation. See the supported docstring sections on Griffe's documentation.

      "}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 1a95a737..ba0a5f7e 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,127 +2,127 @@ https://mkdocstrings.github.io/python/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/changelog/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/code_of_conduct/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/contributing/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/credits/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/license/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/insiders/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/insiders/changelog/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/insiders/installation/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/reference/SUMMARY/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/reference/mkdocstrings_handlers/python/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/reference/mkdocstrings_handlers/python/debug/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/reference/mkdocstrings_handlers/python/handler/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/reference/mkdocstrings_handlers/python/rendering/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/usage/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/usage/customization/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/usage/extensions/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/usage/configuration/docstrings/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/usage/configuration/general/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/usage/configuration/headings/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/usage/configuration/members/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/usage/configuration/signatures/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/usage/docstrings/google/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/usage/docstrings/numpy/ - 2023-11-21 + 2024-01-08 daily https://mkdocstrings.github.io/python/usage/docstrings/sphinx/ - 2023-11-21 + 2024-01-08 daily \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 7e0e254bb955707344beae0a558724e34ea0c0dc..55d1b2dbaf07bcd61405dd26d1b1188a8710f06e 100644 GIT binary patch literal 424 zcmV;Z0ayMXiwFo@B%Eae|8r?{Wo=<_E_iKh0Ns|cPQx$|hIgK#%HBAw7z#>Lv9NUk zIxtnPeRV7xJNVAD<>_&os$^h5NJw$L#6JHye|M7aTrT#F8GV39?d&|8afYRW9@-zXIaUP+WxN`sd2KJ7Sr2tF&P)LC^_4D zGEsA@VC&(%l3bfZ$$FNKiCv)nj@LOgP7NN^Nm#q>S~x3%pyA`%xU~rsw+GMaL2AOG zV;U{MA`BftPE%wj^NBtL5_H=`|hTzHS|llIEEF zH2T^vqmZx(>PlicudgJUD2aDHf$kZQD@X%U1SHq!&m;2mA!FW7C>n#7Pc-x z2d2ukFOG#{2j7{tJUwnxl?)6B2`R3Z*ylgz?@scai{-vC;}7tton2(Je435H3MaKy zi){V!IJwQ1<){eWAka99EiST}sJ&-wx7+2Y2^!vF?!00s>bO95HnM4cmzAS&97hM; z>@*7FM0xar(M|Ivoj~&ONX(U{I&5?8SbLz_Syr&4w*M+}Z|;+knn*SO5$BlpnC@73etcS0m(J`Gl|04A;X?x(~r2ANQ#}Uv%td-qd0rwk;AZ9~%@lB349)^`8@ R*ryKym0#D^yeTLW002GR(yIUf diff --git a/usage/configuration/docstrings/index.html b/usage/configuration/docstrings/index.html index 755c47f2..28146b4c 100644 --- a/usage/configuration/docstrings/index.html +++ b/usage/configuration/docstrings/index.html @@ -1,4 +1,4 @@ - Docstrings - mkdocstrings-python

      Docstrings options¤

      docstring_style¤

      • Type str "google"

      The docstring style to expect when parsing docstrings.

      Possible values:

      in mkdocs.yml (global configuration)
      plugins:
      + Docstrings - mkdocstrings-python      

      Docstrings options¤

      docstring_style¤

      • Type str "google"

      The docstring style to expect when parsing docstrings.

      Possible values:

      in mkdocs.yml (global configuration)
      plugins:
       - mkdocstrings:
           handlers:
             python:
      @@ -368,4 +368,4 @@
                   skip -= 1
               else:
                   skip = yield element
      -

      Preview

      iter_skip

      Iterate and skip elements.

      Yields:

      Type Description
      T Elements of the iterable.

      iter_skip

      Iterate and skip elements.

      \ No newline at end of file +

      Preview

      iter_skip

      Iterate and skip elements.

      Yields:

      Type Description
      T Elements of the iterable.

      iter_skip

      Iterate and skip elements.

      \ No newline at end of file diff --git a/usage/configuration/general/index.html b/usage/configuration/general/index.html index ac98710d..6ce64106 100644 --- a/usage/configuration/general/index.html +++ b/usage/configuration/general/index.html @@ -1,4 +1,4 @@ - General - mkdocstrings-python

      General options¤

      allow_inspection¤

      Whether to allow inspecting modules (importing them) when it is not possible to visit them (parse their source code).

      When loading data for a given package, Griffe discovers every Python module, compiled or not, and inspects or visits them accordingly.

      If you have compiled modules but also provide stubs for them, you might want to disable the inspection of these modules, because inspection picks up many more members, and sometimes the collected data is inaccurate (depending on the tool that was used to compile the module) or too low-level/technical for API documentation.

      in mkdocs.yml (global configuration)
      plugins:
      + General - mkdocstrings-python      

      General options¤

      allow_inspection¤

      Whether to allow inspecting modules (importing them) when it is not possible to visit them (parse their source code).

      When loading data for a given package, Griffe discovers every Python module, compiled or not, and inspects or visits them accordingly.

      If you have compiled modules but also provide stubs for them, you might want to disable the inspection of these modules, because inspection picks up many more members, and sometimes the collected data is inaccurate (depending on the tool that was used to compile the module) or too low-level/technical for API documentation.

      in mkdocs.yml (global configuration)
      plugins:
       - mkdocstrings:
           handlers:
             python:
      @@ -44,4 +44,4 @@
       __all__ = ["their_object"]
       
       # rest of your code
      -

      Preview

      your_module

      Docstring of your module.

      their_object

      Docstring of their object.

      your_module

      Docstring of your module.

      \ No newline at end of file +

      Preview

      your_module

      Docstring of your module.

      their_object

      Docstring of their object.

      your_module

      Docstring of your module.

      \ No newline at end of file diff --git a/usage/configuration/headings/index.html b/usage/configuration/headings/index.html index 123d413c..3a5a28b8 100644 --- a/usage/configuration/headings/index.html +++ b/usage/configuration/headings/index.html @@ -1,4 +1,4 @@ - Headings - mkdocstrings-python

      Headings options¤

      heading_level¤

      The initial heading level to use.

      When injecting documentation for an object, the object itself and its members are rendered. For each layer of objects, we increase the heading level by 1.

      The initial heading level will be used for the first layer. If you set it to 3, then headings will start with <h3>.

      If the heading for the root object is not shown, then the initial heading level is used for its members.

      in mkdocs.yml (global configuration)
      plugins:
      + Headings - mkdocstrings-python      

      Headings options¤

      heading_level¤

      The initial heading level to use.

      When injecting documentation for an object, the object itself and its members are rendered. For each layer of objects, we increase the heading level by 1.

      The initial heading level will be used for the first layer. If you set it to 3, then headings will start with <h3>.

      If the heading for the root object is not shown, then the initial heading level is used for its members.

      in mkdocs.yml (global configuration)
      plugins:
       - mkdocstrings:
           handlers:
             python:
      @@ -75,7 +75,7 @@
           options:
             group_by_category: true
             show_category_heading: false
      -

      Preview

      Docstring of the module.

      Attributes (2)

      module_attribute (3)

      Docstring of the module attribute.

      Classes (2)

      Class (3)

      Docstring of the class.

      Attributes (4)

      class_attribute (5)

      Docstring of the class attribute.

      Methods (4)

      method (5)

      Docstring of the method.

      Docstring of the module.

      module_attribute (2)

      Docstring of the module attribute.

      Class (2)

      Docstring of the class.

      class_attribute (3)

      Docstring of the class attribute.

      method (3)

      Docstring of the method.

      show_symbol_type_heading¤

      Sponsors only Insiders 1.1.0

      Show the symbol type in headings.

      This option will prefix headings with , , , or types. See also show_symbol_type_toc.

      To customize symbols, see Customizing symbol types.

      in mkdocs.yml (global configuration)
      plugins:
      +

      Preview

      Docstring of the module.

      Attributes (2)

      module_attribute (3)

      Docstring of the module attribute.

      Classes (2)

      Class (3)

      Docstring of the class.

      Attributes (4)

      class_attribute (5)

      Docstring of the class attribute.

      Methods (4)

      method (5)

      Docstring of the method.

      Docstring of the module.

      module_attribute (2)

      Docstring of the module attribute.

      Class (2)

      Docstring of the class.

      class_attribute (3)

      Docstring of the class attribute.

      method (3)

      Docstring of the method.

      show_symbol_type_heading¤

      Insiders 1.1.0

      Show the symbol type in headings.

      This option will prefix headings with , , , or types. See also show_symbol_type_toc.

      To customize symbols, see Customizing symbol types.

      in mkdocs.yml (global configuration)
      plugins:
       - mkdocstrings:
           handlers:
             python:
      @@ -84,7 +84,7 @@
       
      or in docs/some_page.md (local configuration)
      ::: package.module
           options:
             show_symbol_type_heading: false
      -

      Preview

      module

      Docstring of the module.

      attribute

      Docstring of the module attribute.

      function

      Docstring of the function.

      Class

      Docstring of the class.

      method

      Docstring of the method.

      module

      Docstring of the module.

      attribute

      Docstring of the module attribute.

      function

      Docstring of the function.

      Class

      Docstring of the class.

      method

      Docstring of the method.

      show_symbol_type_toc¤

      Sponsors only Insiders 1.1.0

      Show the symbol type in the Table of Contents.

      This option will prefix items in the ToC with , , , or types. See also show_symbol_type_heading.

      To customize symbols, see Customizing symbol types.

      in mkdocs.yml (global configuration)
      plugins:
      +

      Preview

      module

      Docstring of the module.

      attribute

      Docstring of the module attribute.

      function

      Docstring of the function.

      Class

      Docstring of the class.

      method

      Docstring of the method.

      module

      Docstring of the module.

      attribute

      Docstring of the module attribute.

      function

      Docstring of the function.

      Class

      Docstring of the class.

      method

      Docstring of the method.

      show_symbol_type_toc¤

      Insiders 1.1.0

      Show the symbol type in the Table of Contents.

      This option will prefix items in the ToC with , , , or types. See also show_symbol_type_heading.

      To customize symbols, see Customizing symbol types.

      in mkdocs.yml (global configuration)
      plugins:
       - mkdocstrings:
           handlers:
             python:
      @@ -93,4 +93,4 @@
       
      or in docs/some_page.md (local configuration)
      ::: package.module
           options:
             show_symbol_type_toc: false
      -

      Preview

      • module
      • attribute
      • function
      • Class
        • method
      • module
      • attribute
      • function
      • Class
        • method
      \ No newline at end of file +

      Preview

      • module
      • attribute
      • function
      • Class
        • method
      • module
      • attribute
      • function
      • Class
        • method
      \ No newline at end of file diff --git a/usage/configuration/members/index.html b/usage/configuration/members/index.html index a1ab1670..1af8137f 100644 --- a/usage/configuration/members/index.html +++ b/usage/configuration/members/index.html @@ -1,11 +1,11 @@ - Members - mkdocstrings-python

      Members options¤

      members¤

      An explicit list of members to render.

      Only members declared in this list will be rendered. A member without a docstring will still be rendered, even if show_if_no_docstring is set to false.

      The members will be rendered in the specified order, regardless of the value of members_order.

      Passing a falsy value (no, false in YAML) or an empty list ([]) will tell the Python handler not to render any member. Passing a truthy value (yes, true in YAML) will tell the Python handler to render every member.

      Any given value, except for an explicit None (null in YAML) will tell the handler to ignore filters for the object's members. Filters will still be applied to the next layers of members (grand-children).

      in mkdocs.yml (global configuration)
      plugins:
      + Members - mkdocstrings-python      

      Members options¤

      members¤

      An explicit list of members to render.

      Only members declared in this list will be rendered. A member without a docstring will still be rendered, even if show_if_no_docstring is set to false.

      The members will be rendered in the specified order, regardless of the value of members_order.

      Passing a falsy value (no, false in YAML) or an empty list ([]) will tell the Python handler not to render any member. Passing a truthy value (yes, true in YAML) will tell the Python handler to render every member.

      Any given value, except for an explicit None (null in YAML) will tell the handler to ignore filters for the object's members. Filters will still be applied to the next layers of members (grand-children).

      in mkdocs.yml (global configuration)
      plugins:
       - mkdocstrings:
           handlers:
             python:
               options:
                 members:
                 - hello  # (1)
      -
      1. ⚠ Most of the time it won't make sense to use this option at the global level.
      or in docs/some_page.md (local configuration)
      ::: package.module
      +
      1. ⚠ Most of the time it won't make sense to use this option at the global level.
      or in docs/some_page.md (local configuration)
      ::: package.module
           options:
             members:
             - ThisClass
      @@ -179,4 +179,4 @@
           options:
             summary:
               functions: true
      -

      MyClass

      Class docstring.

      Methods:

      • my_method1: Summary of the method (first docstring line).
      • my_method2: Summary of the method (first docstring line).
      \ No newline at end of file +

      MyClass

      Class docstring.

      Methods:

      • my_method1: Summary of the method (first docstring line).
      • my_method2: Summary of the method (first docstring line).
      \ No newline at end of file diff --git a/usage/configuration/signatures/index.html b/usage/configuration/signatures/index.html index 9ca0b0db..637dc77f 100644 --- a/usage/configuration/signatures/index.html +++ b/usage/configuration/signatures/index.html @@ -1,4 +1,4 @@ - Signatures - mkdocstrings-python

      Signatures options¤

      annotations_path¤

      • Type str "brief"

      The verbosity for annotations path.

      Possible values:

      • brief (recommended): render only the last component of each type path, not their full paths. For example, it will render Sequence[Path] and not typing.Sequence[pathlib.Path]. Brief annotations will cross-reference the right object anyway, and show the full path in a tooltip when hovering them.
      • source: render annotations as written in the source. For example if you imported typing as t, it will render typing.Sequence as t.Sequence. Each part will cross-reference the relevant object: t will link to the typing module and Sequence will link to the Sequence type.
      • full: render annotations with their full path (the opposite of brief). For example if you import Sequence and Pattern from typing and annoate something using Sequence[Pattern], it will render as typing.Sequence[typing.Pattern], with each part cross-referencing the corresponding object.
      in mkdocs.yml (global configuration)
      plugins:
      + Signatures - mkdocstrings-python      

      Signatures options¤

      annotations_path¤

      • Type str "brief"

      The verbosity for annotations path.

      Possible values:

      • brief (recommended): render only the last component of each type path, not their full paths. For example, it will render Sequence[Path] and not typing.Sequence[pathlib.Path]. Brief annotations will cross-reference the right object anyway, and show the full path in a tooltip when hovering them.
      • source: render annotations as written in the source. For example if you imported typing as t, it will render typing.Sequence as t.Sequence. Each part will cross-reference the relevant object: t will link to the typing module and Sequence will link to the Sequence type.
      • full: render annotations with their full path (the opposite of brief). For example if you import Sequence and Pattern from typing and annoate something using Sequence[Pattern], it will render as typing.Sequence[typing.Pattern], with each part cross-referencing the corresponding object.
      in mkdocs.yml (global configuration)
      plugins:
       - mkdocstrings:
           handlers:
             python:
      @@ -101,7 +101,7 @@
           options:
             separate_signature: true
       

      Preview

      function

      function(param1, param2=None)
      -

      Function docstring.

      function(param1, param2=None)

      Function docstring.

      signature_crossrefs¤

      Sponsors only Insiders 1.0.0

      Whether to render cross-references for type annotations in signatures.

      When signatures are separated from headings with the separate_signature option and type annotations are shown with the show_signature_annotations option, this option will render a cross-reference (link) for each type annotation in the signature.

      in mkdocs.yml (global configuration)
      plugins:
      +

      Function docstring.

      function(param1, param2=None)

      Function docstring.

      signature_crossrefs¤

      Insiders 1.0.0

      Whether to render cross-references for type annotations in signatures.

      When signatures are separated from headings with the separate_signature option and type annotations are shown with the show_signature_annotations option, this option will render a cross-reference (link) for each type annotation in the signature.

      in mkdocs.yml (global configuration)
      plugins:
       - mkdocstrings:
           handlers:
             python:
      @@ -125,4 +125,4 @@
       
      or in docs/some_page.md (local configuration)
      ::: path.to.module
           options:
             unwrap_annotated: true
      -
      \ No newline at end of file +
      \ No newline at end of file diff --git a/usage/customization/index.html b/usage/customization/index.html index 2b1b8b3d..3a948f04 100644 --- a/usage/customization/index.html +++ b/usage/customization/index.html @@ -1,4 +1,4 @@ - Customization - mkdocstrings-python

      Customization¤

      It is possible to customize the output of the generated documentation with CSS and/or by overriding templates.

      CSS classes¤

      The following CSS classes are used in the generated HTML:

      • doc: on all the following elements
      • doc-children: on divs containing the children of an object
      • doc-object: on divs containing an object
        • doc-attribute: on divs containing an attribute
        • doc-class: on divs containing a class
        • doc-function: on divs containing a function
        • doc-module: on divs containing a module
      • doc-heading: on objects headings
        • doc-object-name: on spans wrapping objects names/paths in the heading
          • doc-KIND-name: as above, specific to the kind of object (module, class, function, attribute)
      • doc-contents: on divs wrapping the docstring then the children (if any)
        • first: same, but only on the root object's contents div
      • doc-labels: on spans wrapping the object's labels
        • doc-label: on small elements containing a label
          • doc-label-LABEL: same, where LABEL is replaced by the actual label
      • doc-md-description: on divs containing HTML descriptions converted from Markdown docstrings
      • doc-symbol: on code tags of symbol types
        • doc-symbol-heading: on symbol types in headings
        • doc-symbol-toc: on symbol types in the ToC
        • doc-symbol-KIND: specific to the kind of object (module, class, function, method, attribute)

      Example with colorful labels

      .doc-label { border-radius: 15px; padding: 2px 8px; font-weight: bold; }
      + Customization - mkdocstrings-python      

      Customization¤

      It is possible to customize the output of the generated documentation with CSS and/or by overriding templates.

      CSS classes¤

      The following CSS classes are used in the generated HTML:

      • doc: on all the following elements
      • doc-children: on divs containing the children of an object
      • doc-object: on divs containing an object
        • doc-attribute: on divs containing an attribute
        • doc-class: on divs containing a class
        • doc-function: on divs containing a function
        • doc-module: on divs containing a module
      • doc-heading: on objects headings
        • doc-object-name: on spans wrapping objects names/paths in the heading
          • doc-KIND-name: as above, specific to the kind of object (module, class, function, attribute)
      • doc-contents: on divs wrapping the docstring then the children (if any)
        • first: same, but only on the root object's contents div
      • doc-labels: on spans wrapping the object's labels
        • doc-label: on small elements containing a label
          • doc-label-LABEL: same, where LABEL is replaced by the actual label
      • doc-md-description: on divs containing HTML descriptions converted from Markdown docstrings
      • doc-symbol: on code tags of symbol types
        • doc-symbol-heading: on symbol types in headings
        • doc-symbol-toc: on symbol types in the ToC
        • doc-symbol-KIND: specific to the kind of object (module, class, function, method, attribute)

      Example with colorful labels

      .doc-label { border-radius: 15px; padding: 2px 8px; font-weight: bold; }
       .doc-label-special { background-color: #3330E4; color: white; }
       .doc-label-private { background-color: #F637EC; color: white; }
       .doc-label-property { background-color: #FBB454; color: black; }
      @@ -185,4 +185,4 @@
         padding-left: 25px;
         border-left: .05rem solid rgba(200, 200, 200, 0.2);
       }
      -
      \ No newline at end of file +
      \ No newline at end of file diff --git a/usage/docstrings/google/index.html b/usage/docstrings/google/index.html index a71053e2..3279e85e 100644 --- a/usage/docstrings/google/index.html +++ b/usage/docstrings/google/index.html @@ -1,8 +1,8 @@ - Google - mkdocstrings-python

      Google style¤

      ⚠ Work in Progress!¤

      Google-style admonitions¤

      With Google-style docstrings, any section that is not recognized will be transformed into its admonition equivalent. For example:

      """
      + Google - mkdocstrings-python      

      Google style¤

      ⚠ Work in Progress!¤

      Google-style admonitions¤

      With Google-style docstrings, any section that is not recognized will be transformed into its admonition equivalent. For example:

      """
       Note:
           It looks like a section, but it will be rendered as an admonition.
       
       Tip: You can even choose a title.
           This admonition has a custom title!
       """
      -

      Note

      It looks like a section, but it will be rendered as an admonition.

      You can even choose a title.

      This admonition has a custom title!

      See Napoleon's documentation. See the supported docstring sections on Griffe's documentation.

      \ No newline at end of file +

      Note

      It looks like a section, but it will be rendered as an admonition.

      You can even choose a title.

      This admonition has a custom title!

      See Napoleon's documentation. See the supported docstring sections on Griffe's documentation.

      \ No newline at end of file diff --git a/usage/docstrings/numpy/index.html b/usage/docstrings/numpy/index.html index 17589168..c5ba5ab4 100644 --- a/usage/docstrings/numpy/index.html +++ b/usage/docstrings/numpy/index.html @@ -1 +1 @@ - Numpy - mkdocstrings-python

      Numpydoc style¤

      ⚠ Work in Progress!¤

      Note

      As Numpy-style is partially supported by the underlying parser, you may experience problems in the building process if your docstring has a Methods section in the class docstring (see #366).

      See Numpydoc's documentation. See the supported docstring sections on Griffe's documentation.

      \ No newline at end of file + Numpy - mkdocstrings-python

      Numpydoc style¤

      ⚠ Work in Progress!¤

      Note

      As Numpy-style is partially supported by the underlying parser, you may experience problems in the building process if your docstring has a Methods section in the class docstring (see #366).

      See Numpydoc's documentation. See the supported docstring sections on Griffe's documentation.

      \ No newline at end of file diff --git a/usage/docstrings/sphinx/index.html b/usage/docstrings/sphinx/index.html index 14ca8ef0..7672ed2e 100644 --- a/usage/docstrings/sphinx/index.html +++ b/usage/docstrings/sphinx/index.html @@ -1 +1 @@ - Sphinx - mkdocstrings-python
      \ No newline at end of file + Sphinx - mkdocstrings-python
      \ No newline at end of file diff --git a/usage/extensions/index.html b/usage/extensions/index.html index 73f2bd21..f2f451bf 100644 --- a/usage/extensions/index.html +++ b/usage/extensions/index.html @@ -1,5 +1,5 @@ - Extensions - mkdocstrings-python

      Extensions¤

      ⚠ Work in Progress!¤

      The Python handler supports extensions through mkdocstrings' handler extensions.

      Specifically, additional templates can be added to the handler, and Griffe extensions can instruct the handler to use a particular template for a particular object by setting a value in the Griffe object's extra dictionary:

      griffe_extension.py
      obj = ...  # get a reference to a Griffe object
      + Extensions - mkdocstrings-python      

      Extensions¤

      ⚠ Work in Progress!¤

      The Python handler supports extensions through mkdocstrings' handler extensions.

      Specifically, additional templates can be added to the handler, and Griffe extensions can instruct the handler to use a particular template for a particular object by setting a value in the Griffe object's extra dictionary:

      griffe_extension.py
      obj = ...  # get a reference to a Griffe object
       if "mkdocstrings" not in obj.extra:
           obj.extra["mkdocstrings"] = {}
       obj.extra["mkdocstrings"]["template"] = "template_name.html"
      -
      \ No newline at end of file +
      \ No newline at end of file diff --git a/usage/index.html b/usage/index.html index ea75813f..578381cc 100644 --- a/usage/index.html +++ b/usage/index.html @@ -1,14 +1,14 @@ - Usage - mkdocstrings-python

      Usage¤

      This is the documentation for the NEW Python handler.

      To read the documentation for the LEGACY handler, go to the legacy handler documentation.

      Installation¤

      You can install this handler as a mkdocstrings extra:

      pyproject.toml
      # PEP 621 dependencies declaration
      + Usage - mkdocstrings-python      

      Usage¤

      This is the documentation for the NEW Python handler.

      To read the documentation for the LEGACY handler, go to the legacy handler documentation.

      Installation¤

      You can install this handler as a mkdocstrings extra:

      pyproject.toml
      # PEP 621 dependencies declaration
       # adapt to your dependencies manager
       [project]
       dependencies = [
      -    "mkdocstrings[python]>=0.18",
      +    "mkdocstrings[python]>=0.18",
       ]
       

      You can also explicitly depend on the handler:

      pyproject.toml
      # PEP 621 dependencies declaration
       # adapt to your dependencies manager
       [project]
       dependencies = [
      -    "mkdocstrings-python",
      +    "mkdocstrings-python",
       ]
       

      The Python handler is the default mkdocstrings handler. You can change the default handler, or explicitely set the Python handler as default by defining the default_handler configuration option of mkdocstrings in mkdocs.yml:

      mkdocs.yml
      plugins:
       - mkdocstrings:
      @@ -116,4 +116,4 @@
       pdm run mkdocs build
       
      poetry install
       poetry run mkdocs build
      -
      \ No newline at end of file +
      \ No newline at end of file