"use strict";(()=>{var Ri=Object.create;var gr=Object.defineProperty;var ki=Object.getOwnPropertyDescriptor;var Hi=Object.getOwnPropertyNames,kt=Object.getOwnPropertySymbols,Pi=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,on=Object.prototype.propertyIsEnumerable;var nn=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&nn(e,r,t[r]);if(kt)for(var r of kt(t))on.call(t,r)&&nn(e,r,t[r]);return e};var an=(e,t)=>{var r={};for(var n in e)yr.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&kt)for(var n of kt(e))t.indexOf(n)<0&&on.call(e,n)&&(r[n]=e[n]);return r};var Ht=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var $i=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Hi(t))!yr.call(e,o)&&o!==r&&gr(e,o,{get:()=>t[o],enumerable:!(n=ki(t,o))||n.enumerable});return e};var yt=(e,t,r)=>(r=e!=null?Ri(Pi(e)):{},$i(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var cn=Ht((xr,sn)=>{(function(e,t){typeof xr=="object"&&typeof sn!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(xr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,s={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 a(T){return!!(T&&T!==document&&T.nodeName!=="HTML"&&T.nodeName!=="BODY"&&"classList"in T&&"contains"in T.classList)}function c(T){var Qe=T.type,De=T.tagName;return!!(De==="INPUT"&&s[Qe]&&!T.readOnly||De==="TEXTAREA"&&!T.readOnly||T.isContentEditable)}function f(T){T.classList.contains("focus-visible")||(T.classList.add("focus-visible"),T.setAttribute("data-focus-visible-added",""))}function u(T){T.hasAttribute("data-focus-visible-added")&&(T.classList.remove("focus-visible"),T.removeAttribute("data-focus-visible-added"))}function p(T){T.metaKey||T.altKey||T.ctrlKey||(a(r.activeElement)&&f(r.activeElement),n=!0)}function m(T){n=!1}function d(T){a(T.target)&&(n||c(T.target))&&f(T.target)}function h(T){a(T.target)&&(T.target.classList.contains("focus-visible")||T.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(T.target))}function v(T){document.visibilityState==="hidden"&&(o&&(n=!0),G())}function G(){document.addEventListener("mousemove",N),document.addEventListener("mousedown",N),document.addEventListener("mouseup",N),document.addEventListener("pointermove",N),document.addEventListener("pointerdown",N),document.addEventListener("pointerup",N),document.addEventListener("touchmove",N),document.addEventListener("touchstart",N),document.addEventListener("touchend",N)}function oe(){document.removeEventListener("mousemove",N),document.removeEventListener("mousedown",N),document.removeEventListener("mouseup",N),document.removeEventListener("pointermove",N),document.removeEventListener("pointerdown",N),document.removeEventListener("pointerup",N),document.removeEventListener("touchmove",N),document.removeEventListener("touchstart",N),document.removeEventListener("touchend",N)}function N(T){T.target.nodeName&&T.target.nodeName.toLowerCase()==="html"||(n=!1,oe())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",m,!0),document.addEventListener("pointerdown",m,!0),document.addEventListener("touchstart",m,!0),document.addEventListener("visibilitychange",v,!0),G(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!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 fn=Ht(Er=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(f){return!1}},r=t(),n=function(f){var u={next:function(){var p=f.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(f){return encodeURIComponent(f).replace(/%20/g,"+")},i=function(f){return decodeURIComponent(String(f).replace(/\+/g," "))},s=function(){var f=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var m=typeof p;if(m!=="undefined")if(m==="string")p!==""&&this._fromString(p);else if(p instanceof f){var d=this;p.forEach(function(oe,N){d.append(N,oe)})}else if(p!==null&&m==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;h<p.length;h++){var v=p[h];if(Object.prototype.toString.call(v)==="[object Array]"||v.length!==2)this.append(v[0],v[1]);else throw new TypeError("Expected [string, any] as entry at index "+h+" of URLSearchParams's input")}else for(var G in p)p.hasOwnProperty(G)&&this.append(G,p[G]);else throw new TypeError("Unsupported input's type for URLSearchParams")},u=f.prototype;u.append=function(p,m){p in this._entries?this._entries[p].push(String(m)):this._entries[p]=[String(m)]},u.delete=function(p){delete this._entries[p]},u.get=function(p){return p in this._entries?this._entries[p][0]:null},u.getAll=function(p){return p in this._entries?this._entries[p].slice(0):[]},u.has=function(p){return p in this._entries},u.set=function(p,m){this._entries[p]=[String(m)]},u.forEach=function(p,m){var d;for(var h in this._entries)if(this._entries.hasOwnProperty(h)){d=this._entries[h];for(var v=0;v<d.length;v++)p.call(m,d[v],h,this)}},u.keys=function(){var p=[];return this.forEach(function(m,d){p.push(d)}),n(p)},u.values=function(){var p=[];return this.forEach(function(m){p.push(m)}),n(p)},u.entries=function(){var p=[];return this.forEach(function(m,d){p.push([d,m])}),n(p)},r&&(u[Symbol.iterator]=u.entries),u.toString=function(){var p=[];return this.forEach(function(m,d){p.push(o(d)+"="+o(m))}),p.join("&")},e.URLSearchParams=f},a=function(){try{var f=e.URLSearchParams;return new f("?a=1").toString()==="a=1"&&typeof f.prototype.set=="function"&&typeof f.prototype.entries=="function"}catch(u){return!1}};a()||s();var c=e.URLSearchParams.prototype;typeof c.sort!="function"&&(c.sort=function(){var f=this,u=[];this.forEach(function(m,d){u.push([d,m]),f._entries||f.delete(d)}),u.sort(function(m,d){return m[0]<d[0]?-1:m[0]>d[0]?1:0}),f._entries&&(f._entries={});for(var p=0;p<u.length;p++)this.append(u[p][0],u[p][1])}),typeof c._fromString!="function"&&Object.defineProperty(c,"_fromString",{enumerable:!1,configurable:!1,writable:!1,value:function(f){if(this._entries)this._entries={};else{var u=[];this.forEach(function(h,v){u.push(v)});for(var p=0;p<u.length;p++)this.delete(u[p])}f=f.replace(/^\?/,"");for(var m=f.split("&"),d,p=0;p<m.length;p++)d=m[p].split("="),this.append(i(d[0]),d.length>1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(c,f){typeof c!="string"&&(c=String(c)),f&&typeof f!="string"&&(f=String(f));var u=document,p;if(f&&(e.location===void 0||f!==e.location.href)){f=f.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=f,u.head.appendChild(p);try{if(p.href.indexOf(f)!==0)throw new Error(p.href)}catch(T){throw new Error("URL unable to set base "+f+" due to "+T)}}var m=u.createElement("a");m.href=c,p&&(u.body.appendChild(m),m.href=m.href);var d=u.createElement("input");if(d.type="url",d.value=c,m.protocol===":"||!/:/.test(m.href)||!d.checkValidity()&&!f)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:m});var h=new e.URLSearchParams(this.search),v=!0,G=!0,oe=this;["append","delete","set"].forEach(function(T){var Qe=h[T];h[T]=function(){Qe.apply(h,arguments),v&&(G=!1,oe.search=h.toString(),G=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var N=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==N&&(N=this.search,G&&(v=!1,this.searchParams._fromString(this.search),v=!0))}})},s=i.prototype,a=function(c){Object.defineProperty(s,c,{get:function(){return this._anchorElement[c]},set:function(f){this._anchorElement[c]=f},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(c){a(c)}),Object.defineProperty(s,"search",{get:function(){return this._anchorElement.search},set:function(c){this._anchorElement.search=c,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(s,{toString:{get:function(){var c=this;return function(){return c.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(c){this._anchorElement.href=c,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(c){this._anchorElement.pathname=c},enumerable:!0},origin:{get:function(){var c={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],f=this._anchorElement.port!=c&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(f?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(c){},enumerable:!0},username:{get:function(){return""},set:function(c){},enumerable:!0}}),i.createObjectURL=function(c){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(c){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Er)});var Kr=Ht((Mt,qr)=>{/*!
 * clipboard.js v2.0.11
 * https://clipboardjs.com/
 *
 * Licensed MIT © Zeno Rocha
 */(function(t,r){typeof Mt=="object"&&typeof qr=="object"?qr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Mt=="object"?Mt.ClipboardJS=r():t.ClipboardJS=r()})(Mt,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return Ci}});var s=i(279),a=i.n(s),c=i(370),f=i.n(c),u=i(817),p=i.n(u);function m(j){try{return document.execCommand(j)}catch(O){return!1}}var d=function(O){var E=p()(O);return m("cut"),E},h=d;function v(j){var O=document.documentElement.getAttribute("dir")==="rtl",E=document.createElement("textarea");E.style.fontSize="12pt",E.style.border="0",E.style.padding="0",E.style.margin="0",E.style.position="absolute",E.style[O?"right":"left"]="-9999px";var H=window.pageYOffset||document.documentElement.scrollTop;return E.style.top="".concat(H,"px"),E.setAttribute("readonly",""),E.value=j,E}var G=function(O,E){var H=v(O);E.container.appendChild(H);var I=p()(H);return m("copy"),H.remove(),I},oe=function(O){var E=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},H="";return typeof O=="string"?H=G(O,E):O instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(O==null?void 0:O.type)?H=G(O.value,E):(H=p()(O),m("copy")),H},N=oe;function T(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?T=function(E){return typeof E}:T=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},T(j)}var Qe=function(){var O=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},E=O.action,H=E===void 0?"copy":E,I=O.container,q=O.target,Me=O.text;if(H!=="copy"&&H!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&T(q)==="object"&&q.nodeType===1){if(H==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(H==="cut"&&(q.hasAttribute("readonly")||q.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(Me)return N(Me,{container:I});if(q)return H==="cut"?h(q):N(q,{container:I})},De=Qe;function $e(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?$e=function(E){return typeof E}:$e=function(E){return E&&typeof Symbol=="function"&&E.constructor===Symbol&&E!==Symbol.prototype?"symbol":typeof E},$e(j)}function wi(j,O){if(!(j instanceof O))throw new TypeError("Cannot call a class as a function")}function rn(j,O){for(var E=0;E<O.length;E++){var H=O[E];H.enumerable=H.enumerable||!1,H.configurable=!0,"value"in H&&(H.writable=!0),Object.defineProperty(j,H.key,H)}}function Si(j,O,E){return O&&rn(j.prototype,O),E&&rn(j,E),j}function Ti(j,O){if(typeof O!="function"&&O!==null)throw new TypeError("Super expression must either be null or a function");j.prototype=Object.create(O&&O.prototype,{constructor:{value:j,writable:!0,configurable:!0}}),O&&br(j,O)}function br(j,O){return br=Object.setPrototypeOf||function(H,I){return H.__proto__=I,H},br(j,O)}function Oi(j){var O=Li();return function(){var H=Ct(j),I;if(O){var q=Ct(this).constructor;I=Reflect.construct(H,arguments,q)}else I=H.apply(this,arguments);return _i(this,I)}}function _i(j,O){return O&&($e(O)==="object"||typeof O=="function")?O:Mi(j)}function Mi(j){if(j===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return j}function Li(){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(j){return!1}}function Ct(j){return Ct=Object.setPrototypeOf?Object.getPrototypeOf:function(E){return E.__proto__||Object.getPrototypeOf(E)},Ct(j)}function vr(j,O){var E="data-clipboard-".concat(j);if(O.hasAttribute(E))return O.getAttribute(E)}var Ai=function(j){Ti(E,j);var O=Oi(E);function E(H,I){var q;return wi(this,E),q=O.call(this),q.resolveOptions(I),q.listenClick(H),q}return Si(E,[{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=$e(I.container)==="object"?I.container:document.body}},{key:"listenClick",value:function(I){var q=this;this.listener=f()(I,"click",function(Me){return q.onClick(Me)})}},{key:"onClick",value:function(I){var q=I.delegateTarget||I.currentTarget,Me=this.action(q)||"copy",Rt=De({action:Me,container:this.container,target:this.target(q),text:this.text(q)});this.emit(Rt?"success":"error",{action:Me,text:Rt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(I){return vr("action",I)}},{key:"defaultTarget",value:function(I){var q=vr("target",I);if(q)return document.querySelector(q)}},{key:"defaultText",value:function(I){return vr("text",I)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(I){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return N(I,q)}},{key:"cut",value:function(I){return h(I)}},{key:"isSupported",value:function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof I=="string"?[I]:I,Me=!!document.queryCommandSupported;return q.forEach(function(Rt){Me=Me&&!!document.queryCommandSupported(Rt)}),Me}}]),E}(a()),Ci=Ai},828:function(n){var o=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 s(a,c){for(;a&&a.nodeType!==o;){if(typeof a.matches=="function"&&a.matches(c))return a;a=a.parentNode}}n.exports=s},438:function(n,o,i){var s=i(828);function a(u,p,m,d,h){var v=f.apply(this,arguments);return u.addEventListener(m,v,h),{destroy:function(){u.removeEventListener(m,v,h)}}}function c(u,p,m,d,h){return typeof u.addEventListener=="function"?a.apply(null,arguments):typeof m=="function"?a.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(v){return a(v,p,m,d,h)}))}function f(u,p,m,d){return function(h){h.delegateTarget=s(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=c},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(n,o,i){var s=i(879),a=i(438);function c(m,d,h){if(!m&&!d&&!h)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(h))throw new TypeError("Third argument must be a Function");if(s.node(m))return f(m,d,h);if(s.nodeList(m))return u(m,d,h);if(s.string(m))return p(m,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function f(m,d,h){return m.addEventListener(d,h),{destroy:function(){m.removeEventListener(d,h)}}}function u(m,d,h){return Array.prototype.forEach.call(m,function(v){v.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(m,function(v){v.removeEventListener(d,h)})}}}function p(m,d,h){return a(document.body,m,d,h)}n.exports=c},817:function(n){function o(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),f=document.createRange();f.selectNodeContents(i),c.removeAllRanges(),c.addRange(f),s=c.toString()}return s}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,s,a){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var c=this;function f(){c.off(i,f),s.apply(a,arguments)}return f._=s,this.on(i,f,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),c=0,f=a.length;for(c;c<f;c++)a[c].fn.apply(a[c].ctx,s);return this},off:function(i,s){var a=this.e||(this.e={}),c=a[i],f=[];if(c&&s)for(var u=0,p=c.length;u<p;u++)c[u].fn!==s&&c[u].fn._!==s&&f.push(c[u]);return f.length?a[i]=f:delete a[i],this}},n.exports=o,n.exports.TinyEmitter=o}},t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={exports:{}};return e[n](o,o.exports,r),o.exports}return function(){r.n=function(n){var o=n&&n.__esModule?function(){return n.default}:function(){return n};return r.d(o,{a:o}),o}}(),function(){r.d=function(n,o){for(var i in o)r.o(o,i)&&!r.o(n,i)&&Object.defineProperty(n,i,{enumerable:!0,get:o[i]})}}(),function(){r.o=function(n,o){return Object.prototype.hasOwnProperty.call(n,o)}}(),r(686)}().default})});var Bo=Ht((ow,Go)=>{"use strict";/*!
 * escape-html
 * Copyright(c) 2012-2013 TJ Holowaychuk
 * Copyright(c) 2015 Andreas Lubbe
 * Copyright(c) 2015 Tiancheng "Timothy" Gu
 * MIT Licensed
 */var ns=/["'&<>]/;Go.exports=os;function os(e){var t=""+e,r=ns.exec(t);if(!r)return t;var n,o="",i=0,s=0;for(i=r.index;i<t.length;i++){switch(t.charCodeAt(i)){case 34:n="&quot;";break;case 38:n="&amp;";break;case 39:n="&#39;";break;case 60:n="&lt;";break;case 62:n="&gt;";break;default:continue}s!==i&&(o+=t.substring(s,i)),s=i+1,o+=n}return s!==i?o+t.substring(s,i):o}});Array.prototype.flat||Object.defineProperty(Array.prototype,"flat",{configurable:!0,value:function e(){var t=isNaN(arguments[0])?1:Number(arguments[0]);return t?Array.prototype.reduce.call(this,function(r,n){return Array.isArray(n)?r.push.apply(r,e.call(n,t-1)):r.push(n),r},[]):Array.prototype.slice.call(this)},writable:!0}),Array.prototype.flatMap||Object.defineProperty(Array.prototype,"flatMap",{configurable:!0,value:function(e){return Array.prototype.map.apply(this,arguments).flat()},writable:!0});var kO=yt(cn());self.fetch||(self.fetch=function(e,t){return t=t||{},new Promise(function(r,n){var o=new XMLHttpRequest,i=[],s={},a=function f(){return{ok:(o.status/100|0)==2,statusText:o.statusText,status:o.status,url:o.responseURL,text:function(){return Promise.resolve(o.responseText)},json:function(){return Promise.resolve(o.responseText).then(JSON.parse)},blob:function(){return Promise.resolve(new Blob([o.response]))},clone:f,headers:{keys:function(){return i},entries:function(){return i.map(function(u){return[u,o.getResponseHeader(u)]})},get:function(u){return o.getResponseHeader(u)},has:function(u){return o.getResponseHeader(u)!=null}}}};for(var c in o.open(t.method||"get",e,!0),o.onload=function(){o.getAllResponseHeaders().toLowerCase().replace(/^(.+?):/gm,function(f,u){s[u]||i.push(s[u]=u)}),r(a())},o.onerror=n,o.withCredentials=t.credentials=="include",t.headers)o.setRequestHeader(c,t.headers[c]);o.send(t.body||null)})});var PO=yt(fn());/*! *****************************************************************************
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.
***************************************************************************** */var wr=function(e,t){return wr=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,n){r.__proto__=n}||function(r,n){for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(r[o]=n[o])},wr(e,t)};function ie(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");wr(e,t);function r(){this.constructor=e}e.prototype=t===null?Object.create(t):(r.prototype=t.prototype,new r)}function un(e,t,r,n){function o(i){return i instanceof r?i:new r(function(s){s(i)})}return new(r||(r=Promise))(function(i,s){function a(u){try{f(n.next(u))}catch(p){s(p)}}function c(u){try{f(n.throw(u))}catch(p){s(p)}}function f(u){u.done?i(u.value):o(u.value).then(a,c)}f((n=n.apply(e,t||[])).next())})}function Pt(e,t){var r={label:0,sent:function(){if(i[0]&1)throw i[1];return i[1]},trys:[],ops:[]},n,o,i,s;return s={next:a(0),throw:a(1),return:a(2)},typeof Symbol=="function"&&(s[Symbol.iterator]=function(){return this}),s;function a(f){return function(u){return c([f,u])}}function c(f){if(n)throw new TypeError("Generator is already executing.");for(;r;)try{if(n=1,o&&(i=f[0]&2?o.return:f[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,f[1])).done)return i;switch(o=0,i&&(f=[f[0]&2,i.value]),f[0]){case 0:case 1:i=f;break;case 4:return r.label++,{value:f[1],done:!1};case 5:r.label++,o=f[1],f=[0];continue;case 7:f=r.ops.pop(),r.trys.pop();continue;default:if(i=r.trys,!(i=i.length>0&&i[i.length-1])&&(f[0]===6||f[0]===2)){r=0;continue}if(f[0]===3&&(!i||f[1]>i[0]&&f[1]<i[3])){r.label=f[1];break}if(f[0]===6&&r.label<i[1]){r.label=i[1],i=f;break}if(i&&r.label<i[2]){r.label=i[2],r.ops.push(f);break}i[2]&&r.ops.pop(),r.trys.pop();continue}f=t.call(e,r)}catch(u){f=[6,u],o=0}finally{n=i=0}if(f[0]&5)throw f[1];return{value:f[0]?f[1]:void 0,done:!0}}}function Ee(e){var t=typeof Symbol=="function"&&Symbol.iterator,r=t&&e[t],n=0;if(r)return r.call(e);if(e&&typeof e.length=="number")return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function W(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var n=r.call(e),o,i=[],s;try{for(;(t===void 0||t-- >0)&&!(o=n.next()).done;)i.push(o.value)}catch(a){s={error:a}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(s)throw s.error}}return i}function D(e,t,r){if(r||arguments.length===2)for(var n=0,o=t.length,i;n<o;n++)(i||!(n in t))&&(i||(i=Array.prototype.slice.call(t,0,n)),i[n]=t[n]);return e.concat(i||Array.prototype.slice.call(t))}function et(e){return this instanceof et?(this.v=e,this):new et(e)}function pn(e,t,r){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n=r.apply(e,t||[]),o,i=[];return o={},s("next"),s("throw"),s("return"),o[Symbol.asyncIterator]=function(){return this},o;function s(m){n[m]&&(o[m]=function(d){return new Promise(function(h,v){i.push([m,d,h,v])>1||a(m,d)})})}function a(m,d){try{c(n[m](d))}catch(h){p(i[0][3],h)}}function c(m){m.value instanceof et?Promise.resolve(m.value.v).then(f,u):p(i[0][2],m)}function f(m){a("next",m)}function u(m){a("throw",m)}function p(m,d){m(d),i.shift(),i.length&&a(i[0][0],i[0][1])}}function ln(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 Ee=="function"?Ee(e):e[Symbol.iterator](),r={},n("next"),n("throw"),n("return"),r[Symbol.asyncIterator]=function(){return this},r);function n(i){r[i]=e[i]&&function(s){return new Promise(function(a,c){s=e[i](s),o(a,c,s.done,s.value)})}}function o(i,s,a,c){Promise.resolve(c).then(function(f){i({value:f,done:a})},s)}}function A(e){return typeof e=="function"}function at(e){var t=function(n){Error.call(n),n.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var $t=at(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription:
`+r.map(function(n,o){return o+1+") "+n.toString()}).join(`
  `):"",this.name="UnsubscriptionError",this.errors=r}});function Ve(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._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,n,o,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Ee(s),c=a.next();!c.done;c=a.next()){var f=c.value;f.remove(this)}}catch(v){t={error:v}}finally{try{c&&!c.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var u=this.initialTeardown;if(A(u))try{u()}catch(v){i=v instanceof $t?v.errors:[v]}var p=this._finalizers;if(p){this._finalizers=null;try{for(var m=Ee(p),d=m.next();!d.done;d=m.next()){var h=d.value;try{mn(h)}catch(v){i=i!=null?i:[],v instanceof $t?i=D(D([],W(i)),W(v.errors)):i.push(v)}}}catch(v){n={error:v}}finally{try{d&&!d.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}}if(i)throw new $t(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)mn(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)&&Ve(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ve(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Sr=Ie.EMPTY;function It(e){return e instanceof Ie||e&&"closed"in e&&A(e.remove)&&A(e.add)&&A(e.unsubscribe)}function mn(e){A(e)?e():e.unsubscribe()}var Le={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var st={setTimeout:function(e,t){for(var r=[],n=2;n<arguments.length;n++)r[n-2]=arguments[n];var o=st.delegate;return o!=null&&o.setTimeout?o.setTimeout.apply(o,D([e,t],W(r))):setTimeout.apply(void 0,D([e,t],W(r)))},clearTimeout:function(e){var t=st.delegate;return((t==null?void 0:t.clearTimeout)||clearTimeout)(e)},delegate:void 0};function jt(e){st.setTimeout(function(){var t=Le.onUnhandledError;if(t)t(e);else throw e})}function we(){}var dn=function(){return Tr("C",void 0,void 0)}();function hn(e){return Tr("E",void 0,e)}function bn(e){return Tr("N",e,void 0)}function Tr(e,t,r){return{kind:e,value:t,error:r}}var tt=null;function ct(e){if(Le.useDeprecatedSynchronousErrorHandling){var t=!tt;if(t&&(tt={errorThrown:!1,error:null}),e(),t){var r=tt,n=r.errorThrown,o=r.error;if(tt=null,n)throw o}}else e()}function vn(e){Le.useDeprecatedSynchronousErrorHandling&&tt&&(tt.errorThrown=!0,tt.error=e)}var xt=function(e){ie(t,e);function t(r){var n=e.call(this)||this;return n.isStopped=!1,r?(n.destination=r,It(r)&&r.add(n)):n.destination=Ui,n}return t.create=function(r,n,o){return new rt(r,n,o)},t.prototype.next=function(r){this.isStopped?_r(bn(r),this):this._next(r)},t.prototype.error=function(r){this.isStopped?_r(hn(r),this):(this.isStopped=!0,this._error(r))},t.prototype.complete=function(){this.isStopped?_r(dn,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 Ii=Function.prototype.bind;function Or(e,t){return Ii.call(e,t)}var ji=function(){function e(t){this.partialObserver=t}return e.prototype.next=function(t){var r=this.partialObserver;if(r.next)try{r.next(t)}catch(n){Ft(n)}},e.prototype.error=function(t){var r=this.partialObserver;if(r.error)try{r.error(t)}catch(n){Ft(n)}else Ft(t)},e.prototype.complete=function(){var t=this.partialObserver;if(t.complete)try{t.complete()}catch(r){Ft(r)}},e}(),rt=function(e){ie(t,e);function t(r,n,o){var i=e.call(this)||this,s;if(A(r)||!r)s={next:r!=null?r:void 0,error:n!=null?n:void 0,complete:o!=null?o:void 0};else{var a;i&&Le.useDeprecatedNextContext?(a=Object.create(r),a.unsubscribe=function(){return i.unsubscribe()},s={next:r.next&&Or(r.next,a),error:r.error&&Or(r.error,a),complete:r.complete&&Or(r.complete,a)}):s=r}return i.destination=new ji(s),i}return t}(xt);function Ft(e){Le.useDeprecatedSynchronousErrorHandling?vn(e):jt(e)}function Fi(e){throw e}function _r(e,t){var r=Le.onStoppedNotification;r&&st.setTimeout(function(){return r(e,t)})}var Ui={closed:!0,next:we,error:Fi,complete:we};var ft=function(){return typeof Symbol=="function"&&Symbol.observable||"@@observable"}();function de(e){return e}function gn(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Mr(e)}function Mr(e){return e.length===0?de:e.length===1?e[0]:function(r){return e.reduce(function(n,o){return o(n)},r)}}var F=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,n){var o=this,i=Di(t)?t:new rt(t,r,n);return ct(function(){var s=o,a=s.operator,c=s.source;i.add(a?a.call(i,c):c?o._subscribe(i):o._trySubscribe(i))}),i},e.prototype._trySubscribe=function(t){try{return this._subscribe(t)}catch(r){t.error(r)}},e.prototype.forEach=function(t,r){var n=this;return r=yn(r),new r(function(o,i){var s=new rt({next:function(a){try{t(a)}catch(c){i(c),s.unsubscribe()}},error:i,complete:o});n.subscribe(s)})},e.prototype._subscribe=function(t){var r;return(r=this.source)===null||r===void 0?void 0:r.subscribe(t)},e.prototype[ft]=function(){return this},e.prototype.pipe=function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];return Mr(t)(this)},e.prototype.toPromise=function(t){var r=this;return t=yn(t),new t(function(n,o){var i;r.subscribe(function(s){return i=s},function(s){return o(s)},function(){return n(i)})})},e.create=function(t){return new e(t)},e}();function yn(e){var t;return(t=e!=null?e:Le.Promise)!==null&&t!==void 0?t:Promise}function Wi(e){return e&&A(e.next)&&A(e.error)&&A(e.complete)}function Di(e){return e&&e instanceof xt||Wi(e)&&It(e)}function Vi(e){return A(e==null?void 0:e.lift)}function y(e){return function(t){if(Vi(t))return t.lift(function(r){try{return e(r,this)}catch(n){this.error(n)}});throw new TypeError("Unable to lift unknown Observable type")}}function w(e,t,r,n,o){return new zi(e,t,r,n,o)}var zi=function(e){ie(t,e);function t(r,n,o,i,s,a){var c=e.call(this,r)||this;return c.onFinalize=s,c.shouldUnsubscribe=a,c._next=n?function(f){try{n(f)}catch(u){r.error(u)}}:e.prototype._next,c._error=i?function(f){try{i(f)}catch(u){r.error(u)}finally{this.unsubscribe()}}:e.prototype._error,c._complete=o?function(){try{o()}catch(f){r.error(f)}finally{this.unsubscribe()}}:e.prototype._complete,c}return t.prototype.unsubscribe=function(){var r;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){var n=this.closed;e.prototype.unsubscribe.call(this),!n&&((r=this.onFinalize)===null||r===void 0||r.call(this))}},t}(xt);var ut={schedule:function(e){var t=requestAnimationFrame,r=cancelAnimationFrame,n=ut.delegate;n&&(t=n.requestAnimationFrame,r=n.cancelAnimationFrame);var o=t(function(i){r=void 0,e(i)});return new Ie(function(){return r==null?void 0:r(o)})},requestAnimationFrame:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=ut.delegate;return((r==null?void 0:r.requestAnimationFrame)||requestAnimationFrame).apply(void 0,D([],W(e)))},cancelAnimationFrame:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=ut.delegate;return((r==null?void 0:r.cancelAnimationFrame)||cancelAnimationFrame).apply(void 0,D([],W(e)))},delegate:void 0};var xn=at(function(e){return function(){e(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"}});var x=function(e){ie(t,e);function t(){var r=e.call(this)||this;return r.closed=!1,r.currentObservers=null,r.observers=[],r.isStopped=!1,r.hasError=!1,r.thrownError=null,r}return t.prototype.lift=function(r){var n=new En(this,this);return n.operator=r,n},t.prototype._throwIfClosed=function(){if(this.closed)throw new xn},t.prototype.next=function(r){var n=this;ct(function(){var o,i;if(n._throwIfClosed(),!n.isStopped){n.currentObservers||(n.currentObservers=Array.from(n.observers));try{for(var s=Ee(n.currentObservers),a=s.next();!a.done;a=s.next()){var c=a.value;c.next(r)}}catch(f){o={error:f}}finally{try{a&&!a.done&&(i=s.return)&&i.call(s)}finally{if(o)throw o.error}}}})},t.prototype.error=function(r){var n=this;ct(function(){if(n._throwIfClosed(),!n.isStopped){n.hasError=n.isStopped=!0,n.thrownError=r;for(var o=n.observers;o.length;)o.shift().error(r)}})},t.prototype.complete=function(){var r=this;ct(function(){if(r._throwIfClosed(),!r.isStopped){r.isStopped=!0;for(var n=r.observers;n.length;)n.shift().complete()}})},t.prototype.unsubscribe=function(){this.isStopped=this.closed=!0,this.observers=this.currentObservers=null},Object.defineProperty(t.prototype,"observed",{get:function(){var r;return((r=this.observers)===null||r===void 0?void 0:r.length)>0},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 n=this,o=this,i=o.hasError,s=o.isStopped,a=o.observers;return i||s?Sr:(this.currentObservers=null,a.push(r),new Ie(function(){n.currentObservers=null,Ve(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,s=n.isStopped;o?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,n){return new En(r,n)},t}(F);var En=function(e){ie(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Sr},t}(x);var Et={now:function(){return(Et.delegate||Date).now()},delegate:void 0};var wt=function(e){ie(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=Et);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,s=n._infiniteTimeWindow,a=n._timestampProvider,c=n._windowTime;o||(i.push(r),!s&&i.push(a.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,s=o._buffer,a=s.slice(),c=0;c<a.length&&!r.closed;c+=i?1:2)r.next(a[c]);return this._checkFinalizedStatuses(r),n},t.prototype._trimBuffer=function(){var r=this,n=r._bufferSize,o=r._timestampProvider,i=r._buffer,s=r._infiniteTimeWindow,a=(s?1:2)*n;if(n<1/0&&a<i.length&&i.splice(0,i.length-a),!s){for(var c=o.now(),f=0,u=1;u<i.length&&i[u]<=c;u+=2)f=u;f&&i.splice(0,f+1)}},t}(x);var wn=function(e){ie(t,e);function t(r,n){return e.call(this)||this}return t.prototype.schedule=function(r,n){return n===void 0&&(n=0),this},t}(Ie);var St={setInterval:function(e,t){for(var r=[],n=2;n<arguments.length;n++)r[n-2]=arguments[n];var o=St.delegate;return o!=null&&o.setInterval?o.setInterval.apply(o,D([e,t],W(r))):setInterval.apply(void 0,D([e,t],W(r)))},clearInterval:function(e){var t=St.delegate;return((t==null?void 0:t.clearInterval)||clearInterval)(e)},delegate:void 0};var Ut=function(e){ie(t,e);function t(r,n){var o=e.call(this,r,n)||this;return o.scheduler=r,o.work=n,o.pending=!1,o}return t.prototype.schedule=function(r,n){var o;if(n===void 0&&(n=0),this.closed)return this;this.state=r;var i=this.id,s=this.scheduler;return i!=null&&(this.id=this.recycleAsyncId(s,i,n)),this.pending=!0,this.delay=n,this.id=(o=this.id)!==null&&o!==void 0?o:this.requestAsyncId(s,this.id,n),this},t.prototype.requestAsyncId=function(r,n,o){return o===void 0&&(o=0),St.setInterval(r.flush.bind(r,this),o)},t.prototype.recycleAsyncId=function(r,n,o){if(o===void 0&&(o=0),o!=null&&this.delay===o&&this.pending===!1)return n;n!=null&&St.clearInterval(n)},t.prototype.execute=function(r,n){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var o=this._execute(r,n);if(o)return o;this.pending===!1&&this.id!=null&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},t.prototype._execute=function(r,n){var o=!1,i;try{this.work(r)}catch(s){o=!0,i=s||new Error("Scheduled action threw falsy error")}if(o)return this.unsubscribe(),i},t.prototype.unsubscribe=function(){if(!this.closed){var r=this,n=r.id,o=r.scheduler,i=o.actions;this.work=this.state=this.scheduler=null,this.pending=!1,Ve(i,this),n!=null&&(this.id=this.recycleAsyncId(o,n,null)),this.delay=null,e.prototype.unsubscribe.call(this)}},t}(wn);var Lr=function(){function e(t,r){r===void 0&&(r=e.now),this.schedulerActionCtor=t,this.now=r}return e.prototype.schedule=function(t,r,n){return r===void 0&&(r=0),new this.schedulerActionCtor(this,t).schedule(n,r)},e.now=Et.now,e}();var Wt=function(e){ie(t,e);function t(r,n){n===void 0&&(n=Lr.now);var o=e.call(this,r,n)||this;return o.actions=[],o._active=!1,o}return t.prototype.flush=function(r){var n=this.actions;if(this._active){n.push(r);return}var o;this._active=!0;do if(o=r.execute(r.state,r.delay))break;while(r=n.shift());if(this._active=!1,o){for(;r=n.shift();)r.unsubscribe();throw o}},t}(Lr);var ae=new Wt(Ut),Ar=ae;var Sn=function(e){ie(t,e);function t(r,n){var o=e.call(this,r,n)||this;return o.scheduler=r,o.work=n,o}return t.prototype.requestAsyncId=function(r,n,o){return o===void 0&&(o=0),o!==null&&o>0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=ut.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var s=r.actions;n!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==n&&(ut.cancelAnimationFrame(n),r._scheduled=void 0)},t}(Ut);var Tn=function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Wt);var Te=new Tn(Sn);var _=new F(function(e){return e.complete()});function Dt(e){return e&&A(e.schedule)}function Cr(e){return e[e.length-1]}function Ye(e){return A(Cr(e))?e.pop():void 0}function Oe(e){return Dt(Cr(e))?e.pop():void 0}function Vt(e,t){return typeof Cr(e)=="number"?e.pop():t}var pt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function zt(e){return A(e==null?void 0:e.then)}function Nt(e){return A(e[ft])}function qt(e){return Symbol.asyncIterator&&A(e==null?void 0:e[Symbol.asyncIterator])}function Kt(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 Ni(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Qt=Ni();function Yt(e){return A(e==null?void 0:e[Qt])}function Gt(e){return pn(this,arguments,function(){var r,n,o,i;return Pt(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,et(r.read())];case 3:return n=s.sent(),o=n.value,i=n.done,i?[4,et(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,et(o)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function Bt(e){return A(e==null?void 0:e.getReader)}function U(e){if(e instanceof F)return e;if(e!=null){if(Nt(e))return qi(e);if(pt(e))return Ki(e);if(zt(e))return Qi(e);if(qt(e))return On(e);if(Yt(e))return Yi(e);if(Bt(e))return Gi(e)}throw Kt(e)}function qi(e){return new F(function(t){var r=e[ft]();if(A(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Ki(e){return new F(function(t){for(var r=0;r<e.length&&!t.closed;r++)t.next(e[r]);t.complete()})}function Qi(e){return new F(function(t){e.then(function(r){t.closed||(t.next(r),t.complete())},function(r){return t.error(r)}).then(null,jt)})}function Yi(e){return new F(function(t){var r,n;try{for(var o=Ee(e),i=o.next();!i.done;i=o.next()){var s=i.value;if(t.next(s),t.closed)return}}catch(a){r={error:a}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}t.complete()})}function On(e){return new F(function(t){Bi(e,t).catch(function(r){return t.error(r)})})}function Gi(e){return On(Gt(e))}function Bi(e,t){var r,n,o,i;return un(this,void 0,void 0,function(){var s,a;return Pt(this,function(c){switch(c.label){case 0:c.trys.push([0,5,6,11]),r=ln(e),c.label=1;case 1:return[4,r.next()];case 2:if(n=c.sent(),!!n.done)return[3,4];if(s=n.value,t.next(s),t.closed)return[2];c.label=3;case 3:return[3,1];case 4:return[3,11];case 5:return a=c.sent(),o={error:a},[3,11];case 6:return c.trys.push([6,,9,10]),n&&!n.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(o)throw o.error;return[7];case 10:return[7];case 11:return t.complete(),[2]}})})}function ve(e,t,r,n,o){n===void 0&&(n=0),o===void 0&&(o=!1);var i=t.schedule(function(){r(),o?e.add(this.schedule(null,n)):this.unsubscribe()},n);if(e.add(i),!o)return i}function Ae(e,t){return t===void 0&&(t=0),y(function(r,n){r.subscribe(w(n,function(o){return ve(n,e,function(){return n.next(o)},t)},function(){return ve(n,e,function(){return n.complete()},t)},function(o){return ve(n,e,function(){return n.error(o)},t)}))})}function nt(e,t){return t===void 0&&(t=0),y(function(r,n){n.add(e.schedule(function(){return r.subscribe(n)},t))})}function _n(e,t){return U(e).pipe(nt(t),Ae(t))}function Mn(e,t){return U(e).pipe(nt(t),Ae(t))}function Ln(e,t){return new F(function(r){var n=0;return t.schedule(function(){n===e.length?r.complete():(r.next(e[n++]),r.closed||this.schedule())})})}function An(e,t){return new F(function(r){var n;return ve(r,t,function(){n=e[Qt](),ve(r,t,function(){var o,i,s;try{o=n.next(),i=o.value,s=o.done}catch(a){r.error(a);return}s?r.complete():r.next(i)},0,!0)}),function(){return A(n==null?void 0:n.return)&&n.return()}})}function Jt(e,t){if(!e)throw new Error("Iterable cannot be null");return new F(function(r){ve(r,t,function(){var n=e[Symbol.asyncIterator]();ve(r,t,function(){n.next().then(function(o){o.done?r.complete():r.next(o.value)})},0,!0)})})}function Cn(e,t){return Jt(Gt(e),t)}function Rn(e,t){if(e!=null){if(Nt(e))return _n(e,t);if(pt(e))return Ln(e,t);if(zt(e))return Mn(e,t);if(qt(e))return Jt(e,t);if(Yt(e))return An(e,t);if(Bt(e))return Cn(e,t)}throw Kt(e)}function ue(e,t){return t?Rn(e,t):U(e)}function k(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=Oe(e);return ue(e,r)}function Tt(e,t){var r=A(e)?e:function(){return e},n=function(o){return o.error(r())};return new F(t?function(o){return t.schedule(n,0,o)}:n)}var Xt=at(function(e){return function(){e(this),this.name="EmptyError",this.message="no elements in sequence"}});function kn(e){return e instanceof Date&&!isNaN(e)}function l(e,t){return y(function(r,n){var o=0;r.subscribe(w(n,function(i){n.next(e.call(t,i,o++))}))})}var Ji=Array.isArray;function Xi(e,t){return Ji(t)?e.apply(void 0,D([],W(t))):e(t)}function Ge(e){return l(function(t){return Xi(e,t)})}var Zi=Array.isArray,ea=Object.getPrototypeOf,ta=Object.prototype,ra=Object.keys;function Hn(e){if(e.length===1){var t=e[0];if(Zi(t))return{args:t,keys:null};if(na(t)){var r=ra(t);return{args:r.map(function(n){return t[n]}),keys:r}}}return{args:e,keys:null}}function na(e){return e&&typeof e=="object"&&ea(e)===ta}function Pn(e,t){return e.reduce(function(r,n,o){return r[n]=t[o],r},{})}function Q(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=Oe(e),n=Ye(e),o=Hn(e),i=o.args,s=o.keys;if(i.length===0)return ue([],r);var a=new F(Rr(i,r,s?function(c){return Pn(s,c)}:de));return n?a.pipe(Ge(n)):a}function Rr(e,t,r){return r===void 0&&(r=de),function(n){$n(t,function(){for(var o=e.length,i=new Array(o),s=o,a=o,c=function(u){$n(t,function(){var p=ue(e[u],t),m=!1;p.subscribe(w(n,function(d){i[u]=d,m||(m=!0,a--),a||n.next(r(i.slice()))},function(){--s||n.complete()}))},n)},f=0;f<o;f++)c(f)},n)}}function $n(e,t,r){e?ve(r,e,t):t()}function In(e,t,r,n,o,i,s,a){var c=[],f=0,u=0,p=!1,m=function(){p&&!c.length&&!f&&t.complete()},d=function(v){return f<n?h(v):c.push(v)},h=function(v){i&&t.next(v),f++;var G=!1;U(r(v,u++)).subscribe(w(t,function(oe){o==null||o(oe),i?d(oe):t.next(oe)},function(){G=!0},void 0,function(){if(G)try{f--;for(var oe=function(){var N=c.shift();s?ve(t,s,function(){return h(N)}):h(N)};c.length&&f<n;)oe();m()}catch(N){t.error(N)}}))};return e.subscribe(w(t,d,function(){p=!0,m()})),function(){a==null||a()}}function se(e,t,r){return r===void 0&&(r=1/0),A(t)?se(function(n,o){return l(function(i,s){return t(n,i,o,s)})(U(e(n,o)))},r):(typeof t=="number"&&(r=t),y(function(n,o){return In(n,o,e,r)}))}function lt(e){return e===void 0&&(e=1/0),se(de,e)}function jn(){return lt(1)}function je(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return jn()(ue(e,Oe(e)))}function $(e){return new F(function(t){U(e()).subscribe(t)})}var oa=["addListener","removeListener"],ia=["addEventListener","removeEventListener"],aa=["on","off"];function b(e,t,r,n){if(A(r)&&(n=r,r=void 0),n)return b(e,t,r).pipe(Ge(n));var o=W(fa(e)?ia.map(function(a){return function(c){return e[a](t,c,r)}}):sa(e)?oa.map(Fn(e,t)):ca(e)?aa.map(Fn(e,t)):[],2),i=o[0],s=o[1];if(!i&&pt(e))return se(function(a){return b(a,t,r)})(U(e));if(!i)throw new TypeError("Invalid event target");return new F(function(a){var c=function(){for(var f=[],u=0;u<arguments.length;u++)f[u]=arguments[u];return a.next(1<f.length?f:f[0])};return i(c),function(){return s(c)}})}function Fn(e,t){return function(r){return function(n){return e[r](t,n)}}}function sa(e){return A(e.addListener)&&A(e.removeListener)}function ca(e){return A(e.on)&&A(e.off)}function fa(e){return A(e.addEventListener)&&A(e.removeEventListener)}function Zt(e,t,r){return r?Zt(e,t).pipe(Ge(r)):new F(function(n){var o=function(){for(var s=[],a=0;a<arguments.length;a++)s[a]=arguments[a];return n.next(s.length===1?s[0]:s)},i=e(o);return A(t)?function(){return t(o,i)}:void 0})}function Be(e,t,r){e===void 0&&(e=0),r===void 0&&(r=Ar);var n=-1;return t!=null&&(Dt(t)?r=t:n=t),new F(function(o){var i=kn(e)?+e-r.now():e;i<0&&(i=0);var s=0;return r.schedule(function(){o.closed||(o.next(s++),0<=n?this.schedule(void 0,n):o.complete())},i)})}function C(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=Oe(e),n=Vt(e,1/0),o=e;return o.length?o.length===1?U(o[0]):lt(n)(ue(o,r)):_}var ze=new F(we);var ua=Array.isArray;function mt(e){return e.length===1&&ua(e[0])?e[0]:e}function L(e,t){return y(function(r,n){var o=0;r.subscribe(w(n,function(i){return e.call(t,i,o++)&&n.next(i)}))})}function Ot(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=Ye(e),n=mt(e);return n.length?new F(function(o){var i=n.map(function(){return[]}),s=n.map(function(){return!1});o.add(function(){i=s=null});for(var a=function(f){U(n[f]).subscribe(w(o,function(u){if(i[f].push(u),i.every(function(m){return m.length})){var p=i.map(function(m){return m.shift()});o.next(r?r.apply(void 0,D([],W(p))):p),i.some(function(m,d){return!m.length&&s[d]})&&o.complete()}},function(){s[f]=!0,!i[f].length&&o.complete()}))},c=0;!o.closed&&c<n.length;c++)a(c);return function(){i=s=null}}):_}function Un(e){return y(function(t,r){var n=!1,o=null,i=null,s=!1,a=function(){if(i==null||i.unsubscribe(),i=null,n){n=!1;var f=o;o=null,r.next(f)}s&&r.complete()},c=function(){i=null,s&&r.complete()};t.subscribe(w(r,function(f){n=!0,o=f,i||U(e(f)).subscribe(i=w(r,a,c))},function(){s=!0,(!n||!i||i.closed)&&r.complete()}))})}function Ce(e,t){return t===void 0&&(t=ae),Un(function(){return Be(e,t)})}function Re(e,t){return t===void 0&&(t=null),t=t!=null?t:e,y(function(r,n){var o=[],i=0;r.subscribe(w(n,function(s){var a,c,f,u,p=null;i++%t===0&&o.push([]);try{for(var m=Ee(o),d=m.next();!d.done;d=m.next()){var h=d.value;h.push(s),e<=h.length&&(p=p!=null?p:[],p.push(h))}}catch(oe){a={error:oe}}finally{try{d&&!d.done&&(c=m.return)&&c.call(m)}finally{if(a)throw a.error}}if(p)try{for(var v=Ee(p),G=v.next();!G.done;G=v.next()){var h=G.value;Ve(o,h),n.next(h)}}catch(oe){f={error:oe}}finally{try{G&&!G.done&&(u=v.return)&&u.call(v)}finally{if(f)throw f.error}}},function(){var s,a;try{for(var c=Ee(o),f=c.next();!f.done;f=c.next()){var u=f.value;n.next(u)}}catch(p){s={error:p}}finally{try{f&&!f.done&&(a=c.return)&&a.call(c)}finally{if(s)throw s.error}}n.complete()},void 0,function(){o=null}))})}function fe(e){return y(function(t,r){var n=null,o=!1,i;n=t.subscribe(w(r,void 0,void 0,function(s){i=U(e(s,fe(e)(t))),n?(n.unsubscribe(),n=null,i.subscribe(r)):o=!0})),o&&(n.unsubscribe(),n=null,i.subscribe(r))})}function Wn(e,t,r,n,o){return function(i,s){var a=r,c=t,f=0;i.subscribe(w(s,function(u){var p=f++;c=a?e(c,u,p):(a=!0,u),n&&s.next(c)},o&&function(){a&&s.next(c),s.complete()}))}}function kr(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=Ye(e);return r?gn(kr.apply(void 0,D([],W(e))),Ge(r)):y(function(n,o){Rr(D([n],W(mt(e))))(o)})}function Je(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return kr.apply(void 0,D([],W(e)))}function ke(e,t){return t===void 0&&(t=ae),y(function(r,n){var o=null,i=null,s=null,a=function(){if(o){o.unsubscribe(),o=null;var f=i;i=null,n.next(f)}};function c(){var f=s+e,u=t.now();if(u<f){o=this.schedule(void 0,f-u),n.add(o);return}a()}r.subscribe(w(n,function(f){i=f,s=t.now(),o||(o=t.schedule(c,e),n.add(o))},function(){a(),n.complete()},void 0,function(){i=o=null}))})}function He(e){return y(function(t,r){var n=!1;t.subscribe(w(r,function(o){n=!0,r.next(o)},function(){n||r.next(e),r.complete()}))})}function ge(e){return e<=0?function(){return _}:y(function(t,r){var n=0;t.subscribe(w(r,function(o){++n<=e&&(r.next(o),e<=n&&r.complete())}))})}function X(){return y(function(e,t){e.subscribe(w(t,we))})}function Dn(e){return l(function(){return e})}function Hr(e,t){return t?function(r){return je(t.pipe(ge(1),X()),r.pipe(Hr(e)))}:se(function(r,n){return U(e(r,n)).pipe(ge(1),Dn(r))})}function Ne(e,t){t===void 0&&(t=ae);var r=Be(e,t);return Hr(function(){return r})}function B(e,t){return t===void 0&&(t=de),e=e!=null?e:pa,y(function(r,n){var o,i=!0;r.subscribe(w(n,function(s){var a=t(s);(i||!e(o,a))&&(i=!1,o=a,n.next(s))}))})}function pa(e,t){return e===t}function Z(e,t){return B(function(r,n){return t?t(r[e],n[e]):r[e]===n[e]})}function Vn(e){return e===void 0&&(e=la),y(function(t,r){var n=!1;t.subscribe(w(r,function(o){n=!0,r.next(o)},function(){return n?r.complete():r.error(e())}))})}function la(){return new Xt}function ee(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return function(r){return je(r,k.apply(void 0,D([],W(e))))}}function R(e){return y(function(t,r){try{t.subscribe(r)}finally{r.add(e)}})}function Pe(e,t){var r=arguments.length>=2;return function(n){return n.pipe(e?L(function(o,i){return e(o,i,n)}):de,ge(1),r?He(t):Vn(function(){return new Xt}))}}function zn(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=Oe(e),n=Vt(e,1/0);return e=mt(e),y(function(o,i){lt(n)(ue(D([o],W(e)),r)).subscribe(i)})}function qe(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return zn.apply(void 0,D([],W(e)))}function _t(e){var t,r=1/0,n;return e!=null&&(typeof e=="object"?(t=e.count,r=t===void 0?1/0:t,n=e.delay):r=e),r<=0?function(){return _}:y(function(o,i){var s=0,a,c=function(){if(a==null||a.unsubscribe(),a=null,n!=null){var u=typeof n=="number"?Be(n):U(n(s)),p=w(i,function(){p.unsubscribe(),f()});u.subscribe(p)}else f()},f=function(){var u=!1;a=o.subscribe(w(i,void 0,function(){++s<r?a?c():u=!0:i.complete()})),u&&c()};f()})}function Pr(e,t){return y(Wn(e,t,arguments.length>=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new x}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,c=a===void 0?!0:a;return function(f){var u,p,m,d=0,h=!1,v=!1,G=function(){p==null||p.unsubscribe(),p=void 0},oe=function(){G(),u=m=void 0,h=v=!1},N=function(){var T=u;oe(),T==null||T.unsubscribe()};return y(function(T,Qe){d++,!v&&!h&&G();var De=m=m!=null?m:r();Qe.add(function(){d--,d===0&&!v&&!h&&(p=$r(N,c))}),De.subscribe(Qe),!u&&d>0&&(u=new rt({next:function($e){return De.next($e)},error:function($e){v=!0,G(),p=$r(oe,o,$e),De.error($e)},complete:function(){h=!0,G(),p=$r(oe,s),De.complete()}}),U(T).subscribe(u))})(f)}}function $r(e,t){for(var r=[],n=2;n<arguments.length;n++)r[n-2]=arguments[n];if(t===!0){e();return}if(t!==!1){var o=new rt({next:function(){o.unsubscribe(),e()}});return U(t.apply(void 0,D([],W(r)))).subscribe(o)}}function J(e,t,r){var n,o,i,s,a=!1;return e&&typeof e=="object"?(n=e.bufferSize,s=n===void 0?1/0:n,o=e.windowTime,t=o===void 0?1/0:o,i=e.refCount,a=i===void 0?!1:i,r=e.scheduler):s=e!=null?e:1/0,pe({connector:function(){return new wt(s,t,r)},resetOnError:!0,resetOnComplete:!1,resetOnRefCountZero:a})}function Fe(e){return L(function(t,r){return e<=r})}function Ir(e){return y(function(t,r){var n=!1,o=w(r,function(){o==null||o.unsubscribe(),n=!0},we);U(e).subscribe(o),t.subscribe(w(r,function(i){return n&&r.next(i)}))})}function V(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=Oe(e);return y(function(n,o){(r?je(e,n,r):je(e,n)).subscribe(o)})}function g(e,t){return y(function(r,n){var o=null,i=0,s=!1,a=function(){return s&&!o&&n.complete()};r.subscribe(w(n,function(c){o==null||o.unsubscribe();var f=0,u=i++;U(e(c,u)).subscribe(o=w(n,function(p){return n.next(t?t(c,p,u,f++):p)},function(){o=null,a()}))},function(){s=!0,a()}))})}function Y(e){return y(function(t,r){U(e).subscribe(w(r,function(){return r.complete()},we)),!r.closed&&t.subscribe(r)})}function jr(e,t){return t===void 0&&(t=!1),y(function(r,n){var o=0;r.subscribe(w(n,function(i){var s=e(i,o++);(s||t)&&n.next(i),!s&&n.complete()}))})}function S(e,t,r){var n=A(e)||t||r?{next:e,error:t,complete:r}:e;return n?y(function(o,i){var s;(s=n.subscribe)===null||s===void 0||s.call(n);var a=!0;o.subscribe(w(i,function(c){var f;(f=n.next)===null||f===void 0||f.call(n,c),i.next(c)},function(){var c;a=!1,(c=n.complete)===null||c===void 0||c.call(n),i.complete()},function(c){var f;a=!1,(f=n.error)===null||f===void 0||f.call(n,c),i.error(c)},function(){var c,f;a&&((c=n.unsubscribe)===null||c===void 0||c.call(n)),(f=n.finalize)===null||f===void 0||f.call(n)}))}):de}var Fr={leading:!0,trailing:!1};function Nn(e,t){return t===void 0&&(t=Fr),y(function(r,n){var o=t.leading,i=t.trailing,s=!1,a=null,c=null,f=!1,u=function(){c==null||c.unsubscribe(),c=null,i&&(d(),f&&n.complete())},p=function(){c=null,f&&n.complete()},m=function(h){return c=U(e(h)).subscribe(w(n,u,p))},d=function(){if(s){s=!1;var h=a;a=null,n.next(h),!f&&m(h)}};r.subscribe(w(n,function(h){s=!0,a=h,!(c&&!c.closed)&&(o?d():m(h))},function(){f=!0,!(i&&s&&c&&!c.closed)&&n.complete()}))})}function Ur(e,t,r){t===void 0&&(t=ae),r===void 0&&(r=Fr);var n=Be(e,t);return Nn(function(){return n},r)}function re(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var r=Ye(e);return y(function(n,o){for(var i=e.length,s=new Array(i),a=e.map(function(){return!1}),c=!1,f=function(p){U(e[p]).subscribe(w(o,function(m){s[p]=m,!c&&!a[p]&&(a[p]=!0,(c=a.every(de))&&(a=null))},we))},u=0;u<i;u++)f(u);n.subscribe(w(o,function(p){if(c){var m=D([p],W(s));o.next(r?r.apply(void 0,D([],W(m))):m)}}))})}function qn(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return y(function(r,n){Ot.apply(void 0,D([r],W(e))).subscribe(n)})}function Wr(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return qn.apply(void 0,D([],W(e)))}function Kn(){let e=new wt(1);return b(document,"DOMContentLoaded",{once:!0}).subscribe(()=>e.next(document)),e}function K(e,t=document){return Array.from(t.querySelectorAll(e))}function z(e,t=document){let r=ce(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ce(e,t=document){return t.querySelector(e)||void 0}function _e(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function er(e){return C(b(document.body,"focusin"),b(document.body,"focusout")).pipe(ke(1),l(()=>{let t=_e();return typeof t!="undefined"?e.contains(t):!1}),V(e===_e()),B())}function Xe(e){return{x:e.offsetLeft,y:e.offsetTop}}function Qn(e){return C(b(window,"load"),b(window,"resize")).pipe(Ce(0,Te),l(()=>Xe(e)),V(Xe(e)))}function tr(e){return{x:e.scrollLeft,y:e.scrollTop}}function dt(e){return C(b(e,"scroll"),b(window,"resize")).pipe(Ce(0,Te),l(()=>tr(e)),V(tr(e)))}var Gn=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o<i.length;o++){var s=i[o];r.call(n,s[1],s[0])}},t}()}(),Dr=typeof window!="undefined"&&typeof document!="undefined"&&window.document===document,rr=function(){return typeof global!="undefined"&&global.Math===Math?global:typeof self!="undefined"&&self.Math===Math?self:typeof window!="undefined"&&window.Math===Math?window:Function("return this")()}(),ma=function(){return typeof requestAnimationFrame=="function"?requestAnimationFrame.bind(rr):function(e){return setTimeout(function(){return e(Date.now())},1e3/60)}}(),da=2;function ha(e,t){var r=!1,n=!1,o=0;function i(){r&&(r=!1,e()),n&&a()}function s(){ma(i)}function a(){var c=Date.now();if(r){if(c-o<da)return;n=!0}else r=!0,n=!1,setTimeout(s,t);o=c}return a}var ba=20,va=["top","right","bottom","left","width","height","size","weight"],ga=typeof MutationObserver!="undefined",ya=function(){function e(){this.connected_=!1,this.mutationEventsAdded_=!1,this.mutationsObserver_=null,this.observers_=[],this.onTransitionEnd_=this.onTransitionEnd_.bind(this),this.refresh=ha(this.refresh.bind(this),ba)}return e.prototype.addObserver=function(t){~this.observers_.indexOf(t)||this.observers_.push(t),this.connected_||this.connect_()},e.prototype.removeObserver=function(t){var r=this.observers_,n=r.indexOf(t);~n&&r.splice(n,1),!r.length&&this.connected_&&this.disconnect_()},e.prototype.refresh=function(){var t=this.updateObservers_();t&&this.refresh()},e.prototype.updateObservers_=function(){var t=this.observers_.filter(function(r){return r.gatherActive(),r.hasActive()});return t.forEach(function(r){return r.broadcastActive()}),t.length>0},e.prototype.connect_=function(){!Dr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),ga?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!Dr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=va.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Bn=function(e,t){for(var r=0,n=Object.keys(t);r<n.length;r++){var o=n[r];Object.defineProperty(e,o,{value:t[o],enumerable:!1,writable:!1,configurable:!0})}return e},ht=function(e){var t=e&&e.ownerDocument&&e.ownerDocument.defaultView;return t||rr},Jn=or(0,0,0,0);function nr(e){return parseFloat(e)||0}function Yn(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];return t.reduce(function(n,o){var i=e["border-"+o+"-width"];return n+nr(i)},0)}function xa(e){for(var t=["top","right","bottom","left"],r={},n=0,o=t;n<o.length;n++){var i=o[n],s=e["padding-"+i];r[i]=nr(s)}return r}function Ea(e){var t=e.getBBox();return or(0,0,t.width,t.height)}function wa(e){var t=e.clientWidth,r=e.clientHeight;if(!t&&!r)return Jn;var n=ht(e).getComputedStyle(e),o=xa(n),i=o.left+o.right,s=o.top+o.bottom,a=nr(n.width),c=nr(n.height);if(n.boxSizing==="border-box"&&(Math.round(a+i)!==t&&(a-=Yn(n,"left","right")+i),Math.round(c+s)!==r&&(c-=Yn(n,"top","bottom")+s)),!Ta(e)){var f=Math.round(a+i)-t,u=Math.round(c+s)-r;Math.abs(f)!==1&&(a-=f),Math.abs(u)!==1&&(c-=u)}return or(o.left,o.top,a,c)}var Sa=function(){return typeof SVGGraphicsElement!="undefined"?function(e){return e instanceof ht(e).SVGGraphicsElement}:function(e){return e instanceof ht(e).SVGElement&&typeof e.getBBox=="function"}}();function Ta(e){return e===ht(e).document.documentElement}function Oa(e){return Dr?Sa(e)?Ea(e):wa(e):Jn}function _a(e){var t=e.x,r=e.y,n=e.width,o=e.height,i=typeof DOMRectReadOnly!="undefined"?DOMRectReadOnly:Object,s=Object.create(i.prototype);return Bn(s,{x:t,y:r,width:n,height:o,top:r,right:t+n,bottom:o+r,left:t}),s}function or(e,t,r,n){return{x:e,y:t,width:r,height:n}}var Ma=function(){function e(t){this.broadcastWidth=0,this.broadcastHeight=0,this.contentRect_=or(0,0,0,0),this.target=t}return e.prototype.isActive=function(){var t=Oa(this.target);return this.contentRect_=t,t.width!==this.broadcastWidth||t.height!==this.broadcastHeight},e.prototype.broadcastRect=function(){var t=this.contentRect_;return this.broadcastWidth=t.width,this.broadcastHeight=t.height,t},e}(),La=function(){function e(t,r){var n=_a(r);Bn(this,{target:t,contentRect:n})}return e}(),Aa=function(){function e(t,r,n){if(this.activeObservations_=[],this.observations_=new Gn,typeof t!="function")throw new TypeError("The callback provided as parameter 1 is not a function.");this.callback_=t,this.controller_=r,this.callbackCtx_=n}return e.prototype.observe=function(t){if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");if(!(typeof Element=="undefined"||!(Element instanceof Object))){if(!(t instanceof ht(t).Element))throw new TypeError('parameter 1 is not of type "Element".');var r=this.observations_;r.has(t)||(r.set(t,new Ma(t)),this.controller_.addObserver(this),this.controller_.refresh())}},e.prototype.unobserve=function(t){if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");if(!(typeof Element=="undefined"||!(Element instanceof Object))){if(!(t instanceof ht(t).Element))throw new TypeError('parameter 1 is not of type "Element".');var r=this.observations_;r.has(t)&&(r.delete(t),r.size||this.controller_.removeObserver(this))}},e.prototype.disconnect=function(){this.clearActive(),this.observations_.clear(),this.controller_.removeObserver(this)},e.prototype.gatherActive=function(){var t=this;this.clearActive(),this.observations_.forEach(function(r){r.isActive()&&t.activeObservations_.push(r)})},e.prototype.broadcastActive=function(){if(this.hasActive()){var t=this.callbackCtx_,r=this.activeObservations_.map(function(n){return new La(n.target,n.broadcastRect())});this.callback_.call(t,r,t),this.clearActive()}},e.prototype.clearActive=function(){this.activeObservations_.splice(0)},e.prototype.hasActive=function(){return this.activeObservations_.length>0},e}(),Xn=typeof WeakMap!="undefined"?new WeakMap:new Gn,Zn=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=ya.getInstance(),n=new Aa(t,r,this);Xn.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){Zn.prototype[e]=function(){var t;return(t=Xn.get(this))[e].apply(t,arguments)}});var Ca=function(){return typeof rr.ResizeObserver!="undefined"?rr.ResizeObserver:Zn}(),eo=Ca;var to=new x,Ra=$(()=>k(new eo(e=>{for(let t of e)to.next(t)}))).pipe(g(e=>C(ze,k(e)).pipe(R(()=>e.disconnect()))),J(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ye(e){return Ra.pipe(S(t=>t.observe(e)),g(t=>to.pipe(L(({target:r})=>r===e),R(()=>t.unobserve(e)),l(()=>he(e)))),V(he(e)))}function bt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function ir(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 ro=new x,ka=$(()=>k(new IntersectionObserver(e=>{for(let t of e)ro.next(t)},{threshold:0}))).pipe(g(e=>C(ze,k(e)).pipe(R(()=>e.disconnect()))),J(1));function ar(e){return ka.pipe(S(t=>t.observe(e)),g(t=>ro.pipe(L(({target:r})=>r===e),R(()=>t.unobserve(e)),l(({isIntersecting:r})=>r))))}function no(e,t=16){return dt(e).pipe(l(({y:r})=>{let n=he(e),o=bt(e);return r>=o.height-n.height-t}),B())}var sr={drawer:z("[data-md-toggle=drawer]"),search:z("[data-md-toggle=search]")};function oo(e){return sr[e].checked}function Ke(e,t){sr[e].checked!==t&&sr[e].click()}function Ue(e){let t=sr[e];return b(t,"change").pipe(l(()=>t.checked),V(t.checked))}function Ha(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 Pa(){return C(b(window,"compositionstart").pipe(l(()=>!0)),b(window,"compositionend").pipe(l(()=>!1))).pipe(V(!1))}function io(){let e=b(window,"keydown").pipe(L(t=>!(t.metaKey||t.ctrlKey)),l(t=>({mode:oo("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),L(({mode:t,type:r})=>{if(t==="global"){let n=_e();if(typeof n!="undefined")return!Ha(n,r)}return!0}),pe());return Pa().pipe(g(t=>t?_:e))}function le(){return new URL(location.href)}function ot(e){location.href=e.href}function ao(){return new x}function so(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)so(e,r)}function M(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)so(n,o);return n}function cr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function co(){return location.hash.substring(1)}function Vr(e){let t=M("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function $a(){return b(window,"hashchange").pipe(l(co),V(co()),L(e=>e.length>0),J(1))}function fo(){return $a().pipe(l(e=>ce(`[id="${e}"]`)),L(e=>typeof e!="undefined"))}function zr(e){let t=matchMedia(e);return Zt(r=>t.addListener(()=>r(t.matches))).pipe(V(t.matches))}function uo(){let e=matchMedia("print");return C(b(window,"beforeprint").pipe(l(()=>!0)),b(window,"afterprint").pipe(l(()=>!1))).pipe(V(e.matches))}function Nr(e,t){return e.pipe(g(r=>r?t():_))}function fr(e,t={credentials:"same-origin"}){return ue(fetch(`${e}`,t)).pipe(fe(()=>_),g(r=>r.status!==200?Tt(()=>new Error(r.statusText)):k(r)))}function We(e,t){return fr(e,t).pipe(g(r=>r.json()),J(1))}function po(e,t){let r=new DOMParser;return fr(e,t).pipe(g(n=>n.text()),l(n=>r.parseFromString(n,"text/xml")),J(1))}function ur(e){let t=M("script",{src:e});return $(()=>(document.head.appendChild(t),C(b(t,"load"),b(t,"error").pipe(g(()=>Tt(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(l(()=>{}),R(()=>document.head.removeChild(t)),ge(1))))}function lo(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function mo(){return C(b(window,"scroll",{passive:!0}),b(window,"resize",{passive:!0})).pipe(l(lo),V(lo()))}function ho(){return{width:innerWidth,height:innerHeight}}function bo(){return b(window,"resize",{passive:!0}).pipe(l(ho),V(ho()))}function vo(){return Q([mo(),bo()]).pipe(l(([e,t])=>({offset:e,size:t})),J(1))}function pr(e,{viewport$:t,header$:r}){let n=t.pipe(Z("size")),o=Q([n,r]).pipe(l(()=>Xe(e)));return Q([r,t,o]).pipe(l(([{height:i},{offset:s,size:a},{x:c,y:f}])=>({offset:{x:s.x-c,y:s.y-f+i},size:a})))}(()=>{function e(n,o){parent.postMessage(n,o||"*")}function t(...n){return n.reduce((o,i)=>o.then(()=>new Promise(s=>{let a=document.createElement("script");a.src=i,a.onload=s,document.body.appendChild(a)})),Promise.resolve())}var r=class extends EventTarget{constructor(n){super(),this.url=n,this.m=i=>{i.source===this.w&&(this.dispatchEvent(new MessageEvent("message",{data:i.data})),this.onmessage&&this.onmessage(i))},this.e=(i,s,a,c,f)=>{if(s===`${this.url}`){let u=new ErrorEvent("error",{message:i,filename:s,lineno:a,colno:c,error:f});this.dispatchEvent(u),this.onerror&&this.onerror(u)}};let o=document.createElement("iframe");o.hidden=!0,document.body.appendChild(this.iframe=o),this.w.document.open(),this.w.document.write(`<html><body><script>postMessage=${e};importScripts=${t};addEventListener("error",ev=>{parent.dispatchEvent(new ErrorEvent("error",{filename:"${n}",error:ev.error}))})<\/script><script src=${n}?${+Date.now()}><\/script></body></html>`),this.w.document.close(),onmessage=this.m,onerror=this.e,this.r=new Promise((i,s)=>{this.w.onload=i,this.w.onerror=s})}terminate(){document.body.removeChild(this.iframe),onmessage=onerror=null}postMessage(n){this.r.catch().then(()=>{this.w.dispatchEvent(new MessageEvent("message",{data:n}))})}get w(){return this.iframe.contentWindow}};window.IFrameWorker=r,location.protocol==="file:"&&(window.Worker=r)})();function Ia(e){return b(e,"message",t=>t.data)}function ja(e){let t=new x;return t.subscribe(r=>e.postMessage(r)),t}function go(e,t=new Worker(e)){let r=Ia(t),n=ja(t),o=new x;o.subscribe(n);let i=n.pipe(X(),ee(!0));return o.pipe(X(),qe(r.pipe(Y(i))),pe())}var Fa=z("#__config"),vt=JSON.parse(Fa.textContent);vt.base=`${new URL(vt.base,le())}`;function me(){return vt}function te(e){return vt.features.includes(e)}function be(e,t){return typeof t!="undefined"?vt.translations[e].replace("#",t.toString()):vt.translations[e]}function xe(e,t=document){return z(`[data-md-component=${e}]`,t)}function ne(e,t=document){return K(`[data-md-component=${e}]`,t)}function Ua(e){let t=z(".md-typeset > :first-child",e);return b(t,"click",{once:!0}).pipe(l(()=>z(".md-typeset",e)),l(r=>({hash:__md_hash(r.innerHTML)})))}function yo(e){return!te("announce.dismiss")||!e.childElementCount?_:$(()=>{let t=new x;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),Ua(e).pipe(S(r=>t.next(r)),R(()=>t.complete()),l(r=>P({ref:e},r)))})}function Wa(e,{target$:t}){return t.pipe(l(r=>({hidden:r!==e})))}function xo(e,t){let r=new x;return r.subscribe(({hidden:n})=>{e.hidden=n}),Wa(e,t).pipe(S(n=>r.next(n)),R(()=>r.complete()),l(n=>P({ref:e},n)))}var Ro=yt(Kr());function Qr(e){return M("div",{class:"md-tooltip",id:e},M("div",{class:"md-tooltip__inner md-typeset"}))}function Eo(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return M("aside",{class:"md-annotation",tabIndex:0},Qr(t),M("a",{href:r,class:"md-annotation__index",tabIndex:-1},M("span",{"data-md-annotation-id":e})))}else return M("aside",{class:"md-annotation",tabIndex:0},Qr(t),M("span",{class:"md-annotation__index",tabIndex:-1},M("span",{"data-md-annotation-id":e})))}function wo(e){return M("button",{class:"md-clipboard md-icon",title:be("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function Yr(e,t){let r=t&2,n=t&1,o=Object.keys(e.terms).filter(c=>!e.terms[c]).reduce((c,f)=>[...c,M("del",null,f)," "],[]).slice(0,-1),i=me(),s=new URL(e.location,i.base);te("search.highlight")&&s.searchParams.set("h",Object.entries(e.terms).filter(([,c])=>c).reduce((c,[f])=>`${c} ${f}`.trim(),""));let{tags:a}=me();return M("a",{href:`${s}`,class:"md-search-result__link",tabIndex:-1},M("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&M("div",{class:"md-search-result__icon md-icon"}),r>0&&M("h1",null,e.title),r<=0&&M("h2",null,e.title),n>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(c=>{let f=a?c in a?`md-tag-icon md-tag--${a[c]}`:"md-tag-icon":"";return M("span",{class:`md-tag ${f}`},c)}),n>0&&o.length>0&&M("p",{class:"md-search-result__terms"},be("search.result.term.missing"),": ",...o)))}function So(e){let t=e[0].score,r=[...e],n=me(),o=r.findIndex(u=>!`${new URL(u.location,n.base)}`.includes("#")),[i]=r.splice(o,1),s=r.findIndex(u=>u.score<t);s===-1&&(s=r.length);let a=r.slice(0,s),c=r.slice(s),f=[Yr(i,2|+(!o&&s===0)),...a.map(u=>Yr(u,1)),...c.length?[M("details",{class:"md-search-result__more"},M("summary",{tabIndex:-1},M("div",null,c.length>0&&c.length===1?be("search.result.more.one"):be("search.result.more.other",c.length))),...c.map(u=>Yr(u,1)))]:[]];return M("li",{class:"md-search-result__item"},f)}function To(e){return M("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>M("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?cr(r):r)))}function Gr(e){let t=`tabbed-control tabbed-control--${e}`;return M("div",{class:t,hidden:!0},M("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function Oo(e){return M("div",{class:"md-typeset__scrollwrap"},M("div",{class:"md-typeset__table"},e))}function Da(e){let t=me(),r=new URL(`../${e.version}/`,t.base);return M("li",{class:"md-version__item"},M("a",{href:`${r}`,class:"md-version__link"},e.title))}function _o(e,t){return M("div",{class:"md-version"},M("button",{class:"md-version__current","aria-label":be("select.version")},t.title),M("ul",{class:"md-version__list"},e.map(Da)))}function Va(e,t){let r=$(()=>Q([Qn(e),dt(t)])).pipe(l(([{x:n,y:o},i])=>{let{width:s,height:a}=he(e);return{x:n-i.x+s/2,y:o-i.y+a/2}}));return er(e).pipe(g(n=>r.pipe(l(o=>({active:n,offset:o})),ge(+!n||1/0))))}function Mo(e,t,{target$:r}){let[n,o]=Array.from(e.children);return $(()=>{let i=new x,s=i.pipe(X(),ee(!0));return i.subscribe({next({offset:a}){e.style.setProperty("--md-tooltip-x",`${a.x}px`),e.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),ar(e).pipe(Y(s)).subscribe(a=>{e.toggleAttribute("data-md-visible",a)}),C(i.pipe(L(({active:a})=>a)),i.pipe(ke(250),L(({active:a})=>!a))).subscribe({next({active:a}){a?e.prepend(n):n.remove()},complete(){e.prepend(n)}}),i.pipe(Ce(16,Te)).subscribe(({active:a})=>{n.classList.toggle("md-tooltip--active",a)}),i.pipe(Ur(125,Te),L(()=>!!e.offsetParent),l(()=>e.offsetParent.getBoundingClientRect()),l(({x:a})=>a)).subscribe({next(a){a?e.style.setProperty("--md-tooltip-0",`${-a}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),b(o,"click").pipe(Y(s),L(a=>!(a.metaKey||a.ctrlKey))).subscribe(a=>a.preventDefault()),b(o,"mousedown").pipe(Y(s),re(i)).subscribe(([a,{active:c}])=>{var f;if(a.button!==0||a.metaKey||a.ctrlKey)a.preventDefault();else if(c){a.preventDefault();let u=e.parentElement.closest(".md-annotation");u instanceof HTMLElement?u.focus():(f=_e())==null||f.blur()}}),r.pipe(Y(s),L(a=>a===n),Ne(125)).subscribe(()=>e.focus()),Va(e,t).pipe(S(a=>i.next(a)),R(()=>i.complete()),l(a=>P({ref:e},a)))})}function za(e){let t=[];for(let r of K(".c, .c1, .cm",e)){let n=[],o=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=o.nextNode();i;i=o.nextNode())n.push(i);for(let i of n){let s;for(;s=/(\(\d+\))(!)?/.exec(i.textContent);){let[,a,c]=s;if(typeof c=="undefined"){let f=i.splitText(s.index);i=f.splitText(a.length),t.push(f)}else{i.textContent=a,t.push(i);break}}}}return t}function Lo(e,t){t.append(...Array.from(e.childNodes))}function Ao(e,t,{target$:r,print$:n}){let o=t.closest("[id]"),i=o==null?void 0:o.id,s=new Map;for(let a of za(t)){let[,c]=a.textContent.match(/\((\d+)\)/);ce(`li:nth-child(${c})`,e)&&(s.set(c,Eo(c,i)),a.replaceWith(s.get(c)))}return s.size===0?_:$(()=>{let a=new x,c=[];for(let[f,u]of s)c.push([z(".md-typeset",u),z(`li:nth-child(${f})`,e)]);return n.pipe(Y(a.pipe(X(),ee(!0)))).subscribe(f=>{e.hidden=!f;for(let[u,p]of c)f?Lo(u,p):Lo(p,u)}),C(...[...s].map(([,f])=>Mo(f,t,{target$:r}))).pipe(R(()=>a.complete()),pe())})}var Na=0;function ko(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return ko(t)}}function Co(e){return ye(e).pipe(l(({width:t})=>({scrollable:bt(e).width>t})),Z("scrollable"))}function Ho(e,t){let{matches:r}=matchMedia("(hover)"),n=$(()=>{let o=new x;if(o.subscribe(({scrollable:s})=>{s&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")}),Ro.default.isSupported()&&(e.closest(".copy")||te("content.code.copy")&&!e.closest(".no-copy"))){let s=e.closest("pre");s.id=`__code_${++Na}`,s.insertBefore(wo(s.id),e)}let i=e.closest(".highlight");if(i instanceof HTMLElement){let s=ko(i);if(typeof s!="undefined"&&(i.classList.contains("annotate")||te("content.code.annotate"))){let a=Ao(s,e,t);return Co(e).pipe(S(c=>o.next(c)),R(()=>o.complete()),l(c=>P({ref:e},c)),qe(ye(i).pipe(l(({width:c,height:f})=>c&&f),B(),g(c=>c?a:_))))}}return Co(e).pipe(S(s=>o.next(s)),R(()=>o.complete()),l(s=>P({ref:e},s)))});return te("content.lazy")?ar(e).pipe(L(o=>o),ge(1),g(()=>n)):n}var Po=".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)}.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)}defs #flowchart-circleEnd,defs #flowchart-circleStart,defs #flowchart-crossEnd,defs #flowchart-crossStart,defs #flowchart-pointEnd,defs #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}.actor,defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{stroke:var(--md-mermaid-node-fg-color)}text.actor>tspan{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-default-fg-color--lighter)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-edge-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{fill:var(--md-mermaid-edge-color);stroke:none;font-family:var(--md-mermaid-font-family)!important}.noteText>tspan{fill:#000}#arrowhead path{fill:var(--md-mermaid-edge-color);stroke:none}.loopLine{stroke:var(--md-mermaid-node-fg-color)}.labelBox,.loopLine{fill:var(--md-mermaid-node-bg-color)}.labelBox{stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-node-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-accent-bg-color)}defs #sequencenumber{fill:var(--md-mermaid-node-fg-color)!important}";var Br,Ka=0;function Qa(){return typeof mermaid=="undefined"||mermaid instanceof Element?ur("https://unpkg.com/mermaid@9.3.0/dist/mermaid.min.js"):k(void 0)}function $o(e){return e.classList.remove("mermaid"),Br||(Br=Qa().pipe(S(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Po,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),l(()=>{}),J(1))),Br.subscribe(()=>{e.classList.add("mermaid");let t=`__mermaid_${Ka++}`,r=M("div",{class:"mermaid"}),n=e.textContent;mermaid.mermaidAPI.render(t,n,(o,i)=>{let s=r.attachShadow({mode:"closed"});s.innerHTML=o,e.replaceWith(r),i==null||i(s)})}),Br.pipe(l(()=>({ref:e})))}function Ya(e,{target$:t,print$:r}){let n=!0;return C(t.pipe(l(o=>o.closest("details:not([open])")),L(o=>e===o),l(()=>({action:"open",reveal:!0}))),r.pipe(L(o=>o||!n),S(()=>n=e.open),l(o=>({action:o?"open":"close"}))))}function Io(e,t){return $(()=>{let r=new x;return r.subscribe(({action:n,reveal:o})=>{e.toggleAttribute("open",n==="open"),o&&e.scrollIntoView()}),Ya(e,t).pipe(S(n=>r.next(n)),R(()=>r.complete()),l(n=>P({ref:e},n)))})}var jo=M("table");function Fo(e){return e.replaceWith(jo),jo.replaceWith(Oo(e)),k({ref:e})}function Ga(e){let t=K(":scope > input",e),r=t.find(n=>n.checked)||t[0];return C(...t.map(n=>b(n,"change").pipe(l(()=>z(`label[for="${n.id}"]`))))).pipe(V(z(`label[for="${r.id}"]`)),l(n=>({active:n})))}function Uo(e,{viewport$:t}){let r=Gr("prev");e.append(r);let n=Gr("next");e.append(n);let o=z(".tabbed-labels",e);return $(()=>{let i=new x,s=i.pipe(X(),ee(!0));return Q([i,ye(e)]).pipe(Ce(1,Te),Y(s)).subscribe({next([{active:a},c]){let f=Xe(a),{width:u}=he(a);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let p=tr(o);(f.x<p.x||f.x+u>p.x+c.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")}}),Q([dt(o),ye(o)]).pipe(Y(s)).subscribe(([a,c])=>{let f=bt(o);r.hidden=a.x<16,n.hidden=a.x>f.width-c.width-16}),C(b(r,"click").pipe(l(()=>-1)),b(n,"click").pipe(l(()=>1))).pipe(Y(s)).subscribe(a=>{let{width:c}=he(o);o.scrollBy({left:c*a,behavior:"smooth"})}),te("content.tabs.link")&&i.pipe(Fe(1),re(t)).subscribe(([{active:a},{offset:c}])=>{let f=a.innerText.trim();if(a.hasAttribute("data-md-switching"))a.removeAttribute("data-md-switching");else{let u=e.offsetTop-c.y;for(let m of K("[data-tabs]"))for(let d of K(":scope > input",m)){let h=z(`label[for="${d.id}"]`);if(h!==a&&h.innerText.trim()===f){h.setAttribute("data-md-switching",""),d.click();break}}window.scrollTo({top:e.offsetTop-u});let p=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...p])])}}),Ga(e).pipe(S(a=>i.next(a)),R(()=>i.complete()),l(a=>P({ref:e},a)))}).pipe(nt(ae))}function Wo(e,{viewport$:t,target$:r,print$:n}){return C(...K("pre:not(.mermaid) > code",e).map(o=>Ho(o,{target$:r,print$:n})),...K("pre.mermaid",e).map(o=>$o(o)),...K("table:not([class])",e).map(o=>Fo(o)),...K("details",e).map(o=>Io(o,{target$:r,print$:n})),...K("[data-tabs]",e).map(o=>Uo(o,{viewport$:t})))}function Ba(e,{alert$:t}){return t.pipe(g(r=>C(k(!0),k(!1).pipe(Ne(2e3))).pipe(l(n=>({message:r,active:n})))))}function Do(e,t){let r=z(".md-typeset",e);return $(()=>{let n=new x;return n.subscribe(({message:o,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=o}),Ba(e,t).pipe(S(o=>n.next(o)),R(()=>n.complete()),l(o=>P({ref:e},o)))})}function Ja({viewport$:e}){if(!te("header.autohide"))return k(!1);let t=e.pipe(l(({offset:{y:o}})=>o),Re(2,1),l(([o,i])=>[o<i,i]),Z(0)),r=Q([e,t]).pipe(L(([{offset:o},[,i]])=>Math.abs(i-o.y)>100),l(([,[o]])=>o),B()),n=Ue("search");return Q([e,n]).pipe(l(([{offset:o},i])=>o.y>400&&!i),B(),g(o=>o?r:k(!1)),V(!1))}function Vo(e,t){return $(()=>Q([ye(e),Ja(t)])).pipe(l(([{height:r},n])=>({height:r,hidden:n})),B((r,n)=>r.height===n.height&&r.hidden===n.hidden),J(1))}function zo(e,{header$:t,main$:r}){return $(()=>{let n=new x,o=n.pipe(X(),ee(!0));return n.pipe(Z("active"),Je(t)).subscribe(([{active:i},{hidden:s}])=>{e.classList.toggle("md-header--shadow",i&&!s),e.hidden=s}),r.subscribe(n),t.pipe(Y(o),l(i=>P({ref:e},i)))})}function Xa(e,{viewport$:t,header$:r}){return pr(e,{viewport$:t,header$:r}).pipe(l(({offset:{y:n}})=>{let{height:o}=he(e);return{active:n>=o}}),Z("active"))}function No(e,t){return $(()=>{let r=new x;r.subscribe({next({active:o}){e.classList.toggle("md-header__title--active",o)},complete(){e.classList.remove("md-header__title--active")}});let n=ce("article h1");return typeof n=="undefined"?_:Xa(n,t).pipe(S(o=>r.next(o)),R(()=>r.complete()),l(o=>P({ref:e},o)))})}function qo(e,{viewport$:t,header$:r}){let n=r.pipe(l(({height:i})=>i),B()),o=n.pipe(g(()=>ye(e).pipe(l(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),Z("bottom"))));return Q([n,o,t]).pipe(l(([i,{top:s,bottom:a},{offset:{y:c},size:{height:f}}])=>(f=Math.max(0,f-Math.max(0,s-c,i)-Math.max(0,f+c-a)),{offset:s-i,height:f,active:s-i<=c})),B((i,s)=>i.offset===s.offset&&i.height===s.height&&i.active===s.active))}function Za(e){let t=__md_get("__palette")||{index:e.findIndex(r=>matchMedia(r.getAttribute("data-md-color-media")).matches)};return k(...e).pipe(se(r=>b(r,"change").pipe(l(()=>r))),V(e[Math.max(0,t.index)]),l(r=>({index:e.indexOf(r),color:{scheme:r.getAttribute("data-md-color-scheme"),primary:r.getAttribute("data-md-color-primary"),accent:r.getAttribute("data-md-color-accent")}})),J(1))}function Ko(e){let t=M("meta",{name:"theme-color"});return document.head.appendChild(t),$(()=>{let r=new x;r.subscribe(o=>{document.body.setAttribute("data-md-color-switching","");for(let[i,s]of Object.entries(o.color))document.body.setAttribute(`data-md-color-${i}`,s);for(let i=0;i<n.length;i++){let s=n[i].nextElementSibling;s instanceof HTMLElement&&(s.hidden=o.index!==i)}__md_set("__palette",o)}),r.pipe(l(()=>{let o=xe("header"),{backgroundColor:i}=window.getComputedStyle(o);return i.match(/\d+/g).map(s=>(+s).toString(16).padStart(2,"0")).join("")})).subscribe(o=>t.content=`#${o}`),r.pipe(Ae(ae)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")});let n=K("input",e);return Za(n).pipe(S(o=>r.next(o)),R(()=>r.complete()),l(o=>P({ref:e},o)))})}var Jr=yt(Kr());function es(e){e.setAttribute("data-md-copying","");let t=e.innerText;return e.removeAttribute("data-md-copying"),t}function Qo({alert$:e}){Jr.default.isSupported()&&new F(t=>{new Jr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||es(z(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(S(t=>{t.trigger.focus()}),l(()=>be("clipboard.copied"))).subscribe(e)}function ts(e){if(e.length<2)return[""];let[t,r]=[...e].sort((o,i)=>o.length-i.length).map(o=>o.replace(/[^/]+$/,"")),n=0;if(t===r)n=t.length;else for(;t.charCodeAt(n)===r.charCodeAt(n);)n++;return e.map(o=>o.replace(t.slice(0,n),""))}function lr(e){let t=__md_get("__sitemap",sessionStorage,e);if(t)return k(t);{let r=me();return po(new URL("sitemap.xml",e||r.base)).pipe(l(n=>ts(K("loc",n).map(o=>o.textContent))),fe(()=>_),He([]),S(n=>__md_set("__sitemap",n,sessionStorage,e)))}}function Yo({location$:e,viewport$:t}){let r=me();if(location.protocol==="file:")return _;let n=lr().pipe(l(f=>f.map(u=>`${new URL(u,r.base)}`))),o=b(document.body,"click").pipe(re(n),g(([f,u])=>{if(!(f.target instanceof Element))return _;let p=f.target.closest("a");if(p===null)return _;if(p.target||f.metaKey||f.ctrlKey)return _;let m=new URL(p.href);return m.search=m.hash="",u.includes(`${m}`)?(f.preventDefault(),k(new URL(p.href))):_}),pe());o.pipe(ge(1)).subscribe(()=>{let f=ce("link[rel=icon]");typeof f!="undefined"&&(f.href=f.href)}),b(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),o.pipe(re(t)).subscribe(([f,{offset:u}])=>{history.scrollRestoration="manual",history.replaceState(u,""),history.pushState(null,"",f)}),o.subscribe(e);let i=e.pipe(V(le()),Z("pathname"),Fe(1),g(f=>fr(f).pipe(fe(()=>(ot(f),_))))),s=new DOMParser,a=i.pipe(g(f=>f.text()),g(f=>{let u=s.parseFromString(f,"text/html");for(let m 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=outdated]","[data-md-component=logo]","[data-md-component=skip]",...te("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let d=ce(m),h=ce(m,u);typeof d!="undefined"&&typeof h!="undefined"&&d.replaceWith(h)}let p=xe("container");return je(K("script",p)).pipe(g(m=>{let d=u.createElement("script");if(m.src){for(let h of m.getAttributeNames())d.setAttribute(h,m.getAttribute(h));return m.replaceWith(d),new F(h=>{d.onload=()=>h.complete()})}else return d.textContent=m.textContent,m.replaceWith(d),_}),X(),ee(u))}),pe());return b(window,"popstate").pipe(l(()=>le())).subscribe(e),e.pipe(V(le()),Re(2,1),g(([f,u])=>f.pathname===u.pathname&&f.hash!==u.hash?k(u):_)).subscribe(f=>{var u,p;history.state!==null||!f.hash?window.scrollTo(0,(p=(u=history.state)==null?void 0:u.y)!=null?p:0):(history.scrollRestoration="auto",Vr(f.hash),history.scrollRestoration="manual")}),a.pipe(re(e)).subscribe(([,f])=>{var u,p;history.state!==null||!f.hash?window.scrollTo(0,(p=(u=history.state)==null?void 0:u.y)!=null?p:0):Vr(f.hash)}),a.pipe(g(()=>t),Z("offset"),ke(100)).subscribe(({offset:f})=>{history.replaceState(f,"")}),a}var Jo=yt(Bo());function Xo(e){let t=e.separator.split("|").map(o=>o.replace(/(\(\?[!=][^)]+\))/g,"").length===0?"\uFFFD":o).join("|"),r=new RegExp(t,"img"),n=(o,i,s)=>`${i}<mark data-md-highlight>${s}</mark>`;return o=>{o=o.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${o.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return s=>(0,Jo.default)(s).replace(i,n).replace(/<\/mark>(\s+)<mark[^>]*>/img,"$1")}}function Lt(e){return e.type===1}function mr(e){return e.type===3}function Zo(e,t){let r=go(e);return C(k(location.protocol!=="file:"),Ue("search")).pipe(Pe(n=>n),g(()=>t)).subscribe(({config:n,docs:o})=>r.next({type:0,data:{config:n,docs:o,options:{suggest:te("search.suggest")}}})),r}function ei({document$:e}){let t=me(),r=We(new URL("../versions.json",t.base)).pipe(fe(()=>_)),n=r.pipe(l(o=>{let[,i]=t.base.match(/([^/]+)\/?$/);return o.find(({version:s,aliases:a})=>s===i||a.includes(i))||o[0]}));r.pipe(l(o=>new Map(o.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),g(o=>b(document.body,"click").pipe(L(i=>!i.metaKey&&!i.ctrlKey),re(n),g(([i,s])=>{if(i.target instanceof Element){let a=i.target.closest("a");if(a&&!a.target&&o.has(a.href)){let c=a.href;return!i.target.closest(".md-version")&&o.get(c)===s?_:(i.preventDefault(),k(c))}}return _}),g(i=>{let{version:s}=o.get(i);return lr(new URL(i)).pipe(l(a=>{let f=le().href.replace(t.base,"");return a.includes(f.split("#")[0])?new URL(`../${s}/${f}`,t.base):new URL(i)}))})))).subscribe(o=>ot(o)),Q([r,n]).subscribe(([o,i])=>{z(".md-header__topic").appendChild(_o(o,i))}),e.pipe(g(()=>n)).subscribe(o=>{var s;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let a=[((s=t.version)==null?void 0:s.default)||["latest"]].flat();e:for(let c of a)for(let f of o.aliases)if(new RegExp(c,"i").test(f)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let a of ne("outdated"))a.hidden=!1})}function as(e,{worker$:t}){let{searchParams:r}=le();r.has("q")&&(Ke("search",!0),e.value=r.get("q"),e.focus(),Ue("search").pipe(Pe(i=>!i)).subscribe(()=>{let i=new URL(location.href);i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let n=er(e),o=C(t.pipe(Pe(Lt)),b(e,"keyup"),n).pipe(l(()=>e.value),B());return Q([o,n]).pipe(l(([i,s])=>({value:i,focus:s})),J(1))}function ti(e,{worker$:t}){let r=new x,n=r.pipe(X(),ee(!0));return Q([t.pipe(Pe(Lt)),r],(o,i)=>i).pipe(Z("value")).subscribe(({value:o})=>t.next({type:2,data:o})),r.pipe(Z("focus")).subscribe(({focus:o})=>{o&&Ke("search",o)}),b(e.form,"reset").pipe(Y(n)).subscribe(()=>e.focus()),as(e,{worker$:t}).pipe(S(o=>r.next(o)),R(()=>r.complete()),l(o=>P({ref:e},o)),J(1))}function ri(e,{worker$:t,query$:r}){let n=new x,o=no(e.parentElement).pipe(L(Boolean)),i=e.parentElement,s=z(":scope > :first-child",e),a=z(":scope > :last-child",e);Ue("search").subscribe(u=>a.setAttribute("role",u?"list":"presentation")),n.pipe(re(r),Ir(t.pipe(Pe(Lt)))).subscribe(([{items:u},{value:p}])=>{switch(u.length){case 0:s.textContent=p.length?be("search.result.none"):be("search.result.placeholder");break;case 1:s.textContent=be("search.result.one");break;default:let m=cr(u.length);s.textContent=be("search.result.other",m)}});let c=n.pipe(S(()=>a.innerHTML=""),g(({items:u})=>C(k(...u.slice(0,10)),k(...u.slice(10)).pipe(Re(4),Wr(o),g(([p])=>p)))),l(So),pe());return c.subscribe(u=>a.appendChild(u)),c.pipe(se(u=>{let p=ce("details",u);return typeof p=="undefined"?_:b(p,"toggle").pipe(Y(n),l(()=>p))})).subscribe(u=>{u.open===!1&&u.offsetTop<=i.scrollTop&&i.scrollTo({top:u.offsetTop})}),t.pipe(L(mr),l(({data:u})=>u)).pipe(S(u=>n.next(u)),R(()=>n.complete()),l(u=>P({ref:e},u)))}function ss(e,{query$:t}){return t.pipe(l(({value:r})=>{let n=le();return n.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),n.search=`q=${r}`,{url:n}}))}function ni(e,t){let r=new x,n=r.pipe(X(),ee(!0));return r.subscribe(({url:o})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${o}`}),b(e,"click").pipe(Y(n)).subscribe(o=>o.preventDefault()),ss(e,t).pipe(S(o=>r.next(o)),R(()=>r.complete()),l(o=>P({ref:e},o)))}function oi(e,{worker$:t,keyboard$:r}){let n=new x,o=xe("search-query"),i=C(b(o,"keydown"),b(o,"focus")).pipe(Ae(ae),l(()=>o.value),B());return n.pipe(Je(i),l(([{suggest:a},c])=>{let f=c.split(/([\s-]+)/);if(a!=null&&a.length&&f[f.length-1]){let u=a[a.length-1];u.startsWith(f[f.length-1])&&(f[f.length-1]=u)}else f.length=0;return f})).subscribe(a=>e.innerHTML=a.join("").replace(/\s/g,"&nbsp;")),r.pipe(L(({mode:a})=>a==="search")).subscribe(a=>{switch(a.type){case"ArrowRight":e.innerText.length&&o.selectionStart===o.value.length&&(o.value=e.innerText);break}}),t.pipe(L(mr),l(({data:a})=>a)).pipe(S(a=>n.next(a)),R(()=>n.complete()),l(()=>({ref:e})))}function ii(e,{index$:t,keyboard$:r}){let n=me();try{let o=Zo(n.search,t),i=xe("search-query",e),s=xe("search-result",e);b(e,"click").pipe(L(({target:c})=>c instanceof Element&&!!c.closest("a"))).subscribe(()=>Ke("search",!1)),r.pipe(L(({mode:c})=>c==="search")).subscribe(c=>{let f=_e();switch(c.type){case"Enter":if(f===i){let u=new Map;for(let p of K(":first-child [href]",s)){let m=p.firstElementChild;u.set(p,parseFloat(m.getAttribute("data-md-score")))}if(u.size){let[[p]]=[...u].sort(([,m],[,d])=>d-m);p.click()}c.claim()}break;case"Escape":case"Tab":Ke("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof f=="undefined")i.focus();else{let u=[i,...K(":not(details) > [href], summary, details[open] [href]",s)],p=Math.max(0,(Math.max(0,u.indexOf(f))+u.length+(c.type==="ArrowUp"?-1:1))%u.length);u[p].focus()}c.claim();break;default:i!==_e()&&i.focus()}}),r.pipe(L(({mode:c})=>c==="global")).subscribe(c=>{switch(c.type){case"f":case"s":case"/":i.focus(),i.select(),c.claim();break}});let a=ti(i,{worker$:o});return C(a,ri(s,{worker$:o,query$:a})).pipe(qe(...ne("search-share",e).map(c=>ni(c,{query$:a})),...ne("search-suggest",e).map(c=>oi(c,{worker$:o,keyboard$:r}))))}catch(o){return e.hidden=!0,ze}}function ai(e,{index$:t,location$:r}){return Q([t,r.pipe(V(le()),L(n=>!!n.searchParams.get("h")))]).pipe(l(([n,o])=>Xo(n.config)(o.searchParams.get("h"))),l(n=>{var s;let o=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let a=i.nextNode();a;a=i.nextNode())if((s=a.parentElement)!=null&&s.offsetHeight){let c=a.textContent,f=n(c);f.length>c.length&&o.set(a,f)}for(let[a,c]of o){let{childNodes:f}=M("span",null,c);a.replaceWith(...Array.from(f))}return{ref:e,nodes:o}}))}function cs(e,{viewport$:t,main$:r}){let n=e.parentElement,o=n.offsetTop-n.parentElement.offsetTop;return Q([r,t]).pipe(l(([{offset:i,height:s},{offset:{y:a}}])=>(s=s+Math.min(o,Math.max(0,a-i))-o,{height:s,locked:a>=i+o})),B((i,s)=>i.height===s.height&&i.locked===s.locked))}function Xr(e,n){var o=n,{header$:t}=o,r=an(o,["header$"]);let i=z(".md-sidebar__scrollwrap",e),{y:s}=Xe(i);return $(()=>{let a=new x,c=a.pipe(X(),ee(!0)),f=a.pipe(Ce(0,Te));return f.pipe(re(t)).subscribe({next([{height:u},{height:p}]){i.style.height=`${u-2*s}px`,e.style.top=`${p}px`},complete(){i.style.height="",e.style.top=""}}),f.pipe(Pe()).subscribe(()=>{for(let u of K(".md-nav__link--active[href]",e)){let p=ir(u);if(typeof p!="undefined"){let m=u.offsetTop-p.offsetTop,{height:d}=he(p);p.scrollTo({top:m-d/2})}}}),ue(K("label[tabindex]",e)).pipe(se(u=>b(u,"click").pipe(l(()=>u),Y(c)))).subscribe(u=>{let p=z(`[id="${u.htmlFor}"]`);z(`[aria-labelledby="${u.id}"]`).setAttribute("aria-expanded",`${p.checked}`)}),cs(e,r).pipe(S(u=>a.next(u)),R(()=>a.complete()),l(u=>P({ref:e},u)))})}function si(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return Ot(We(`${r}/releases/latest`).pipe(fe(()=>_),l(n=>({version:n.tag_name})),He({})),We(r).pipe(fe(()=>_),l(n=>({stars:n.stargazers_count,forks:n.forks_count})),He({}))).pipe(l(([n,o])=>P(P({},n),o)))}else{let r=`https://api.github.com/users/${e}`;return We(r).pipe(l(n=>({repositories:n.public_repos})),He({}))}}function ci(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return We(r).pipe(fe(()=>_),l(({star_count:n,forks_count:o})=>({stars:n,forks:o})),He({}))}function fi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,n]=t;return si(r,n)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,n]=t;return ci(r,n)}return _}var fs;function us(e){return fs||(fs=$(()=>{let t=__md_get("__source",sessionStorage);if(t)return k(t);if(ne("consent").length){let n=__md_get("__consent");if(!(n&&n.github))return _}return fi(e.href).pipe(S(n=>__md_set("__source",n,sessionStorage)))}).pipe(fe(()=>_),L(t=>Object.keys(t).length>0),l(t=>({facts:t})),J(1)))}function ui(e){let t=z(":scope > :last-child",e);return $(()=>{let r=new x;return r.subscribe(({facts:n})=>{t.appendChild(To(n)),t.classList.add("md-source__repository--active")}),us(e).pipe(S(n=>r.next(n)),R(()=>r.complete()),l(n=>P({ref:e},n)))})}function ps(e,{viewport$:t,header$:r}){return ye(document.body).pipe(g(()=>pr(e,{header$:r,viewport$:t})),l(({offset:{y:n}})=>({hidden:n>=10})),Z("hidden"))}function pi(e,t){return $(()=>{let r=new x;return r.subscribe({next({hidden:n}){e.hidden=n},complete(){e.hidden=!1}}),(te("navigation.tabs.sticky")?k({hidden:!1}):ps(e,t)).pipe(S(n=>r.next(n)),R(()=>r.complete()),l(n=>P({ref:e},n)))})}function ls(e,{viewport$:t,header$:r}){let n=new Map,o=K("[href^=\\#]",e);for(let a of o){let c=a.hash.substring(1),f=ce(`[id="${c}"]`);typeof f!="undefined"&&n.set(a,f)}let i=r.pipe(Z("height"),l(({height:a})=>{let c=xe("main"),f=z(":scope > :first-child",c);return a+.8*(f.offsetTop-c.offsetTop)}),pe());return ye(document.body).pipe(Z("height"),g(a=>$(()=>{let c=[];return k([...n].reduce((f,[u,p])=>{for(;c.length&&n.get(c[c.length-1]).tagName>=p.tagName;)c.pop();let m=p.offsetTop;for(;!m&&p.parentElement;)p=p.parentElement,m=p.offsetTop;let d=p.offsetParent;for(;d;d=d.offsetParent)m+=d.offsetTop;return f.set([...c=[...c,u]].reverse(),m)},new Map))}).pipe(l(c=>new Map([...c].sort(([,f],[,u])=>f-u))),Je(i),g(([c,f])=>t.pipe(Pr(([u,p],{offset:{y:m},size:d})=>{let h=m+d.height>=Math.floor(a.height);for(;p.length;){let[,v]=p[0];if(v-f<m||h)u=[...u,p.shift()];else break}for(;u.length;){let[,v]=u[u.length-1];if(v-f>=m&&!h)p=[u.pop(),...p];else break}return[u,p]},[[],[...c]]),B((u,p)=>u[0]===p[0]&&u[1]===p[1])))))).pipe(l(([a,c])=>({prev:a.map(([f])=>f),next:c.map(([f])=>f)})),V({prev:[],next:[]}),Re(2,1),l(([a,c])=>a.prev.length<c.prev.length?{prev:c.prev.slice(Math.max(0,a.prev.length-1),c.prev.length),next:[]}:{prev:c.prev.slice(-1),next:c.next.slice(0,c.next.length-a.next.length)}))}function li(e,{viewport$:t,header$:r,main$:n,target$:o}){return $(()=>{let i=new x,s=i.pipe(X(),ee(!0));if(i.subscribe(({prev:a,next:c})=>{for(let[f]of c)f.classList.remove("md-nav__link--passed"),f.classList.remove("md-nav__link--active");for(let[f,[u]]of a.entries())u.classList.add("md-nav__link--passed"),u.classList.toggle("md-nav__link--active",f===a.length-1)}),te("toc.follow")){let a=C(t.pipe(ke(1),l(()=>{})),t.pipe(ke(250),l(()=>"smooth")));i.pipe(L(({prev:c})=>c.length>0),Je(n.pipe(Ae(ae))),re(a)).subscribe(([[{prev:c}],f])=>{let[u]=c[c.length-1];if(u.offsetHeight){let p=ir(u);if(typeof p!="undefined"){let m=u.offsetTop-p.offsetTop,{height:d}=he(p);p.scrollTo({top:m-d/2,behavior:f})}}})}return te("navigation.tracking")&&t.pipe(Y(s),Z("offset"),ke(250),Fe(1),Y(o.pipe(Fe(1))),_t({delay:250}),re(i)).subscribe(([,{prev:a}])=>{let c=le(),f=a[a.length-1];if(f&&f.length){let[u]=f,{hash:p}=new URL(u.href);c.hash!==p&&(c.hash=p,history.replaceState({},"",`${c}`))}else c.hash="",history.replaceState({},"",`${c}`)}),ls(e,{viewport$:t,header$:r}).pipe(S(a=>i.next(a)),R(()=>i.complete()),l(a=>P({ref:e},a)))})}function ms(e,{viewport$:t,main$:r,target$:n}){let o=t.pipe(l(({offset:{y:s}})=>s),Re(2,1),l(([s,a])=>s>a&&a>0),B()),i=r.pipe(l(({active:s})=>s));return Q([i,o]).pipe(l(([s,a])=>!(s&&a)),B(),Y(n.pipe(Fe(1))),ee(!0),_t({delay:250}),l(s=>({hidden:s})))}function mi(e,{viewport$:t,header$:r,main$:n,target$:o}){let i=new x,s=i.pipe(X(),ee(!0));return i.subscribe({next({hidden:a}){e.hidden=a,a?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(Y(s),Z("height")).subscribe(({height:a})=>{e.style.top=`${a+16}px`}),b(e,"click").subscribe(a=>{a.preventDefault(),window.scrollTo({top:0})}),ms(e,{viewport$:t,main$:n,target$:o}).pipe(S(a=>i.next(a)),R(()=>i.complete()),l(a=>P({ref:e},a)))}function di({document$:e,tablet$:t}){e.pipe(g(()=>K(".md-toggle--indeterminate")),S(r=>{r.indeterminate=!0,r.checked=!1}),se(r=>b(r,"change").pipe(jr(()=>r.classList.contains("md-toggle--indeterminate")),l(()=>r))),re(t)).subscribe(([r,n])=>{r.classList.remove("md-toggle--indeterminate"),n&&(r.checked=!1)})}function ds(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function hi({document$:e}){e.pipe(g(()=>K("[data-md-scrollfix]")),S(t=>t.removeAttribute("data-md-scrollfix")),L(ds),se(t=>b(t,"touchstart").pipe(l(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function bi({viewport$:e,tablet$:t}){Q([Ue("search"),t]).pipe(l(([r,n])=>r&&!n),g(r=>k(r).pipe(Ne(r?400:100))),re(e)).subscribe(([r,{offset:{y:n}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${n}px`;else{let o=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",o&&window.scrollTo(0,o)}})}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 n=e[r];typeof n=="string"?n=document.createTextNode(n):n.parentNode&&n.parentNode.removeChild(n),r?t.insertBefore(this.previousSibling,n):t.replaceChild(n,this)}}}));function hs(){return location.protocol==="file:"?ur(`${new URL("search/search_index.js",Zr.base)}`).pipe(l(()=>__index),J(1)):We(new URL("search/search_index.json",Zr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var it=Kn(),dr=ao(),gt=fo(),en=io(),Se=vo(),hr=zr("(min-width: 960px)"),gi=zr("(min-width: 1220px)"),yi=uo(),Zr=me(),xi=document.forms.namedItem("search")?hs():ze,tn=new x;Qo({alert$:tn});te("navigation.instant")&&Yo({location$:dr,viewport$:Se}).subscribe(it);var vi;((vi=Zr.version)==null?void 0:vi.provider)==="mike"&&ei({document$:it});C(dr,gt).pipe(Ne(125)).subscribe(()=>{Ke("drawer",!1),Ke("search",!1)});en.pipe(L(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=ce("link[rel=prev]");typeof t!="undefined"&&ot(t);break;case"n":case".":let r=ce("link[rel=next]");typeof r!="undefined"&&ot(r);break;case"Enter":let n=_e();n instanceof HTMLLabelElement&&n.click()}});di({document$:it,tablet$:hr});hi({document$:it});bi({viewport$:Se,tablet$:hr});var Ze=Vo(xe("header"),{viewport$:Se}),At=it.pipe(l(()=>xe("main")),g(e=>qo(e,{viewport$:Se,header$:Ze})),J(1)),bs=C(...ne("consent").map(e=>xo(e,{target$:gt})),...ne("dialog").map(e=>Do(e,{alert$:tn})),...ne("header").map(e=>zo(e,{viewport$:Se,header$:Ze,main$:At})),...ne("palette").map(e=>Ko(e)),...ne("search").map(e=>ii(e,{index$:xi,keyboard$:en})),...ne("source").map(e=>ui(e))),vs=$(()=>C(...ne("announce").map(e=>yo(e)),...ne("content").map(e=>Wo(e,{viewport$:Se,target$:gt,print$:yi})),...ne("content").map(e=>te("search.highlight")?ai(e,{index$:xi,location$:dr}):_),...ne("header-title").map(e=>No(e,{viewport$:Se,header$:Ze})),...ne("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Nr(gi,()=>Xr(e,{viewport$:Se,header$:Ze,main$:At})):Nr(hr,()=>Xr(e,{viewport$:Se,header$:Ze,main$:At}))),...ne("tabs").map(e=>pi(e,{viewport$:Se,header$:Ze})),...ne("toc").map(e=>li(e,{viewport$:Se,header$:Ze,main$:At,target$:gt})),...ne("top").map(e=>mi(e,{viewport$:Se,header$:Ze,main$:At,target$:gt})))),Ei=it.pipe(g(()=>vs),qe(bs),J(1));Ei.subscribe();window.document$=it;window.location$=dr;window.target$=gt;window.keyboard$=en;window.viewport$=Se;window.tablet$=hr;window.screen$=gi;window.print$=yi;window.alert$=tn;window.component$=Ei;})();
//# sourceMappingURL=bundle.efa0ade1.min.js.map

