(()=>{var Ni=Object.create,mt=Object.defineProperty;var zi=Object.getOwnPropertyDescriptor;var qi=Object.getOwnPropertyNames,dt=Object.getOwnPropertySymbols,Qi=Object.getPrototypeOf,Zt=Object.prototype.hasOwnProperty,Rr=Object.prototype.propertyIsEnumerable;var Pr=(e,t,r)=>t in e?mt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,V=(e,t)=>{for(var r in t||(t={}))Zt.call(t,r)&&Pr(e,r,t[r]);if(dt)for(var r of dt(t))Rr.call(t,r)&&Pr(e,r,t[r]);return e};var Ki=e=>mt(e,"__esModule",{value:!0});var $r=(e,t)=>{var r={};for(var o in e)Zt.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&&Rr.call(e,o)&&(r[o]=e[o]);return r};var ht=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Bi=(e,t,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of qi(t))!Zt.call(e,o)&&o!=="default"&&mt(e,o,{get:()=>t[o],enumerable:!(r=zi(t,o))||r.enumerable});return e},Xe=e=>Bi(Ki(mt(e!=null?Ni(Qi(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);var Wr=ht((er,Vr)=>{(function(e,t){typeof er=="object"&&typeof Vr!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(er,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(_){return!!(_&&_!==document&&_.nodeName!=="HTML"&&_.nodeName!=="BODY"&&"classList"in _&&"contains"in _.classList)}function c(_){var ut=_.type,pt=_.tagName;return!!(pt==="INPUT"&&a[ut]&&!_.readOnly||pt==="TEXTAREA"&&!_.readOnly||_.isContentEditable)}function l(_){_.classList.contains("focus-visible")||(_.classList.add("focus-visible"),_.setAttribute("data-focus-visible-added",""))}function u(_){!_.hasAttribute("data-focus-visible-added")||(_.classList.remove("focus-visible"),_.removeAttribute("data-focus-visible-added"))}function m(_){_.metaKey||_.altKey||_.ctrlKey||(s(r.activeElement)&&l(r.activeElement),o=!0)}function p(_){o=!1}function h(_){!s(_.target)||(o||c(_.target))&&l(_.target)}function g(_){!s(_.target)||(_.target.classList.contains("focus-visible")||_.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),u(_.target))}function b(_){document.visibilityState==="hidden"&&(n&&(o=!0),N())}function N(){document.addEventListener("mousemove",H),document.addEventListener("mousedown",H),document.addEventListener("mouseup",H),document.addEventListener("pointermove",H),document.addEventListener("pointerdown",H),document.addEventListener("pointerup",H),document.addEventListener("touchmove",H),document.addEventListener("touchstart",H),document.addEventListener("touchend",H)}function $(){document.removeEventListener("mousemove",H),document.removeEventListener("mousedown",H),document.removeEventListener("mouseup",H),document.removeEventListener("pointermove",H),document.removeEventListener("pointerdown",H),document.removeEventListener("pointerup",H),document.removeEventListener("touchmove",H),document.removeEventListener("touchstart",H),document.removeEventListener("touchend",H)}function H(_){_.target.nodeName&&_.target.nodeName.toLowerCase()==="html"||(o=!1,$())}document.addEventListener("keydown",m,!0),document.addEventListener("mousedown",p,!0),document.addEventListener("pointerdown",p,!0),document.addEventListener("touchstart",p,!0),document.addEventListener("visibilitychange",b,!0),N(),r.addEventListener("focus",h,!0),r.addEventListener("blur",g,!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 so=ht((Ga,gt)=>{var Ur,Dr,Nr,zr,qr,Qr,Kr,Br,Jr,bt,tr,Yr,Gr,Xr,$e,Zr,eo,to,ro,oo,no,io,ao,vt;(function(e){var t=typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(o){e(r(t,r(o)))}):typeof gt=="object"&&typeof gt.exports=="object"?e(r(t,r(gt.exports))):e(r(t));function r(o,n){return o!==t&&(typeof Object.create=="function"?Object.defineProperty(o,"__esModule",{value:!0}):o.__esModule=!0),function(i,a){return o[i]=n?n(i,a):a}}})(function(e){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(o,n){o.__proto__=n}||function(o,n){for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(o[i]=n[i])};Ur=function(o,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");t(o,n);function i(){this.constructor=o}o.prototype=n===null?Object.create(n):(i.prototype=n.prototype,new i)},Dr=Object.assign||function(o){for(var n,i=1,a=arguments.length;i<a;i++){n=arguments[i];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(o[s]=n[s])}return o},Nr=function(o,n){var i={};for(var a in o)Object.prototype.hasOwnProperty.call(o,a)&&n.indexOf(a)<0&&(i[a]=o[a]);if(o!=null&&typeof Object.getOwnPropertySymbols=="function")for(var s=0,a=Object.getOwnPropertySymbols(o);s<a.length;s++)n.indexOf(a[s])<0&&Object.prototype.propertyIsEnumerable.call(o,a[s])&&(i[a[s]]=o[a[s]]);return i},zr=function(o,n,i,a){var s=arguments.length,c=s<3?n:a===null?a=Object.getOwnPropertyDescriptor(n,i):a,l;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")c=Reflect.decorate(o,n,i,a);else for(var u=o.length-1;u>=0;u--)(l=o[u])&&(c=(s<3?l(c):s>3?l(n,i,c):l(n,i))||c);return s>3&&c&&Object.defineProperty(n,i,c),c},qr=function(o,n){return function(i,a){n(i,a,o)}},Qr=function(o,n){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,n)},Kr=function(o,n,i,a){function s(c){return c instanceof i?c:new i(function(l){l(c)})}return new(i||(i=Promise))(function(c,l){function u(h){try{p(a.next(h))}catch(g){l(g)}}function m(h){try{p(a.throw(h))}catch(g){l(g)}}function p(h){h.done?c(h.value):s(h.value).then(u,m)}p((a=a.apply(o,n||[])).next())})},Br=function(o,n){var i={label:0,sent:function(){if(c[0]&1)throw c[1];return c[1]},trys:[],ops:[]},a,s,c,l;return l={next:u(0),throw:u(1),return:u(2)},typeof Symbol=="function"&&(l[Symbol.iterator]=function(){return this}),l;function u(p){return function(h){return m([p,h])}}function m(p){if(a)throw new TypeError("Generator is already executing.");for(;i;)try{if(a=1,s&&(c=p[0]&2?s.return:p[0]?s.throw||((c=s.return)&&c.call(s),0):s.next)&&!(c=c.call(s,p[1])).done)return c;switch(s=0,c&&(p=[p[0]&2,c.value]),p[0]){case 0:case 1:c=p;break;case 4:return i.label++,{value:p[1],done:!1};case 5:i.label++,s=p[1],p=[0];continue;case 7:p=i.ops.pop(),i.trys.pop();continue;default:if(c=i.trys,!(c=c.length>0&&c[c.length-1])&&(p[0]===6||p[0]===2)){i=0;continue}if(p[0]===3&&(!c||p[1]>c[0]&&p[1]<c[3])){i.label=p[1];break}if(p[0]===6&&i.label<c[1]){i.label=c[1],c=p;break}if(c&&i.label<c[2]){i.label=c[2],i.ops.push(p);break}c[2]&&i.ops.pop(),i.trys.pop();continue}p=n.call(o,i)}catch(h){p=[6,h],s=0}finally{a=c=0}if(p[0]&5)throw p[1];return{value:p[0]?p[1]:void 0,done:!0}}},Jr=function(o,n){for(var i in o)i!=="default"&&!Object.prototype.hasOwnProperty.call(n,i)&&vt(n,o,i)},vt=Object.create?function(o,n,i,a){a===void 0&&(a=i),Object.defineProperty(o,a,{enumerable:!0,get:function(){return n[i]}})}:function(o,n,i,a){a===void 0&&(a=i),o[a]=n[i]},bt=function(o){var n=typeof Symbol=="function"&&Symbol.iterator,i=n&&o[n],a=0;if(i)return i.call(o);if(o&&typeof o.length=="number")return{next:function(){return o&&a>=o.length&&(o=void 0),{value:o&&o[a++],done:!o}}};throw new TypeError(n?"Object is not iterable.":"Symbol.iterator is not defined.")},tr=function(o,n){var i=typeof Symbol=="function"&&o[Symbol.iterator];if(!i)return o;var a=i.call(o),s,c=[],l;try{for(;(n===void 0||n-- >0)&&!(s=a.next()).done;)c.push(s.value)}catch(u){l={error:u}}finally{try{s&&!s.done&&(i=a.return)&&i.call(a)}finally{if(l)throw l.error}}return c},Yr=function(){for(var o=[],n=0;n<arguments.length;n++)o=o.concat(tr(arguments[n]));return o},Gr=function(){for(var o=0,n=0,i=arguments.length;n<i;n++)o+=arguments[n].length;for(var a=Array(o),s=0,n=0;n<i;n++)for(var c=arguments[n],l=0,u=c.length;l<u;l++,s++)a[s]=c[l];return a},Xr=function(o,n){for(var i=0,a=n.length,s=o.length;i<a;i++,s++)o[s]=n[i];return o},$e=function(o){return this instanceof $e?(this.v=o,this):new $e(o)},Zr=function(o,n,i){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var a=i.apply(o,n||[]),s,c=[];return s={},l("next"),l("throw"),l("return"),s[Symbol.asyncIterator]=function(){return this},s;function l(b){a[b]&&(s[b]=function(N){return new Promise(function($,H){c.push([b,N,$,H])>1||u(b,N)})})}function u(b,N){try{m(a[b](N))}catch($){g(c[0][3],$)}}function m(b){b.value instanceof $e?Promise.resolve(b.value.v).then(p,h):g(c[0][2],b)}function p(b){u("next",b)}function h(b){u("throw",b)}function g(b,N){b(N),c.shift(),c.length&&u(c[0][0],c[0][1])}},eo=function(o){var n,i;return n={},a("next"),a("throw",function(s){throw s}),a("return"),n[Symbol.iterator]=function(){return this},n;function a(s,c){n[s]=o[s]?function(l){return(i=!i)?{value:$e(o[s](l)),done:s==="return"}:c?c(l):l}:c}},to=function(o){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n=o[Symbol.asyncIterator],i;return n?n.call(o):(o=typeof bt=="function"?bt(o):o[Symbol.iterator](),i={},a("next"),a("throw"),a("return"),i[Symbol.asyncIterator]=function(){return this},i);function a(c){i[c]=o[c]&&function(l){return new Promise(function(u,m){l=o[c](l),s(u,m,l.done,l.value)})}}function s(c,l,u,m){Promise.resolve(m).then(function(p){c({value:p,done:u})},l)}},ro=function(o,n){return Object.defineProperty?Object.defineProperty(o,"raw",{value:n}):o.raw=n,o};var r=Object.create?function(o,n){Object.defineProperty(o,"default",{enumerable:!0,value:n})}:function(o,n){o.default=n};oo=function(o){if(o&&o.__esModule)return o;var n={};if(o!=null)for(var i in o)i!=="default"&&Object.prototype.hasOwnProperty.call(o,i)&&vt(n,o,i);return r(n,o),n},no=function(o){return o&&o.__esModule?o:{default:o}},io=function(o,n){if(!n.has(o))throw new TypeError("attempted to get private field on non-instance");return n.get(o)},ao=function(o,n,i){if(!n.has(o))throw new TypeError("attempted to set private field on non-instance");return n.set(o,i),i},e("__extends",Ur),e("__assign",Dr),e("__rest",Nr),e("__decorate",zr),e("__param",qr),e("__metadata",Qr),e("__awaiter",Kr),e("__generator",Br),e("__exportStar",Jr),e("__createBinding",vt),e("__values",bt),e("__read",tr),e("__spread",Yr),e("__spreadArrays",Gr),e("__spreadArray",Xr),e("__await",$e),e("__asyncGenerator",Zr),e("__asyncDelegator",eo),e("__asyncValues",to),e("__makeTemplateObject",ro),e("__importStar",oo),e("__importDefault",no),e("__classPrivateFieldGet",io),e("__classPrivateFieldSet",ao)})});var _r=ht((lt,Or)=>{(function(t,r){typeof lt=="object"&&typeof Or=="object"?Or.exports=r():typeof define=="function"&&define.amd?define([],r):typeof lt=="object"?lt.ClipboardJS=r():t.ClipboardJS=r()})(lt,function(){return function(){var e={134:function(o,n,i){"use strict";i.d(n,{default:function(){return Ui}});var a=i(279),s=i.n(a),c=i(370),l=i.n(c),u=i(817),m=i.n(u);function p(E){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?p=function(d){return typeof d}:p=function(d){return d&&typeof Symbol=="function"&&d.constructor===Symbol&&d!==Symbol.prototype?"symbol":typeof d},p(E)}function h(E,v){if(!(E instanceof v))throw new TypeError("Cannot call a class as a function")}function g(E,v){for(var d=0;d<v.length;d++){var A=v[d];A.enumerable=A.enumerable||!1,A.configurable=!0,"value"in A&&(A.writable=!0),Object.defineProperty(E,A.key,A)}}function b(E,v,d){return v&&g(E.prototype,v),d&&g(E,d),E}var N=function(){function E(v){h(this,E),this.resolveOptions(v),this.initSelection()}return b(E,[{key:"resolveOptions",value:function(){var d=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.action=d.action,this.container=d.container,this.emitter=d.emitter,this.target=d.target,this.text=d.text,this.trigger=d.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"createFakeElement",value:function(){var d=document.documentElement.getAttribute("dir")==="rtl";this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[d?"right":"left"]="-9999px";var A=window.pageYOffset||document.documentElement.scrollTop;return this.fakeElem.style.top="".concat(A,"px"),this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.fakeElem}},{key:"selectFake",value:function(){var d=this,A=this.createFakeElement();this.fakeHandlerCallback=function(){return d.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.container.appendChild(A),this.selectedText=m()(A),this.copyText(),this.removeFake()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=m()(this.target),this.copyText()}},{key:"copyText",value:function(){var d;try{d=document.execCommand(this.action)}catch(A){d=!1}this.handleResult(d)}},{key:"handleResult",value:function(d){this.emitter.emit(d?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var d=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"copy";if(this._action=d,this._action!=="copy"&&this._action!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(d){if(d!==void 0)if(d&&p(d)==="object"&&d.nodeType===1){if(this.action==="copy"&&d.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(this.action==="cut"&&(d.hasAttribute("readonly")||d.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`);this._target=d}else throw new Error('Invalid "target" value, use a valid Element')},get:function(){return this._target}}]),E}(),$=N;function H(E){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?H=function(d){return typeof d}:H=function(d){return d&&typeof Symbol=="function"&&d.constructor===Symbol&&d!==Symbol.prototype?"symbol":typeof d},H(E)}function _(E,v){if(!(E instanceof v))throw new TypeError("Cannot call a class as a function")}function ut(E,v){for(var d=0;d<v.length;d++){var A=v[d];A.enumerable=A.enumerable||!1,A.configurable=!0,"value"in A&&(A.writable=!0),Object.defineProperty(E,A.key,A)}}function pt(E,v,d){return v&&ut(E.prototype,v),d&&ut(E,d),E}function Ii(E,v){if(typeof v!="function"&&v!==null)throw new TypeError("Super expression must either be null or a function");E.prototype=Object.create(v&&v.prototype,{constructor:{value:E,writable:!0,configurable:!0}}),v&&Gt(E,v)}function Gt(E,v){return Gt=Object.setPrototypeOf||function(A,I){return A.__proto__=I,A},Gt(E,v)}function Ri(E){var v=Vi();return function(){var A=ft(E),I;if(v){var X=ft(this).constructor;I=Reflect.construct(A,arguments,X)}else I=A.apply(this,arguments);return Pi(this,I)}}function Pi(E,v){return v&&(H(v)==="object"||typeof v=="function")?v:$i(E)}function $i(E){if(E===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return E}function Vi(){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(E){return!1}}function ft(E){return ft=Object.setPrototypeOf?Object.getPrototypeOf:function(d){return d.__proto__||Object.getPrototypeOf(d)},ft(E)}function Xt(E,v){var d="data-clipboard-".concat(E);if(!!v.hasAttribute(d))return v.getAttribute(d)}var Wi=function(E){Ii(d,E);var v=Ri(d);function d(A,I){var X;return _(this,d),X=v.call(this),X.resolveOptions(I),X.listenClick(A),X}return pt(d,[{key:"resolveOptions",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof I.action=="function"?I.action:this.defaultAction,this.target=typeof I.target=="function"?I.target:this.defaultTarget,this.text=typeof I.text=="function"?I.text:this.defaultText,this.container=H(I.container)==="object"?I.container:document.body}},{key:"listenClick",value:function(I){var X=this;this.listener=l()(I,"click",function(Ge){return X.onClick(Ge)})}},{key:"onClick",value:function(I){var X=I.delegateTarget||I.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new $({action:this.action(X),target:this.target(X),text:this.text(X),container:this.container,trigger:X,emitter:this})}},{key:"defaultAction",value:function(I){return Xt("action",I)}},{key:"defaultTarget",value:function(I){var X=Xt("target",I);if(X)return document.querySelector(X)}},{key:"defaultText",value:function(I){return Xt("text",I)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],X=typeof I=="string"?[I]:I,Ge=!!document.queryCommandSupported;return X.forEach(function(Di){Ge=Ge&&!!document.queryCommandSupported(Di)}),Ge}}]),d}(s()),Ui=Wi},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(u,m,p,h,g){var b=l.apply(this,arguments);return u.addEventListener(p,b,g),{destroy:function(){u.removeEventListener(p,b,g)}}}function c(u,m,p,h,g){return typeof u.addEventListener=="function"?s.apply(null,arguments):typeof p=="function"?s.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(b){return s(b,m,p,h,g)}))}function l(u,m,p,h){return function(g){g.delegateTarget=a(g.target,m),g.delegateTarget&&h.call(u,g)}}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(p,h,g){if(!p&&!h&&!g)throw new Error("Missing required arguments");if(!a.string(h))throw new TypeError("Second argument must be a String");if(!a.fn(g))throw new TypeError("Third argument must be a Function");if(a.node(p))return l(p,h,g);if(a.nodeList(p))return u(p,h,g);if(a.string(p))return m(p,h,g);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function l(p,h,g){return p.addEventListener(h,g),{destroy:function(){p.removeEventListener(h,g)}}}function u(p,h,g){return Array.prototype.forEach.call(p,function(b){b.addEventListener(h,g)}),{destroy:function(){Array.prototype.forEach.call(p,function(b){b.removeEventListener(h,g)})}}}function m(p,h,g){return s(document.body,p,h,g)}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(),l=document.createRange();l.selectNodeContents(i),c.removeAllRanges(),c.addRange(l),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 l(){c.off(i,l),a.apply(s,arguments)}return l._=a,this.on(i,l,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),c=0,l=s.length;for(c;c<l;c++)s[c].fn.apply(s[c].ctx,a);return this},off:function(i,a){var s=this.e||(this.e={}),c=s[i],l=[];if(c&&a)for(var u=0,m=c.length;u<m;u++)c[u].fn!==a&&c[u].fn._!==a&&l.push(c[u]);return l.length?s[i]=l:delete s[i],this}},o.exports=n,o.exports.TinyEmitter=n}},t={};function r(o){if(t[o])return t[o].exports;var n=t[o]={exports:{}};return e[o](n,n.exports,r),n.exports}return function(){r.n=function(o){var n=o&&o.__esModule?function(){return o.default}:function(){return o};return r.d(n,{a:n}),n}}(),function(){r.d=function(o,n){for(var i in n)r.o(n,i)&&!r.o(o,i)&&Object.defineProperty(o,i,{enumerable:!0,get:n[i]})}}(),function(){r.o=function(o,n){return Object.prototype.hasOwnProperty.call(o,n)}}(),r(134)}().default})});var pi=ht((Cx,ui)=>{"use strict";var Ia=/["'&<>]/;ui.exports=Ra;function Ra(e){var t=""+e,r=Ia.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i<t.length;i++){switch(t.charCodeAt(i)){case 34:o="&quot;";break;case 38:o="&amp;";break;case 39:o="&#39;";break;case 60:o="&lt;";break;case 62:o="&gt;";break;default:continue}a!==i&&(n+=t.substring(a,i)),a=i+1,n+=o}return a!==i?n+t.substring(a,i):n}});var qw=Xe(Wr());var co=Xe(so()),{__extends:K,__assign:Xa,__rest:Za,__decorate:es,__param:ts,__metadata:rs,__awaiter:lo,__generator:xt,__exportStar:os,__createBinding:ns,__values:ce,__read:L,__spread:is,__spreadArrays:as,__spreadArray:F,__await:yt,__asyncGenerator:uo,__asyncDelegator:ss,__asyncValues:po,__makeTemplateObject:cs,__importStar:ls,__importDefault:us,__classPrivateFieldGet:ps,__classPrivateFieldSet:fs}=co.default;function S(e){return typeof e=="function"}function St(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 wt=St(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 ye(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var ie=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._teardowns=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=ce(a),c=s.next();!c.done;c=s.next()){var l=c.value;l.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 u=this.initialTeardown;if(S(u))try{u()}catch(b){i=b instanceof wt?b.errors:[b]}var m=this._teardowns;if(m){this._teardowns=null;try{for(var p=ce(m),h=p.next();!h.done;h=p.next()){var g=h.value;try{fo(g)}catch(b){i=i!=null?i:[],b instanceof wt?i=F(F([],L(i)),L(b.errors)):i.push(b)}}}catch(b){o={error:b}}finally{try{h&&!h.done&&(n=p.return)&&n.call(p)}finally{if(o)throw o.error}}}if(i)throw new wt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)fo(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._teardowns=(r=this._teardowns)!==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)&&ye(r,t)},e.prototype.remove=function(t){var r=this._teardowns;r&&ye(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var rr=ie.EMPTY;function Et(e){return e instanceof ie||e&&"closed"in e&&S(e.remove)&&S(e.add)&&S(e.unsubscribe)}function fo(e){S(e)?e():e.unsubscribe()}var Se={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var Ve={setTimeout:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=Ve.delegate;return((r==null?void 0:r.setTimeout)||setTimeout).apply(void 0,F([],L(e)))},clearTimeout:function(e){var t=Ve.delegate;return((t==null?void 0:t.clearTimeout)||clearTimeout)(e)},delegate:void 0};function Tt(e){Ve.setTimeout(function(){var t=Se.onUnhandledError;if(t)t(e);else throw e})}function ee(){}var mo=function(){return or("C",void 0,void 0)}();function ho(e){return or("E",void 0,e)}function bo(e){return or("N",e,void 0)}function or(e,t,r){return{kind:e,value:t,error:r}}var Ze=function(e){K(t,e);function t(r){var o=e.call(this)||this;return o.isStopped=!1,r?(o.destination=r,Et(r)&&r.add(o)):o.destination=Ji,o}return t.create=function(r,o,n){return new et(r,o,n)},t.prototype.next=function(r){this.isStopped?ir(bo(r),this):this._next(r)},t.prototype.error=function(r){this.isStopped?ir(ho(r),this):(this.isStopped=!0,this._error(r))},t.prototype.complete=function(){this.isStopped?ir(mo,this):(this.isStopped=!0,this._complete())},t.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,e.prototype.unsubscribe.call(this),this.destination=null)},t.prototype._next=function(r){this.destination.next(r)},t.prototype._error=function(r){try{this.destination.error(r)}finally{this.unsubscribe()}},t.prototype._complete=function(){try{this.destination.complete()}finally{this.unsubscribe()}},t}(ie);var et=function(e){K(t,e);function t(r,o,n){var i=e.call(this)||this,a;if(S(r))a=r;else if(r){a=r.next,o=r.error,n=r.complete;var s;i&&Se.useDeprecatedNextContext?(s=Object.create(r),s.unsubscribe=function(){return i.unsubscribe()}):s=r,a=a==null?void 0:a.bind(s),o=o==null?void 0:o.bind(s),n=n==null?void 0:n.bind(s)}return i.destination={next:a?nr(a,i):ee,error:nr(o!=null?o:vo,i),complete:n?nr(n,i):ee},i}return t}(Ze);function nr(e,t){return function(){for(var r=[],o=0;o<arguments.length;o++)r[o]=arguments[o];try{e.apply(void 0,F([],L(r)))}catch(n){if(Se.useDeprecatedSynchronousErrorHandling)if(t._syncErrorHack_isSubscribing)t.__syncError=n;else throw n;else Tt(n)}}}function vo(e){throw e}function ir(e,t){var r=Se.onStoppedNotification;r&&Ve.setTimeout(function(){return r(e,t)})}var Ji={closed:!0,next:ee,error:vo,complete:ee};var Oe=function(){return typeof Symbol=="function"&&Symbol.observable||"@@observable"}();function le(e){return e}function go(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return ar(e)}function ar(e){return e.length===0?le:e.length===1?e[0]:function(r){return e.reduce(function(o,n){return n(o)},r)}}var O=function(){function e(t){t&&(this._subscribe=t)}return e.prototype.lift=function(t){var r=new e;return r.source=this,r.operator=t,r},e.prototype.subscribe=function(t,r,o){var n=Gi(t)?t:new et(t,r,o);if(Se.useDeprecatedSynchronousErrorHandling)this._deprecatedSyncErrorSubscribe(n);else{var i=this,a=i.operator,s=i.source;n.add(a?a.call(n,s):s?this._subscribe(n):this._trySubscribe(n))}return n},e.prototype._deprecatedSyncErrorSubscribe=function(t){var r=t;r._syncErrorHack_isSubscribing=!0;var o=this.operator;if(o)t.add(o.call(t,this.source));else try{t.add(this._subscribe(t))}catch(i){r.__syncError=i}for(var n=r;n;){if("__syncError"in n)try{throw n.__syncError}finally{t.unsubscribe()}n=n.destination}r._syncErrorHack_isSubscribing=!1},e.prototype._trySubscribe=function(t){try{return this._subscribe(t)}catch(r){t.error(r)}},e.prototype.forEach=function(t,r){var o=this;return r=xo(r),new r(function(n,i){var a;a=o.subscribe(function(s){try{t(s)}catch(c){i(c),a==null||a.unsubscribe()}},i,n)})},e.prototype._subscribe=function(t){var r;return(r=this.source)===null||r===void 0?void 0:r.subscribe(t)},e.prototype[Oe]=function(){return this},e.prototype.pipe=function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];return t.length?ar(t)(this):this},e.prototype.toPromise=function(t){var r=this;return t=xo(t),new t(function(o,n){var i;r.subscribe(function(a){return i=a},function(a){return n(a)},function(){return o(i)})})},e.create=function(t){return new e(t)},e}();function xo(e){var t;return(t=e!=null?e:Se.Promise)!==null&&t!==void 0?t:Promise}function Yi(e){return e&&S(e.next)&&S(e.error)&&S(e.complete)}function Gi(e){return e&&e instanceof Ze||Yi(e)&&Et(e)}function Xi(e){return S(e==null?void 0:e.lift)}function x(e){return function(t){if(Xi(t))return t.lift(function(r){try{return e(r,this)}catch(o){this.error(o)}});throw new TypeError("Unable to lift unknown Observable type")}}var y=function(e){K(t,e);function t(r,o,n,i,a){var s=e.call(this,r)||this;return s.onFinalize=a,s._next=o?function(c){try{o(c)}catch(l){r.error(l)}}:e.prototype._next,s._error=i?function(c){try{i(c)}catch(l){r.error(l)}finally{this.unsubscribe()}}:e.prototype._error,s._complete=n?function(){try{n()}catch(c){r.error(c)}finally{this.unsubscribe()}}:e.prototype._complete,s}return t.prototype.unsubscribe=function(){var r,o=this.closed;e.prototype.unsubscribe.call(this),!o&&((r=this.onFinalize)===null||r===void 0||r.call(this))},t}(Ze);var We={schedule:function(e){var t=requestAnimationFrame,r=cancelAnimationFrame,o=We.delegate;o&&(t=o.requestAnimationFrame,r=o.cancelAnimationFrame);var n=t(function(i){r=void 0,e(i)});return new ie(function(){return r==null?void 0:r(n)})},requestAnimationFrame:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=We.delegate;return((r==null?void 0:r.requestAnimationFrame)||requestAnimationFrame).apply(void 0,F([],L(e)))},cancelAnimationFrame:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=We.delegate;return((r==null?void 0:r.cancelAnimationFrame)||cancelAnimationFrame).apply(void 0,F([],L(e)))},delegate:void 0};var yo=St(function(e){return function(){e(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"}});var M=function(e){K(t,e);function t(){var r=e.call(this)||this;return r.closed=!1,r.observers=[],r.isStopped=!1,r.hasError=!1,r.thrownError=null,r}return t.prototype.lift=function(r){var o=new So(this,this);return o.operator=r,o},t.prototype._throwIfClosed=function(){if(this.closed)throw new yo},t.prototype.next=function(r){var o,n;if(this._throwIfClosed(),!this.isStopped){var i=this.observers.slice();try{for(var a=ce(i),s=a.next();!s.done;s=a.next()){var c=s.value;c.next(r)}}catch(l){o={error:l}}finally{try{s&&!s.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}}},t.prototype.error=function(r){if(this._throwIfClosed(),!this.isStopped){this.hasError=this.isStopped=!0,this.thrownError=r;for(var o=this.observers;o.length;)o.shift().error(r)}},t.prototype.complete=function(){if(this._throwIfClosed(),!this.isStopped){this.isStopped=!0;for(var r=this.observers;r.length;)r.shift().complete()}},t.prototype.unsubscribe=function(){this.isStopped=this.closed=!0,this.observers=null},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=o.hasError,i=o.isStopped,a=o.observers;return n||i?rr:(a.push(r),new ie(function(){return ye(a,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 O;return r.source=this,r},t.create=function(r,o){return new So(r,o)},t}(O);var So=function(e){K(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:rr},t}(M);var tt={now:function(){return(tt.delegate||Date).now()},delegate:void 0};var rt=function(e){K(t,e);function t(r,o,n){r===void 0&&(r=Infinity),o===void 0&&(o=Infinity),n===void 0&&(n=tt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===Infinity,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;c<s.length&&!r.closed;c+=i?1:2)r.next(s[c]);return this._checkFinalizedStatuses(r),o},t.prototype._trimBuffer=function(){var r=this,o=r._bufferSize,n=r._timestampProvider,i=r._buffer,a=r._infiniteTimeWindow,s=(a?1:2)*o;if(o<Infinity&&s<i.length&&i.splice(0,i.length-s),!a){for(var c=n.now(),l=0,u=1;u<i.length&&i[u]<=c;u+=2)l=u;l&&i.splice(0,l+1)}},t}(M);var wo=function(e){K(t,e);function t(r,o){return e.call(this)||this}return t.prototype.schedule=function(r,o){return o===void 0&&(o=0),this},t}(ie);var ot={setInterval:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=ot.delegate;return((r==null?void 0:r.setInterval)||setInterval).apply(void 0,F([],L(e)))},clearInterval:function(e){var t=ot.delegate;return((t==null?void 0:t.clearInterval)||clearInterval)(e)},delegate:void 0};var Ot=function(e){K(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n.pending=!1,n}return t.prototype.schedule=function(r,o){if(o===void 0&&(o=0),this.closed)return this;this.state=r;var n=this.id,i=this.scheduler;return n!=null&&(this.id=this.recycleAsyncId(i,n,o)),this.pending=!0,this.delay=o,this.id=this.id||this.requestAsyncId(i,this.id,o),this},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),ot.setInterval(r.flush.bind(r,this),n)},t.prototype.recycleAsyncId=function(r,o,n){if(n===void 0&&(n=0),n!=null&&this.delay===n&&this.pending===!1)return o;ot.clearInterval(o)},t.prototype.execute=function(r,o){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var n=this._execute(r,o);if(n)return n;this.pending===!1&&this.id!=null&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},t.prototype._execute=function(r,o){var n=!1,i;try{this.work(r)}catch(a){n=!0,i=!!a&&a||new Error(a)}if(n)return this.unsubscribe(),i},t.prototype.unsubscribe=function(){if(!this.closed){var r=this,o=r.id,n=r.scheduler,i=n.actions;this.work=this.state=this.scheduler=null,this.pending=!1,ye(i,this),o!=null&&(this.id=this.recycleAsyncId(n,o,null)),this.delay=null,e.prototype.unsubscribe.call(this)}},t}(wo);var sr=function(){function e(t,r){r===void 0&&(r=e.now),this.schedulerActionCtor=t,this.now=r}return e.prototype.schedule=function(t,r,o){return r===void 0&&(r=0),new this.schedulerActionCtor(this,t).schedule(o,r)},e.now=tt.now,e}();var _t=function(e){K(t,e);function t(r,o){o===void 0&&(o=sr.now);var n=e.call(this,r,o)||this;return n.actions=[],n._active=!1,n._scheduled=void 0,n}return t.prototype.flush=function(r){var o=this.actions;if(this._active){o.push(r);return}var n;this._active=!0;do if(n=r.execute(r.state,r.delay))break;while(r=o.shift());if(this._active=!1,n){for(;r=o.shift();)r.unsubscribe();throw n}},t}(sr);var nt=new _t(Ot),Eo=nt;var To=function(e){K(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=We.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){if(n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);r.actions.length===0&&(We.cancelAnimationFrame(o),r._scheduled=void 0)},t}(Ot);var Oo=function(e){K(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0,this._scheduled=void 0;var o=this.actions,n,i=-1;r=r||o.shift();var a=o.length;do if(n=r.execute(r.state,r.delay))break;while(++i<a&&(r=o.shift()));if(this._active=!1,n){for(;++i<a&&(r=o.shift());)r.unsubscribe();throw n}},t}(_t);var B=new Oo(To);var de=new O(function(e){return e.complete()});function Ue(e,t){return new O(function(r){var o=0;return t.schedule(function(){o===e.length?r.complete():(r.next(e[o++]),r.closed||this.schedule())})})}var De=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Mt(e){return S(e==null?void 0:e.then)}function _o(e,t){return new O(function(r){var o=new ie;return o.add(t.schedule(function(){var n=e[Oe]();o.add(n.subscribe({next:function(i){o.add(t.schedule(function(){return r.next(i)}))},error:function(i){o.add(t.schedule(function(){return r.error(i)}))},complete:function(){o.add(t.schedule(function(){return r.complete()}))}}))})),o})}function Mo(e,t){return new O(function(r){return t.schedule(function(){return e.then(function(o){r.add(t.schedule(function(){r.next(o),r.add(t.schedule(function(){return r.complete()}))}))},function(o){r.add(t.schedule(function(){return r.error(o)}))})})})}function Zi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var At=Zi();function Ao(e,t,r,o){o===void 0&&(o=0);var n=t.schedule(function(){try{r.call(this)}catch(i){e.error(i)}},o);return e.add(n),n}function Lo(e,t){return new O(function(r){var o;return r.add(t.schedule(function(){o=e[At](),Ao(r,t,function(){var n=o.next(),i=n.value,a=n.done;a?r.complete():(r.next(i),this.schedule())})})),function(){return S(o==null?void 0:o.return)&&o.return()}})}function Lt(e,t){if(!e)throw new Error("Iterable cannot be null");return new O(function(r){var o=new ie;return o.add(t.schedule(function(){var n=e[Symbol.asyncIterator]();o.add(t.schedule(function(){var i=this;n.next().then(function(a){a.done?r.complete():(r.next(a.value),i.schedule())})}))})),o})}function kt(e){return S(e[Oe])}function Ct(e){return S(e==null?void 0:e[At])}function Ht(e){return Symbol.asyncIterator&&S(e==null?void 0:e[Symbol.asyncIterator])}function jt(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 Ft(e){return uo(this,arguments,function(){var r,o,n,i;return xt(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,yt(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,yt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,yt(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 It(e){return S(e==null?void 0:e.getReader)}function ko(e,t){return Lt(Ft(e),t)}function Co(e,t){if(e!=null){if(kt(e))return _o(e,t);if(De(e))return Ue(e,t);if(Mt(e))return Mo(e,t);if(Ht(e))return Lt(e,t);if(Ct(e))return Lo(e,t);if(It(e))return ko(e,t)}throw jt(e)}function ve(e,t){return t?Co(e,t):z(e)}function z(e){if(e instanceof O)return e;if(e!=null){if(kt(e))return ea(e);if(De(e))return cr(e);if(Mt(e))return ta(e);if(Ht(e))return Ho(e);if(Ct(e))return ra(e);if(It(e))return oa(e)}throw jt(e)}function ea(e){return new O(function(t){var r=e[Oe]();if(S(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function cr(e){return new O(function(t){for(var r=0;r<e.length&&!t.closed;r++)t.next(e[r]);t.complete()})}function ta(e){return new O(function(t){e.then(function(r){t.closed||(t.next(r),t.complete())},function(r){return t.error(r)}).then(null,Tt)})}function ra(e){return new O(function(t){var r,o;try{for(var n=ce(e),i=n.next();!i.done;i=n.next()){var a=i.value;if(t.next(a),t.closed)return}}catch(s){r={error:s}}finally{try{i&&!i.done&&(o=n.return)&&o.call(n)}finally{if(r)throw r.error}}t.complete()})}function Ho(e){return new O(function(t){na(e,t).catch(function(r){return t.error(r)})})}function oa(e){return Ho(Ft(e))}function na(e,t){var r,o,n,i;return lo(this,void 0,void 0,function(){var a,s;return xt(this,function(c){switch(c.label){case 0:c.trys.push([0,5,6,11]),r=po(e),c.label=1;case 1:return[4,r.next()];case 2:if(o=c.sent(),!!o.done)return[3,4];if(a=o.value,t.next(a),t.closed)return[2];c.label=3;case 3:return[3,1];case 4:return[3,11];case 5:return s=c.sent(),n={error:s},[3,11];case 6:return c.trys.push([6,,9,10]),o&&!o.done&&(i=r.return)?[4,i.call(r)]:[3,8];case 7:c.sent(),c.label=8;case 8:return[3,10];case 9:if(n)throw n.error;return[7];case 10:return[7];case 11:return t.complete(),[2]}})})}function ge(e,t){return t?Ue(e,t):cr(e)}function Rt(e){return e&&S(e.schedule)}function lr(e){return e[e.length-1]}function _e(e){return S(lr(e))?e.pop():void 0}function pe(e){return Rt(lr(e))?e.pop():void 0}function Pt(e,t){return typeof lr(e)=="number"?e.pop():t}function j(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=pe(e);return r?Ue(e,r):ge(e)}function jo(e){return e instanceof Date&&!isNaN(e)}function f(e,t){return x(function(r,o){var n=0;r.subscribe(new y(o,function(i){o.next(e.call(t,i,n++))}))})}var ia=Array.isArray;function aa(e,t){return ia(t)?e.apply(void 0,F([],L(t))):e(t)}function Me(e){return f(function(t){return aa(e,t)})}function J(e,t){return t===void 0&&(t=0),x(function(r,o){r.subscribe(new y(o,function(n){return o.add(e.schedule(function(){return o.next(n)},t))},function(){return o.add(e.schedule(function(){return o.complete()},t))},function(n){return o.add(e.schedule(function(){return o.error(n)},t))}))})}var sa=Array.isArray,ca=Object.getPrototypeOf,la=Object.prototype,ua=Object.keys;function Fo(e){if(e.length===1){var t=e[0];if(sa(t))return{args:t,keys:null};if(pa(t)){var r=ua(t);return{args:r.map(function(o){return t[o]}),keys:r}}}return{args:e,keys:null}}function pa(e){return e&&typeof e=="object"&&ca(e)===la}function Io(e,t){return e.reduce(function(r,o,n){return r[o]=t[n],r},{})}function Y(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=pe(e),o=_e(e),n=Fo(e),i=n.args,a=n.keys;if(i.length===0)return ve([],r);var s=new O(ur(i,r,a?function(c){return Io(a,c)}:le));return o?s.pipe(Me(o)):s}function ur(e,t,r){return r===void 0&&(r=le),function(o){Ro(t,function(){for(var n=e.length,i=new Array(n),a=n,s=n,c=function(u){Ro(t,function(){var m=ve(e[u],t),p=!1;m.subscribe(new y(o,function(h){i[u]=h,p||(p=!0,s--),s||o.next(r(i.slice()))},function(){--a||o.complete()}))},o)},l=0;l<n;l++)c(l)},o)}}function Ro(e,t,r){e?r.add(e.schedule(t)):t()}function Po(e,t,r,o,n,i,a,s){var c=[],l=0,u=0,m=!1,p=function(){m&&!c.length&&!l&&t.complete()},h=function(b){return l<o?g(b):c.push(b)},g=function(b){i&&t.next(b),l++;var N=!1;z(r(b,u++)).subscribe(new y(t,function($){n==null||n($),i?h($):t.next($)},function(){N=!0},void 0,function(){if(N)try{l--;for(var $=function(){var H=c.shift();a?t.add(a.schedule(function(){return g(H)})):g(H)};c.length&&l<o;)$();p()}catch(H){t.error(H)}}))};return e.subscribe(new y(t,h,function(){m=!0,p()})),function(){s==null||s()}}function te(e,t,r){return r===void 0&&(r=Infinity),S(t)?te(function(o,n){return f(function(i,a){return t(o,i,n,a)})(z(e(o,n)))},r):(typeof t=="number"&&(r=t),x(function(o,n){return Po(o,n,e,r)}))}function Ne(e){return e===void 0&&(e=Infinity),te(le,e)}function $o(){return Ne(1)}function it(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return $o()(ge(e,pe(e)))}function we(e){return new O(function(t){z(e()).subscribe(t)})}var fa=["addListener","removeListener"],ma=["addEventListener","removeEventListener"],da=["on","off"];function T(e,t,r,o){if(S(r)&&(o=r,r=void 0),o)return T(e,t,r).pipe(Me(o));var n=L(va(e)?ma.map(function(s){return function(c){return e[s](t,c,r)}}):ha(e)?fa.map(Vo(e,t)):ba(e)?da.map(Vo(e,t)):[],2),i=n[0],a=n[1];if(!i&&De(e))return te(function(s){return T(s,t,r)})(ge(e));if(!i)throw new TypeError("Invalid event target");return new O(function(s){var c=function(){for(var l=[],u=0;u<arguments.length;u++)l[u]=arguments[u];return s.next(1<l.length?l:l[0])};return i(c),function(){return a(c)}})}function Vo(e,t){return function(r){return function(o){return e[r](t,o)}}}function ha(e){return S(e.addListener)&&S(e.removeListener)}function ba(e){return S(e.on)&&S(e.off)}function va(e){return S(e.addEventListener)&&S(e.removeEventListener)}function $t(e,t,r){return r?$t(e,t).pipe(Me(r)):new O(function(o){var n=function(){for(var a=[],s=0;s<arguments.length;s++)a[s]=arguments[s];return o.next(a.length===1?a[0]:a)},i=e(n);return S(t)?function(){return t(n,i)}:void 0})}function Wo(e,t,r){e===void 0&&(e=0),r===void 0&&(r=Eo);var o=-1;return t!=null&&(Rt(t)?r=t:o=t),new O(function(n){var i=jo(e)?+e-r.now():e;i<0&&(i=0);var a=0;return r.schedule(function(){n.closed||(n.next(a++),0<=o?this.schedule(void 0,o):n.complete())},i)})}function R(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=pe(e),o=Pt(e,Infinity),n=e;return n.length?n.length===1?z(n[0]):Ne(o)(ge(n,r)):de}var Z=new O(ee);var ga=Array.isArray;function ze(e){return e.length===1&&ga(e[0])?e[0]:e}function k(e,t){return x(function(r,o){var n=0;r.subscribe(new y(o,function(i){return e.call(t,i,n++)&&o.next(i)}))})}function at(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=_e(e),o=ze(e);return o.length?new O(function(n){var i=o.map(function(){return[]}),a=o.map(function(){return!1});n.add(function(){i=a=null});for(var s=function(l){z(o[l]).subscribe(new y(n,function(u){if(i[l].push(u),i.every(function(p){return p.length})){var m=i.map(function(p){return p.shift()});n.next(r?r.apply(void 0,F([],L(m))):m),i.some(function(p,h){return!p.length&&a[h]})&&n.complete()}},function(){a[l]=!0,!i[l].length&&n.complete()}))},c=0;!n.closed&&c<o.length;c++)s(c);return function(){i=a=null}}):de}function he(e,t){return t===void 0&&(t=null),t=t!=null?t:e,x(function(r,o){var n=[],i=0;r.subscribe(new y(o,function(a){var s,c,l,u,m=null;i++%t==0&&n.push([]);try{for(var p=ce(n),h=p.next();!h.done;h=p.next()){var g=h.value;g.push(a),e<=g.length&&(m=m!=null?m:[],m.push(g))}}catch($){s={error:$}}finally{try{h&&!h.done&&(c=p.return)&&c.call(p)}finally{if(s)throw s.error}}if(m)try{for(var b=ce(m),N=b.next();!N.done;N=b.next()){var g=N.value;ye(n,g),o.next(g)}}catch($){l={error:$}}finally{try{N&&!N.done&&(u=b.return)&&u.call(b)}finally{if(l)throw l.error}}},function(){var a,s;try{for(var c=ce(n),l=c.next();!l.done;l=c.next()){var u=l.value;o.next(u)}}catch(m){a={error:m}}finally{try{l&&!l.done&&(s=c.return)&&s.call(c)}finally{if(a)throw a.error}}o.complete()},void 0,function(){n=null}))})}function qe(e){return x(function(t,r){var o=null,n=!1,i;o=t.subscribe(new y(r,void 0,void 0,function(a){i=z(e(a,qe(e)(t))),o?(o.unsubscribe(),o=null,i.subscribe(r)):n=!0})),n&&(o.unsubscribe(),o=null,i.subscribe(r))})}function Uo(e,t,r,o,n){return function(i,a){var s=r,c=t,l=0;i.subscribe(new y(a,function(u){var m=l++;c=s?e(c,u,m):(s=!0,u),o&&a.next(c)},n&&function(){s&&a.next(c),a.complete()}))}}function pr(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=_e(e);return r?go(pr.apply(void 0,F([],L(e))),Me(r)):x(function(o,n){ur(F([o],L(ze(e))))(n)})}function Vt(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return pr.apply(void 0,F([],L(e)))}function fr(e,t){return S(t)?te(e,t,1):te(e,1)}function mr(e,t){return t===void 0&&(t=nt),x(function(r,o){var n=null,i=null,a=null,s=function(){if(n){n.unsubscribe(),n=null;var l=i;i=null,o.next(l)}};function c(){var l=a+e,u=t.now();if(u<l){n=this.schedule(void 0,l-u);return}s()}r.subscribe(new y(o,function(l){i=l,a=t.now(),n||(n=t.schedule(c,e))},function(){s(),o.complete()},void 0,function(){i=n=null}))})}function He(e){return x(function(t,r){var o=!1;t.subscribe(new y(r,function(n){o=!0,r.next(n)},function(){o||r.next(e),r.complete()}))})}function Qe(e){return e<=0?function(){return de}:x(function(t,r){var o=0;t.subscribe(new y(r,function(n){++o<=e&&(r.next(n),e<=o&&r.complete())}))})}function Do(){return x(function(e,t){e.subscribe(new y(t,ee))})}function oe(e){return f(function(){return e})}function dr(e,t){return t?function(r){return it(t.pipe(Qe(1),Do()),r.pipe(dr(e)))}:te(function(r,o){return e(r,o).pipe(Qe(1),oe(r))})}function Ee(e,t){t===void 0&&(t=nt);var r=Wo(e,t);return dr(function(){return r})}function q(e,t){return t===void 0&&(t=le),e=e!=null?e:xa,x(function(r,o){var n,i=!0;r.subscribe(new y(o,function(a){var s=t(a);(i||!e(n,s))&&(i=!1,n=s,o.next(a))}))})}function xa(e,t){return e===t}function U(e,t){return q(function(r,o){return t?t(r[e],o[e]):r[e]===o[e]})}function P(e){return x(function(t,r){try{t.subscribe(r)}finally{r.add(e)}})}function hr(e){return e<=0?function(){return de}:x(function(t,r){var o=[];t.subscribe(new y(r,function(n){o.push(n),e<o.length&&o.shift()},function(){var n,i;try{for(var a=ce(o),s=a.next();!s.done;s=a.next()){var c=s.value;r.next(c)}}catch(l){n={error:l}}finally{try{s&&!s.done&&(i=a.return)&&i.call(a)}finally{if(n)throw n.error}}r.complete()},void 0,function(){o=null}))})}function No(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=pe(e),o=Pt(e,Infinity);return e=ze(e),x(function(n,i){Ne(o)(ge(F([n],L(e)),r)).subscribe(i)})}function st(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return No.apply(void 0,F([],L(e)))}function Ke(e){return x(function(t,r){var o=!1,n=null;t.subscribe(new y(r,function(a){o=!0,n=a}));var i=function(){if(o){o=!1;var a=n;n=null,r.next(a)}};e.subscribe(new y(r,i,ee))})}function br(e,t){return x(Uo(e,t,arguments.length>=2,!0))}function ne(e){e=e||{};var t=e.connector,r=t===void 0?function(){return new M}:t,o=e.resetOnComplete,n=o===void 0?!0:o,i=e.resetOnError,a=i===void 0?!0:i,s=e.resetOnRefCountZero,c=s===void 0?!0:s,l=null,u=null,m=0,p=!1,h=!1,g=function(){l=u=null,p=h=!1};return x(function(b,N){m++,u=u!=null?u:r(),N.add(function(){if(m--,c&&!m&&!h&&!p){var $=l;g(),$==null||$.unsubscribe()}}),u.subscribe(N),l||(l=new et({next:function($){return u.next($)},error:function($){h=!0;var H=u;a&&g(),H.error($)},complete:function(){p=!0;var $=u;n&&g(),$.complete()}}),ve(b).subscribe(l))})}function re(e,t,r){var o,n,i,a=!1;return e&&typeof e=="object"?(i=(o=e.bufferSize)!==null&&o!==void 0?o:Infinity,t=(n=e.windowTime)!==null&&n!==void 0?n:Infinity,a=!!e.refCount,r=e.scheduler):i=e!=null?e:Infinity,ne({connector:function(){return new rt(i,t,r)},resetOnError:!0,resetOnComplete:!1,resetOnRefCountZero:a})}function Wt(e){return k(function(t,r){return e<=r})}function vr(e){return x(function(t,r){var o=!1,n=new y(r,function(){n==null||n.unsubscribe(),o=!0},ee);z(e).subscribe(n),t.subscribe(new y(r,function(i){return o&&r.next(i)}))})}function W(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=pe(e);return x(function(o,n){(r?it(e,o,r):it(e,o)).subscribe(n)})}function w(e,t){return x(function(r,o){var n=null,i=0,a=!1,s=function(){return a&&!n&&o.complete()};r.subscribe(new y(o,function(c){n==null||n.unsubscribe();var l=0,u=i++;z(e(c,u)).subscribe(n=new y(o,function(m){return o.next(t?t(c,m,u,l++):m)},function(){n=null,s()}))},function(){a=!0,s()}))})}function gr(e,t){return S(t)?w(function(){return e},t):w(function(){return e})}function xr(e){return x(function(t,r){z(e).subscribe(new y(r,function(){return r.complete()},ee)),!r.closed&&t.subscribe(r)})}function yr(e,t){return t===void 0&&(t=!1),x(function(r,o){var n=0;r.subscribe(new y(o,function(i){var a=e(i,n++);(a||t)&&o.next(i),!a&&o.complete()}))})}function C(e,t,r){var o=S(e)||t||r?{next:e,error:t,complete:r}:e;return o?x(function(n,i){n.subscribe(new y(i,function(a){var s;(s=o.next)===null||s===void 0||s.call(o,a),i.next(a)},function(){var a;(a=o.complete)===null||a===void 0||a.call(o),i.complete()},function(a){var s;(s=o.error)===null||s===void 0||s.call(o,a),i.error(a)}))}):le}var ya={leading:!0,trailing:!1};function Sr(e,t){var r=t===void 0?ya:t,o=r.leading,n=r.trailing;return x(function(i,a){var s=!1,c=null,l=null,u=!1,m=function(){l==null||l.unsubscribe(),l=null,n&&(g(),u&&a.complete())},p=function(){l=null,u&&a.complete()},h=function(b){return l=z(e(b)).subscribe(new y(a,m,p))},g=function(){if(s){s=!1;var b=c;c=null,a.next(b),!u&&h(b)}};i.subscribe(new y(a,function(b){s=!0,c=b,!(l&&!l.closed)&&(o?g():h(b))},function(){u=!0,!(n&&s&&l&&!l.closed)&&a.complete()}))})}function be(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=_e(e);return x(function(o,n){for(var i=e.length,a=new Array(i),s=e.map(function(){return!1}),c=!1,l=function(m){z(e[m]).subscribe(new y(n,function(p){a[m]=p,!c&&!s[m]&&(s[m]=!0,(c=s.every(le))&&(s=null))},ee))},u=0;u<i;u++)l(u);o.subscribe(new y(n,function(m){if(c){var p=F([m],L(a));n.next(r?r.apply(void 0,F([],L(p))):p)}}))})}function zo(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return x(function(r,o){at.apply(void 0,F([r],L(e))).subscribe(o)})}function wr(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return zo.apply(void 0,F([],L(e)))}function qo(){let e=new rt;return T(document,"DOMContentLoaded").pipe(oe(document)).subscribe(e),e}function ae(e,t=document){return t.querySelector(e)||void 0}function fe(e,t=document){let r=ae(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function je(){return document.activeElement instanceof HTMLElement?document.activeElement:void 0}function Q(e,t=document){return Array.from(t.querySelectorAll(e))}function Be(e){return document.createElement(e)}function Fe(e,...t){e.replaceWith(...t)}function Ae(e,t=!0){t?e.focus():e.blur()}function Qo(e){return R(T(e,"focus"),T(e,"blur")).pipe(f(({type:t})=>t==="focus"),W(e===je()))}var Ko=new M,Sa=we(()=>j(new ResizeObserver(e=>{for(let t of e)Ko.next(t)}))).pipe(w(e=>Z.pipe(W(e)).pipe(P(()=>e.disconnect()))),re(1));function Le(e){return{width:e.offsetWidth,height:e.offsetHeight}}function Ut(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ke(e){return Sa.pipe(C(t=>t.observe(e)),w(t=>Ko.pipe(k(({target:r})=>r===e),P(()=>t.unobserve(e)),f(()=>Le(e)))),W(Le(e)))}function Bo(e){return{x:e.scrollLeft,y:e.scrollTop}}function wa(e){return R(T(e,"scroll"),T(window,"resize")).pipe(f(()=>Bo(e)),W(Bo(e)))}function Jo(e,t=16){return wa(e).pipe(f(({y:r})=>{let o=Le(e),n=Ut(e);return r>=n.height-o.height-t}),q())}function Yo(e){if(e instanceof HTMLInputElement)e.select();else throw new Error("Not implemented")}var Dt={drawer:fe("[data-md-toggle=drawer]"),search:fe("[data-md-toggle=search]")};function Go(e){return Dt[e].checked}function Ie(e,t){Dt[e].checked!==t&&Dt[e].click()}function Nt(e){let t=Dt[e];return T(t,"change").pipe(f(()=>t.checked),W(t.checked))}function Ea(e){switch(e.tagName){case"INPUT":case"SELECT":case"TEXTAREA":return!0;default:return e.isContentEditable}}function Xo(){return T(window,"keydown").pipe(k(e=>!(e.metaKey||e.ctrlKey)),f(e=>({mode:Go("search")?"search":"global",type:e.key,claim(){e.preventDefault(),e.stopPropagation()}})),k(({mode:e})=>{if(e==="global"){let t=je();if(typeof t!="undefined")return!Ea(t)}return!0}),ne())}function Zo(){return new URL(location.href)}function en(e){location.href=e.href}function tn(){return new M}function rn(){return location.hash.substring(1)}function on(e){let t=Be("a");t.href=e,t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Ta(){return T(window,"hashchange").pipe(f(rn),W(rn()),k(e=>e.length>0),ne())}function nn(){return Ta().pipe(w(e=>j(ae(`[id="${e}"]`))))}function ct(e){let t=matchMedia(e);return $t(r=>t.addListener(()=>r(t.matches))).pipe(W(t.matches))}function an(){return T(window,"beforeprint").pipe(oe(void 0))}function Er(e,t){return e.pipe(w(r=>r?t():Z))}function zt(e,t={credentials:"same-origin"}){return ve(fetch(`${e}`,t)).pipe(k(r=>r.status===200))}function xe(e,t){return zt(e,t).pipe(w(r=>r.json()),re(1))}function sn(e,t){let r=new DOMParser;return zt(e,t).pipe(w(o=>o.text()),f(o=>r.parseFromString(o,"text/xml")),re(1))}function cn(){return{x:Math.max(0,pageXOffset),y:Math.max(0,pageYOffset)}}function Tr({x:e,y:t}){window.scrollTo(e||0,t||0)}function ln(){return R(T(window,"scroll",{passive:!0}),T(window,"resize",{passive:!0})).pipe(f(cn),W(cn()))}function un(){return{width:innerWidth,height:innerHeight}}function pn(){return T(window,"resize",{passive:!0}).pipe(f(un),W(un()))}function fn(){return Y([ln(),pn()]).pipe(f(([e,t])=>({offset:e,size:t})),re(1))}function qt(e,{viewport$:t,header$:r}){let o=t.pipe(U("size")),n=Y([o,r]).pipe(f(()=>({x:e.offsetLeft,y:e.offsetTop})));return Y([r,t,n]).pipe(f(([{height:i},{offset:a,size:s},{x:c,y:l}])=>({offset:{x:a.x-c,y:a.y-l+i},size:s})))}function mn(e,{tx$:t}){let r=T(e,"message").pipe(f(({data:o})=>o));return t.pipe(Sr(()=>r,{leading:!0,trailing:!0}),C(o=>e.postMessage(o)),gr(r),ne())}var Oa=fe("#__config"),Je=JSON.parse(Oa.textContent);Je.base=new URL(Je.base,Zo()).toString().replace(/\/$/,"");function se(){return Je}function Qt(e){return Je.features.includes(e)}function G(e,t){return typeof t!="undefined"?Je.translations[e].replace("#",t.toString()):Je.translations[e]}function Ce(e,t=document){return fe(`[data-md-component=${e}]`,t)}function me(e,t=document){return Q(`[data-md-component=${e}]`,t)}var Yn=Xe(_r());function dn(e,t=0){e.setAttribute("tabindex",t.toString())}function hn(e){e.removeAttribute("tabindex")}function bn(e,t){e.setAttribute("data-md-state","lock"),e.style.top=`-${t}px`}function vn(e){let t=-1*parseInt(e.style.top,10);e.removeAttribute("data-md-state"),e.style.top="",t&&window.scrollTo(0,t)}function gn(e,t){e.setAttribute("data-md-state",t)}function xn(e){e.removeAttribute("data-md-state")}function yn(e,t){e.classList.toggle("md-nav__link--active",t)}function Sn(e){e.classList.remove("md-nav__link--active")}function wn(e,t){e.firstElementChild.innerHTML=t}function En(e,t){e.setAttribute("data-md-state",t)}function Tn(e){e.removeAttribute("data-md-state")}function On(e,t){e.setAttribute("data-md-state",t)}function _n(e){e.removeAttribute("data-md-state")}function Mn(e,t){e.setAttribute("data-md-state",t)}function An(e){e.removeAttribute("data-md-state")}function Ln(e,t){e.placeholder=t}function kn(e){e.placeholder=G("search.placeholder")}function Cn(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)Cn(e,r)}function D(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="boolean"?o.setAttribute(n,t[n]):t[n]&&o.setAttribute(n,"");for(let n of r)Cn(o,n);return o}function Hn(e,t){let r=t;if(e.length>r){for(;e[r]!==" "&&--r>0;);return`${e.substring(0,r)}...`}return e}function Kt(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function jn(e,t){switch(t){case 0:e.textContent=G("search.result.none");break;case 1:e.textContent=G("search.result.one");break;default:e.textContent=G("search.result.other",Kt(t))}}function Fn(e){e.textContent=G("search.result.placeholder")}function In(e,t){e.appendChild(t)}function Rn(e){e.innerHTML=""}function Pn(e,t){e.style.top=`${t}px`}function $n(e){e.style.top=""}function Vn(e,t){let r=e.firstElementChild;r.style.height=`${t-2*r.offsetTop}px`}function Wn(e){let t=e.firstElementChild;t.style.height=""}function Un(e,t){e.lastElementChild.appendChild(t)}function Dn(e,t){e.lastElementChild.setAttribute("data-md-state",t)}function Nn(e,t){e.setAttribute("data-md-state",t)}function Mr(e){e.removeAttribute("data-md-state")}function zn(e,t){e.setAttribute("data-md-state",t)}function Ar(e){e.removeAttribute("data-md-state")}function qn(e){return D("button",{class:"md-clipboard md-icon",title:G("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}var Re;(function(r){r[r.TEASER=1]="TEASER",r[r.PARENT=2]="PARENT"})(Re||(Re={}));function Lr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(a=>!e.terms[a]).map(a=>[D("del",null,a)," "]).flat().slice(0,-1),i=e.location;return D("a",{href:i,class:"md-search-result__link",tabIndex:-1},D("article",{class:["md-search-result__article",...r?["md-search-result__article--document"]:[]].join(" "),"data-md-score":e.score.toFixed(2)},r>0&&D("div",{class:"md-search-result__icon md-icon"}),D("h1",{class:"md-search-result__title"},e.title),o>0&&e.text.length>0&&D("p",{class:"md-search-result__teaser"},Hn(e.text,320)),o>0&&n.length>0&&D("p",{class:"md-search-result__terms"},G("search.result.term.missing"),": ",n)))}function Qn(e){let t=e[0].score,r=[...e],o=r.findIndex(l=>!l.location.includes("#")),[n]=r.splice(o,1),i=r.findIndex(l=>l.score<t);i===-1&&(i=r.length);let a=r.slice(0,i),s=r.slice(i),c=[Lr(n,2|+(!o&&i===0)),...a.map(l=>Lr(l,1)),...s.length?[D("details",{class:"md-search-result__more"},D("summary",{tabIndex:-1},s.length>0&&s.length===1?G("search.result.more.one"):G("search.result.more.other",s.length)),s.map(l=>Lr(l,1)))]:[]];return D("li",{class:"md-search-result__item"},c)}function Kn(e){return D("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>D("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?Kt(r):r)))}function Bn(e){return D("div",{class:"md-typeset__scrollwrap"},D("div",{class:"md-typeset__table"},e))}function _a(e){let t=se(),r=new URL(`${e.version}/`,t.base);return D("li",{class:"md-version__item"},D("a",{href:r.toString(),class:"md-version__link"},e.title))}function Jn(e){let t=se(),[,r]=t.base.match(/([^/]+)\/?$/),o=e.find(({version:n,aliases:i})=>n===r||i.includes(r))||e[0];return D("div",{class:"md-version"},D("button",{class:"md-version__current"},o.title),D("ul",{class:"md-version__list"},e.map(_a)))}var Ma=0;function Aa(e,{viewport$:t}){let r=j(e).pipe(w(o=>{let n=o.closest("[data-tabs]");return n instanceof HTMLElement?R(...Q("input",n).map(i=>T(i,"change"))):Z}));return R(t.pipe(U("size")),r).pipe(f(()=>{let o=Le(e);return{scroll:Ut(e).width>o.width}}),U("scroll"))}function Gn(e,t){let r=new M;if(r.pipe(be(ct("(hover)"))).subscribe(([{scroll:o},n])=>{o&&n?dn(e):hn(e)}),Yn.default.isSupported()){let o=e.closest("pre");o.id=`__code_${Ma++}`,o.insertBefore(qn(o.id),e)}return Aa(e,t).pipe(C(r),P(()=>r.complete()),f(o=>V({ref:e},o)))}function La(e,{target$:t,print$:r}){return t.pipe(f(o=>o.closest("details:not([open])")),k(o=>e===o),st(r),oe(e))}function Xn(e,t){let r=new M;return r.subscribe(()=>{e.setAttribute("open",""),e.scrollIntoView()}),La(e,t).pipe(C(r),P(()=>r.complete()),oe({ref:e}))}var Zn=Be("table");function ei(e){return Fe(e,Zn),Fe(Zn,Bn(e)),j({ref:e})}function ti(e,{target$:t,viewport$:r,print$:o}){return R(...Q("pre > code",e).map(n=>Gn(n,{viewport$:r})),...Q("table:not([class])",e).map(n=>ei(n)),...Q("details",e).map(n=>Xn(n,{target$:t,print$:o})))}function ka(e,{alert$:t}){return t.pipe(w(r=>R(j(!0),j(!1).pipe(Ee(2e3))).pipe(f(o=>({message:r,open:o})))))}function ri(e,t){let r=new M;return r.pipe(J(B)).subscribe(({message:o,open:n})=>{wn(e,o),n?En(e,"open"):Tn(e)}),ka(e,t).pipe(C(r),P(()=>r.complete()),f(o=>V({ref:e},o)))}function Ca({viewport$:e}){if(!Qt("header.autohide"))return j(!1);let t=e.pipe(f(({offset:{y:n}})=>n),he(2,1),f(([n,i])=>[n<i,i]),U(0)),r=Y([e,t]).pipe(k(([{offset:n},[,i]])=>Math.abs(i-n.y)>100),f(([,[n]])=>n),q()),o=Nt("search");return Y([e,o]).pipe(f(([{offset:n},i])=>n.y>400&&!i),q(),w(n=>n?r:j(!1)),W(!1))}function oi(e,t){return we(()=>{let r=getComputedStyle(e);return j(r.position==="sticky"||r.position==="-webkit-sticky")}).pipe(Vt(ke(e),Ca(t)),f(([r,{height:o},n])=>({height:r?o:0,sticky:r,hidden:n})),q((r,o)=>r.sticky===o.sticky&&r.height===o.height&&r.hidden===o.hidden),re(1))}function ni(e,{header$:t,main$:r}){let o=new M;return o.pipe(U("active"),Vt(t),J(B)).subscribe(([{active:n},{hidden:i}])=>{n?On(e,i?"hidden":"shadow"):_n(e)}),r.subscribe(n=>o.next(n)),t.pipe(f(n=>V({ref:e},n)))}function Ha(e,{viewport$:t,header$:r}){return qt(e,{header$:r,viewport$:t}).pipe(f(({offset:{y:o}})=>{let{height:n}=Le(e);return{active:o>=n}}),U("active"))}function ii(e,t){let r=new M;r.pipe(J(B)).subscribe(({active:n})=>{n?Mn(e,"active"):An(e)});let o=ae("article h1");return typeof o=="undefined"?Z:Ha(o,t).pipe(C(r),P(()=>r.complete()),f(n=>V({ref:e},n)))}function ai(e,{viewport$:t,header$:r}){let o=r.pipe(f(({height:i})=>i),q()),n=o.pipe(w(()=>ke(e).pipe(f(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),U("bottom"))));return Y([o,n,t]).pipe(f(([i,{top:a,bottom:s},{offset:{y:c},size:{height:l}}])=>(l=Math.max(0,l-Math.max(0,a-c,i)-Math.max(0,l+c-s)),{offset:a-i,height:l,active:a-i<=c})),q((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function ja(e){let t=localStorage.getItem(__prefix("__palette")),r=JSON.parse(t)||{index:e.findIndex(n=>matchMedia(n.getAttribute("data-md-color-media")).matches)},o=j(...e).pipe(te(n=>T(n,"change").pipe(oe(n))),W(e[Math.max(0,r.index)]),f(n=>({index:e.indexOf(n),color:{scheme:n.getAttribute("data-md-color-scheme"),primary:n.getAttribute("data-md-color-primary"),accent:n.getAttribute("data-md-color-accent")}})),re(1));return o.subscribe(n=>{localStorage.setItem(__prefix("__palette"),JSON.stringify(n))}),o}function si(e){let t=new M;t.subscribe(o=>{for(let[n,i]of Object.entries(o.color))typeof i=="string"&&document.body.setAttribute(`data-md-color-${n}`,i);for(let n=0;n<r.length;n++){let i=r[n].nextElementSibling;i instanceof HTMLElement&&(i.hidden=o.index!==n)}});let r=Q("input",e);return ja(r).pipe(C(t),P(()=>t.complete()),f(o=>V({ref:e},o)))}var kr=Xe(_r());function ci({alert$:e}){kr.default.isSupported()&&new O(t=>{new kr.default("[data-clipboard-target], [data-clipboard-text]").on("success",r=>t.next(r))}).subscribe(()=>e.next(G("clipboard.copied")))}function Fa(e){if(e.length<2)return e;let[t,r]=e.sort((i,a)=>i.length-a.length).map(i=>i.replace(/[^/]+$/,"")),o=0;if(t===r)o=t.length;else for(;t.charCodeAt(o)===r.charCodeAt(o);)o++;let n=se();return e.map(i=>i.replace(t.slice(0,o),`${n.base}/`))}function li({document$:e,location$:t,viewport$:r}){let o=se();if(location.protocol==="file:")return;"scrollRestoration"in history&&(history.scrollRestoration="manual",T(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}));let n=ae("link[rel=icon]");typeof n!="undefined"&&(n.href=n.href);let i=sn(`${o.base}/sitemap.xml`).pipe(f(l=>Fa(Q("loc",l).map(u=>u.textContent))),w(l=>T(document.body,"click").pipe(k(u=>!u.metaKey&&!u.ctrlKey),w(u=>{if(u.target instanceof Element){let m=u.target.closest("a");if(m&&!m.target&&l.includes(m.href))return u.preventDefault(),j({url:new URL(m.href)})}return Z}))),ne()),a=T(window,"popstate").pipe(k(l=>l.state!==null),f(l=>({url:new URL(location.href),offset:l.state})),ne());R(i,a).pipe(q((l,u)=>l.url.href===u.url.href),f(({url:l})=>l)).subscribe(t);let s=t.pipe(U("pathname"),w(l=>zt(l.href).pipe(qe(()=>(en(l),Z)))),ne());i.pipe(Ke(s)).subscribe(({url:l})=>{history.pushState({},"",`${l}`)});let c=new DOMParser;s.pipe(w(l=>l.text()),f(l=>c.parseFromString(l,"text/html"))).subscribe(e),R(i,a).pipe(Ke(e)).subscribe(({url:l,offset:u})=>{l.hash&&!u?on(l.hash):Tr(u||{y:0})}),e.pipe(Wt(1)).subscribe(l=>{for(let u of["title","link[rel=canonical]","meta[name=author]","meta[name=description]","[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=logo], .md-logo","[data-md-component=skip]"]){let m=ae(u),p=ae(u,l);typeof m!="undefined"&&typeof p!="undefined"&&Fe(m,p)}}),e.pipe(Wt(1),f(()=>Ce("container")),w(l=>j(...Q("script",l))),fr(l=>{let u=Be("script");if(l.src){for(let m of l.getAttributeNames())u.setAttribute(m,l.getAttribute(m));return Fe(l,u),new O(m=>{u.onload=()=>m.complete()})}else return u.textContent=l.textContent,Fe(l,u),de})).subscribe(),r.pipe(vr(i),mr(250),U("offset")).subscribe(({offset:l})=>{history.replaceState(l,"")}),R(i,a).pipe(he(2,1),k(([l,u])=>l.url.pathname===u.url.pathname),f(([,l])=>l)).subscribe(({offset:l})=>{Tr(l||{y:0})})}var Pa=Xe(pi());function fi(e){return e.split(/"([^"]+)"/g).map((t,r)=>r&1?t.replace(/^\b|^(?![^\x00-\x7F]|$)|\s+/g," +"):t).join("").replace(/"|(?:^|\s+)[*+\-:^~]+(?=\s+|$)/g,"").trim()}var Te;(function(n){n[n.SETUP=0]="SETUP",n[n.READY=1]="READY",n[n.QUERY=2]="QUERY",n[n.RESULT=3]="RESULT"})(Te||(Te={}));function mi(e){return e.type===1}function di(e){return e.type===2}function Bt(e){return e.type===3}function $a({config:e,docs:t,index:r}){e.lang.length===1&&e.lang[0]==="en"&&(e.lang=[G("search.config.lang")]),e.separator==="[\\s\\-]+"&&(e.separator=G("search.config.separator"));let o=G("search.config.pipeline").split(/\s*,\s*/).filter(Boolean);return{config:e,docs:t,index:r,pipeline:o}}function hi(e,t){let r=se(),o=new Worker(e),n=new M,i=mn(o,{tx$:n}).pipe(f(a=>{if(Bt(a))for(let s of a.data)for(let c of s)c.location=`${r.base}/${c.location}`;return a}),ne());return ve(t).pipe(f(a=>({type:Te.SETUP,data:$a(a)}))).subscribe(n.next.bind(n)),{tx$:n,rx$:i}}function bi(){let e=se();xe(new URL("versions.json",e.base)).subscribe(t=>{fe(".md-header__topic").appendChild(Jn(t))})}function Va(e){let t=(__search==null?void 0:__search.transform)||fi,r=Qo(e),o=R(T(e,"keyup"),T(e,"focus").pipe(Ee(1))).pipe(f(()=>t(e.value)),q());return Y([o,r]).pipe(f(([n,i])=>({value:n,focus:i})))}function vi(e,{tx$:t}){let r=new M;return r.pipe(U("value"),f(({value:o})=>({type:Te.QUERY,data:o}))).subscribe(t.next.bind(t)),r.pipe(U("focus")).subscribe(({focus:o})=>{o?(Ie("search",o),Ln(e,"")):kn(e)}),T(e.form,"reset").pipe(xr(r.pipe(hr(1)))).subscribe(()=>Ae(e)),Va(e).pipe(C(r),P(()=>r.complete()),f(o=>V({ref:e},o)))}function gi(e,{rx$:t},{query$:r}){let o=new M,n=Jo(e.parentElement).pipe(k(Boolean)),i=fe(":scope > :first-child",e);o.pipe(J(B),be(r)).subscribe(([{data:c},{value:l}])=>{l?jn(i,c.length):Fn(i)});let a=fe(":scope > :last-child",e);return o.pipe(J(B),C(()=>Rn(a)),w(({data:c})=>R(j(...c.slice(0,10)),j(...c.slice(10)).pipe(he(4),wr(n),w(([l])=>j(...l)))))).subscribe(c=>{In(a,Qn(c))}),t.pipe(k(Bt),f(({data:c})=>({data:c})),W({data:[]})).pipe(C(o),P(()=>o.complete()),f(c=>V({ref:e},c)))}function xi(e,{index$:t,keyboard$:r}){let o=se(),n=hi(o.search,t),i=Ce("search-query",e),a=Ce("search-result",e),{tx$:s,rx$:c}=n;s.pipe(k(di),Ke(c.pipe(k(mi))),Qe(1)).subscribe(s.next.bind(s)),r.pipe(k(({mode:u})=>u==="search")).subscribe(u=>{let m=je();switch(u.type){case"Enter":m===i&&u.claim();break;case"Escape":case"Tab":Ie("search",!1),Ae(i,!1);break;case"ArrowUp":case"ArrowDown":if(typeof m=="undefined")Ae(i);else{let p=[i,...Q(":not(details) > [href], summary, details[open] [href]",a)],h=Math.max(0,(Math.max(0,p.indexOf(m))+p.length+(u.type==="ArrowUp"?-1:1))%p.length);Ae(p[h])}u.claim();break;default:i!==je()&&Ae(i)}}),r.pipe(k(({mode:u})=>u==="global")).subscribe(u=>{switch(u.type){case"f":case"s":case"/":Ae(i),Yo(i),u.claim();break}});let l=vi(i,n);return R(l,gi(a,n,{query$:l}))}function Wa(e,{viewport$:t,main$:r}){let o=e.parentElement.offsetTop-e.parentElement.parentElement.offsetTop;return Y([r,t]).pipe(f(([{offset:n,height:i},{offset:{y:a}}])=>(i=i+Math.min(o,Math.max(0,a-n))-o,{height:i,locked:a>=n+o})),q((n,i)=>n.height===i.height&&n.locked===i.locked))}function Cr(e,o){var n=o,{header$:t}=n,r=$r(n,["header$"]);let i=new M;return i.pipe(J(B),be(t)).subscribe({next([{height:a},{height:s}]){Vn(e,a),Pn(e,s)},complete(){$n(e),Wn(e)}}),Wa(e,r).pipe(C(i),P(()=>i.complete()),f(a=>V({ref:e},a)))}function yi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return at(xe(`${r}/releases/latest`).pipe(f(o=>({version:o.tag_name})),He({})),xe(r).pipe(f(o=>({stars:o.stargazers_count,forks:o.forks_count})),He({}))).pipe(f(([o,n])=>V(V({},o),n)))}else{let r=`https://api.github.com/repos/${e}`;return xe(r).pipe(f(o=>({repositories:o.public_repos})),He({}))}}function Si(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return xe(r).pipe(f(({star_count:o,forks_count:n})=>({stars:o,forks:n})),He({}))}function wi(e){let[t]=e.match(/(git(?:hub|lab))/i)||[];switch(t.toLowerCase()){case"github":let[,r,o]=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);return yi(r,o);case"gitlab":let[,n,i]=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i);return Si(n,i);default:return Z}}var Ua;function Da(e){return Ua||(Ua=we(()=>{let t=sessionStorage.getItem(__prefix("__source"));if(t)return j(JSON.parse(t));{let r=wi(e.href);return r.subscribe(o=>{try{sessionStorage.setItem(__prefix("__source"),JSON.stringify(o))}catch(n){}}),r}}).pipe(qe(()=>Z),k(t=>Object.keys(t).length>0),f(t=>({facts:t})),re(1)))}function Ei(e){let t=new M;return t.subscribe(({facts:r})=>{Un(e,Kn(r)),Dn(e,"done")}),Da(e).pipe(C(t),P(()=>t.complete()),f(r=>V({ref:e},r)))}function Na(e,{viewport$:t,header$:r}){return ke(document.body).pipe(w(()=>qt(e,{header$:r,viewport$:t})),f(({offset:{y:o}})=>({hidden:o>=10})),U("hidden"))}function Ti(e,t){let r=new M;return r.pipe(J(B)).subscribe({next({hidden:o}){o?Nn(e,"hidden"):Mr(e)},complete(){Mr(e)}}),Na(e,t).pipe(C(r),P(()=>r.complete()),f(o=>V({ref:e},o)))}function za(e,{viewport$:t,header$:r}){let o=new Map;for(let a of e){let s=decodeURIComponent(a.hash.substring(1)),c=ae(`[id="${s}"]`);typeof c!="undefined"&&o.set(a,c)}let n=r.pipe(f(a=>24+a.height));return ke(document.body).pipe(U("height"),f(()=>{let a=[];return[...o].reduce((s,[c,l])=>{for(;a.length&&o.get(a[a.length-1]).tagName>=l.tagName;)a.pop();let u=l.offsetTop;for(;!u&&l.parentElement;)l=l.parentElement,u=l.offsetTop;return s.set([...a=[...a,c]].reverse(),u)},new Map)}),f(a=>new Map([...a].sort(([,s],[,c])=>s-c))),w(a=>Y([n,t]).pipe(br(([s,c],[l,{offset:{y:u}}])=>{for(;c.length;){let[,m]=c[0];if(m-l<u)s=[...s,c.shift()];else break}for(;s.length;){let[,m]=s[s.length-1];if(m-l>=u)c=[s.pop(),...c];else break}return[s,c]},[[],[...a]]),q((s,c)=>s[0]===c[0]&&s[1]===c[1])))).pipe(f(([a,s])=>({prev:a.map(([c])=>c),next:s.map(([c])=>c)})),W({prev:[],next:[]}),he(2,1),f(([a,s])=>a.prev.length<s.prev.length?{prev:s.prev.slice(Math.max(0,a.prev.length-1),s.prev.length),next:[]}:{prev:s.prev.slice(-1),next:s.next.slice(0,s.next.length-a.next.length)}))}function Oi(e,t){let r=new M;r.pipe(J(B)).subscribe(({prev:n,next:i})=>{for(let[a]of i)Sn(a),xn(a);for(let[a,[s]]of n.entries())yn(s,a===n.length-1),gn(s,"blur")});let o=Q("[href^=\\#]",e);return za(o,t).pipe(C(r),P(()=>r.complete()),f(n=>V({ref:e},n)))}function qa(e,{viewport$:t,main$:r}){let o=t.pipe(f(({offset:{y:i}})=>i),he(2,1),f(([i,a])=>i>a),q()),n=r.pipe(U("active"));return Y([n,o]).pipe(f(([{active:i},a])=>({hidden:!(i&&a)})),q((i,a)=>i.hidden===a.hidden))}function _i(e,t){let r=new M;return r.pipe(J(B)).subscribe({next({hidden:o}){o?zn(e,"hidden"):Ar(e)},complete(){Ar(e)}}),qa(e,t).pipe(C(r),P(()=>r.complete()),f(o=>V({ref:e},o)))}function Mi({document$:e,tablet$:t}){e.pipe(w(()=>j(...Q("[data-md-state=indeterminate]"))),C(r=>{r.indeterminate=!0,r.checked=!1}),te(r=>T(r,"change").pipe(yr(()=>r.hasAttribute("data-md-state")),oe(r))),be(t)).subscribe(([r,o])=>{r.removeAttribute("data-md-state"),o&&(r.checked=!1)})}function Qa(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Ai({document$:e}){e.pipe(w(()=>j(...Q("[data-md-scrollfix]"))),C(t=>t.removeAttribute("data-md-scrollfix")),k(Qa),te(t=>T(t,"touchstart").pipe(oe(t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Li({viewport$:e,tablet$:t}){Y([Nt("search"),t]).pipe(f(([r,o])=>r&&!o),w(r=>j(r).pipe(Ee(r?400:100),J(B))),be(e)).subscribe(([r,{offset:{y:o}}])=>{r?bn(document.body,o):vn(document.body)})}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var Ye=qo(),Hr=tn(),jr=nn(),Fr=Xo(),ue=fn(),Jt=ct("(min-width: 960px)"),ki=ct("(min-width: 1220px)"),Ci=an(),Hi=se(),Ka=document.forms.namedItem("search")?(__search==null?void 0:__search.index)||xe(`${Hi.base}/search/search_index.json`):Z,Ir=new M;ci({alert$:Ir});Qt("navigation.instant")&&li({document$:Ye,location$:Hr,viewport$:ue});var Fi;((Fi=Hi.version)==null?void 0:Fi.provider)==="mike"&&bi();R(Hr,jr).pipe(Ee(125)).subscribe(()=>{Ie("drawer",!1),Ie("search",!1)});Fr.pipe(k(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=ae("[href][rel=prev]");typeof t!="undefined"&&t.click();break;case"n":case".":let r=ae("[href][rel=next]");typeof r!="undefined"&&r.click();break}});Mi({document$:Ye,tablet$:Jt});Ai({document$:Ye});Li({viewport$:ue,tablet$:Jt});var Pe=oi(Ce("header"),{viewport$:ue}),Yt=Ye.pipe(f(()=>Ce("main")),w(e=>ai(e,{viewport$:ue,header$:Pe})),re(1)),Ba=R(...me("dialog").map(e=>ri(e,{alert$:Ir})),...me("header").map(e=>ni(e,{viewport$:ue,header$:Pe,main$:Yt})),...me("palette").map(e=>si(e)),...me("search").map(e=>xi(e,{index$:Ka,keyboard$:Fr})),...me("source").map(e=>Ei(e))),Ja=we(()=>R(...me("content").map(e=>ti(e,{target$:jr,viewport$:ue,print$:Ci})),...me("header-title").map(e=>ii(e,{viewport$:ue,header$:Pe})),...me("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Er(ki,()=>Cr(e,{viewport$:ue,header$:Pe,main$:Yt})):Er(Jt,()=>Cr(e,{viewport$:ue,header$:Pe,main$:Yt}))),...me("tabs").map(e=>Ti(e,{viewport$:ue,header$:Pe})),...me("toc").map(e=>Oi(e,{viewport$:ue,header$:Pe})),...me("top").map(e=>_i(e,{viewport$:ue,main$:Yt})))),ji=Ye.pipe(w(()=>Ja),st(Ba),re(1));ji.subscribe();window.document$=Ye;window.location$=Hr;window.target$=jr;window.keyboard$=Fr;window.viewport$=ue;window.tablet$=Jt;window.screen$=ki;window.print$=Ci;window.alert$=Ir;window.component$=ji;})();
/*!
 * clipboard.js v2.0.8
 * https://clipboardjs.com/
 *
 * Licensed MIT © Zeno Rocha
 */
/*!
 * escape-html
 * Copyright(c) 2012-2013 TJ Holowaychuk
 * Copyright(c) 2015 Andreas Lubbe
 * Copyright(c) 2015 Tiancheng "Timothy" Gu
 * MIT Licensed
 */
/*! *****************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 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.
***************************************************************************** */
//# sourceMappingURL=bundle.a1609d9a.min.js.map

