(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{"3pNy":function(e,t,n){var r=n("OBhP"),o=n("GDhZ");e.exports=function(e,t){return o(e,r(t,1))}},"67s2":function(e,t,n){e.exports=n("oasZ")},HhVK:function(e,t,n){"use strict";n.d(t,"a",(function(){return i}));var r=n("i8i4"),o=n.n(r);function i(e,t,n,r){var i=o.a.unstable_batchedUpdates?function(e){o.a.unstable_batchedUpdates(n,e)}:n;return e.addEventListener&&e.addEventListener(t,i,r),{remove:function(){e.removeEventListener&&e.removeEventListener(t,i)}}}},"S+ru":function(e,t,n){},"c+Xe":function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return s}));var r=n("TOwV");function o(e){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function i(e,t){"function"==typeof e?e(t):"object"===o(e)&&e&&"current"in e&&(e.current=t)}function a(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(e){t.forEach((function(t){i(t,e)}))}}function s(e){var t,n,o=Object(r.isMemo)(e)?e.type.type:e.type;return!("function"==typeof o&&!(null===(t=o.prototype)||void 0===t?void 0:t.render))&&!("function"==typeof e&&!(null===(n=e.prototype)||void 0===n?void 0:n.render))}},hhGP:function(e,t,n){"use strict";var r=n("k1TG"),o=n("FqMR"),i=n("8o2o"),a=n("duPW"),s=n.n(a),c=n("67s2"),l=n.n(c),f=n("q1tI"),u=n.n(f),d=n("52AM");function p(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function m(){return(m=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function h(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function v(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?h(Object(n),!0).forEach((function(t){p(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):h(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function b(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var y=u.a.createContext({}),O=function(e){return function(t){var n=g(t.components);return u.a.createElement(e,m({},t,{components:n}))}},g=function(e){var t=u.a.useContext(y),n=t;return e&&(n="function"==typeof e?e(t):v(v({},t),e)),n},j=function(e){var t=g(e.components);return u.a.createElement(y.Provider,{value:t},e.children)},x={inlineCode:"code",wrapper:function(e){var t=e.children;return u.a.createElement(u.a.Fragment,{},t)}},w=u.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,i=e.parentName,a=b(e,["components","mdxType","originalType","parentName"]),s=g(n),c=r,l=s["".concat(i,".").concat(c)]||s[c]||x[c]||o;return n?u.a.createElement(l,v(v({ref:t},a),{},{components:n})):u.a.createElement(l,v({ref:t},a))}));function _(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=w;var a={};for(var s in t)hasOwnProperty.call(t,s)&&(a[s]=t[s]);a.originalType=e,a.mdxType="string"==typeof e?e:r,i[1]=a;for(var c=2;c<o;c++)i[c]=n[c];return u.a.createElement.apply(null,i)}return u.a.createElement.apply(null,n)}w.displayName="MDXCreateElement",void 0!==O&&O&&O===Object(O)&&Object.isExtensible(O)&&!O.hasOwnProperty("__filemeta")&&Object.defineProperty(O,"__filemeta",{configurable:!0,value:{name:"withMDXComponents",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==g&&g&&g===Object(g)&&Object.isExtensible(g)&&!g.hasOwnProperty("__filemeta")&&Object.defineProperty(g,"__filemeta",{configurable:!0,value:{name:"useMDXComponents",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==_&&_&&_===Object(_)&&Object.isExtensible(_)&&!_.hasOwnProperty("__filemeta")&&Object.defineProperty(_,"__filemeta",{configurable:!0,value:{name:"createElement",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==j&&j&&j===Object(j)&&Object.isExtensible(j)&&!j.hasOwnProperty("__filemeta")&&Object.defineProperty(j,"__filemeta",{configurable:!0,value:{name:"MDXProvider",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==y&&y&&y===Object(y)&&Object.isExtensible(y)&&!y.hasOwnProperty("__filemeta")&&Object.defineProperty(y,"__filemeta",{configurable:!0,value:{name:"MDXContext",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==O&&O&&O===Object(O)&&Object.isExtensible(O)&&!O.hasOwnProperty("__filemeta")&&Object.defineProperty(O,"__filemeta",{configurable:!0,value:{name:"withMDXComponents",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==g&&g&&g===Object(g)&&Object.isExtensible(g)&&!g.hasOwnProperty("__filemeta")&&Object.defineProperty(g,"__filemeta",{configurable:!0,value:{name:"useMDXComponents",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==_&&_&&_===Object(_)&&Object.isExtensible(_)&&!_.hasOwnProperty("__filemeta")&&Object.defineProperty(_,"__filemeta",{configurable:!0,value:{name:"createElement",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==j&&j&&j===Object(j)&&Object.isExtensible(j)&&!j.hasOwnProperty("__filemeta")&&Object.defineProperty(j,"__filemeta",{configurable:!0,value:{name:"MDXProvider",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}}),void 0!==y&&y&&y===Object(y)&&Object.isExtensible(y)&&!y.hasOwnProperty("__filemeta")&&Object.defineProperty(y,"__filemeta",{configurable:!0,value:{name:"MDXContext",filename:"node_modules/gatsby-theme-docz/node_modules/@mdx-js/react/dist/esm.js"}});var P=n("Wbzz"),k=function(){try{var e=Object(P.useStaticQuery)("1635659820");return JSON.parse(e.doczDb.db)}catch(t){return console.error(t),console.error("Error when parsing docz database"),{}}};void 0!==k&&k&&k===Object(k)&&Object.isExtensible(k)&&!k.hasOwnProperty("__filemeta")&&Object.defineProperty(k,"__filemeta",{configurable:!0,value:{name:"useDbQuery",filename:"node_modules/gatsby-theme-docz/src/hooks/useDbQuery.js"}}),void 0!==k&&k&&k===Object(k)&&Object.isExtensible(k)&&!k.hasOwnProperty("__filemeta")&&Object.defineProperty(k,"__filemeta",{configurable:!0,value:{name:"useDbQuery",filename:"node_modules/gatsby-theme-docz/src/hooks/useDbQuery.js"}});var E=n("qKvR"),C=function(e){var t=e.children;return Object(E.jsx)(f.Fragment,null,t)},T=C;void 0!==C&&C&&C===Object(C)&&Object.isExtensible(C)&&!C.hasOwnProperty("__filemeta")&&Object.defineProperty(C,"__filemeta",{configurable:!0,value:{name:"Wrapper",filename:"node_modules/gatsby-theme-docz/src/wrapper.js"}}),void 0!==C&&C&&C===Object(C)&&Object.isExtensible(C)&&!C.hasOwnProperty("__filemeta")&&Object.defineProperty(C,"__filemeta",{configurable:!0,value:{name:"Wrapper",filename:"node_modules/gatsby-theme-docz/src/wrapper.js"}});var N=n("dCk4"),S=n("vrFN"),D=n("9Dj+"),z=(n("SchZ"),n("S+ru"),n("rSSF"),n("j8BX")),L=n.n(z),M=n("0jh0"),R=n.n(M),A=n("phZJ"),F=n.n(A),U=n("lFqo"),B=n.n(U),H=n("v06X"),X=n.n(H),I=n("IVAY"),W=n.n(I),Q=n("CPqs"),Z=n.n(Q),q=n("i8i4"),V=n("TSYQ"),J=n.n(V),K=n("HhVK"),G=n("cjBy"),Y=n.n(G),$=n("BGR+"),ee=n("t23M"),te=n("H84U"),ne=n("R7tm"),re=n.n(ne),oe=n("xEkU"),ie=n.n(oe);function ae(){return function(e,t,n){var r=n.value,o=!1;return{configurable:!0,get:function(){if(o||this===e.prototype||this.hasOwnProperty(t))return r;var n=function(e){var t,n=function(n){return function(){t=null,e.apply(void 0,re()(n))}},r=function(){if(null==t){for(var e=arguments.length,r=new Array(e),o=0;o<e;o++)r[o]=arguments[o];t=ie()(n(r))}};return r.cancel=function(){return ie.a.cancel(t)},r}(r.bind(this));return o=!0,Object.defineProperty(this,t,{value:n,configurable:!0,writable:!0}),o=!1,n}}}}function se(e){return e!==window?e.getBoundingClientRect():{top:0,bottom:window.innerHeight}}function ce(e,t,n){if(void 0!==n&&t.top>e.top-n)return n+t.top}function le(e,t,n){if(void 0!==n&&t.bottom<e.bottom+n)return n+(window.innerHeight-t.bottom)}var fe=["resize","scroll","touchstart","touchmove","touchend","pageshow","load"],ue=[];function de(e,t){if(e){var n=ue.find((function(t){return t.target===e}));n?n.affixList.push(t):(n={target:e,affixList:[t],eventHandlers:{}},ue.push(n),fe.forEach((function(t){n.eventHandlers[t]=Object(K.a)(e,t,(function(){n.affixList.forEach((function(e){e.lazyUpdatePosition()}))}))})))}}function pe(e){var t=ue.find((function(t){var n=t.affixList.some((function(t){return t===e}));return n&&(t.affixList=t.affixList.filter((function(t){return t!==e}))),n}));t&&0===t.affixList.length&&(ue=ue.filter((function(e){return e!==t})),fe.forEach((function(e){var n=t.eventHandlers[e];n&&n.remove&&n.remove()})))}var me,he=function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"===("undefined"==typeof Reflect?"undefined":Y()(Reflect))&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};function ve(){return"undefined"!=typeof window?window:null}!function(e){e[e.None=0]="None",e[e.Prepare=1]="Prepare"}(me||(me={}));var be=function(e){W()(n,e);var t=Z()(n);function n(){var e;return F()(this,n),(e=t.apply(this,arguments)).state={status:me.None,lastAffix:!1,prevTarget:null},e.getOffsetTop=function(){var t=e.props.offsetBottom,n=e.props.offsetTop;return void 0===t&&void 0===n&&(n=0),n},e.getOffsetBottom=function(){return e.props.offsetBottom},e.savePlaceholderNode=function(t){e.placeholderNode=t},e.saveFixedNode=function(t){e.fixedNode=t},e.measure=function(){var t=e.state,n=t.status,r=t.lastAffix,o=e.props.onChange,i=e.getTargetFunc();if(n===me.Prepare&&e.fixedNode&&e.placeholderNode&&i){var a=e.getOffsetTop(),s=e.getOffsetBottom(),c=i();if(c){var l={status:me.None},f=se(c),u=se(e.placeholderNode),d=ce(u,f,a),p=le(u,f,s);void 0!==d?(l.affixStyle={position:"fixed",top:d,width:u.width,height:u.height},l.placeholderStyle={width:u.width,height:u.height}):void 0!==p&&(l.affixStyle={position:"fixed",bottom:p,width:u.width,height:u.height},l.placeholderStyle={width:u.width,height:u.height}),l.lastAffix=!!l.affixStyle,o&&r!==l.lastAffix&&o(l.lastAffix),e.setState(l)}}},e.prepareMeasure=function(){e.setState({status:me.Prepare,affixStyle:void 0,placeholderStyle:void 0})},e.render=function(){var t=e.context.getPrefixCls,n=e.state,r=n.affixStyle,o=n.placeholderStyle,i=e.props,a=i.prefixCls,s=i.children,c=J()(R()({},t("affix",a),r)),l=Object($.a)(e.props,["prefixCls","offsetTop","offsetBottom","target","onChange"]);return f.createElement(ee.a,{onResize:function(){e.updatePosition()}},f.createElement("div",L()({},l,{ref:e.savePlaceholderNode}),r&&f.createElement("div",{style:o,"aria-hidden":"true"}),f.createElement("div",{className:c,ref:e.saveFixedNode,style:r},f.createElement(ee.a,{onResize:function(){e.updatePosition()}},s))))},e}return B()(n,[{key:"getTargetFunc",value:function(){var e=this.context.getTargetContainer,t=this.props.target;return void 0!==t?t:e||ve}},{key:"componentDidMount",value:function(){var e=this,t=this.getTargetFunc();t&&(this.timeout=setTimeout((function(){de(t(),e),e.updatePosition()})))}},{key:"componentDidUpdate",value:function(e){var t=this.state.prevTarget,n=this.getTargetFunc(),r=null;n&&(r=n()||null),t!==r&&(pe(this),r&&(de(r,this),this.updatePosition()),this.setState({prevTarget:r})),e.offsetTop===this.props.offsetTop&&e.offsetBottom===this.props.offsetBottom||this.updatePosition(),this.measure()}},{key:"componentWillUnmount",value:function(){clearTimeout(this.timeout),pe(this),this.updatePosition.cancel(),this.lazyUpdatePosition.cancel()}},{key:"updatePosition",value:function(){this.prepareMeasure()}},{key:"lazyUpdatePosition",value:function(){var e=this.getTargetFunc(),t=this.state.affixStyle;if(e&&t){var n=this.getOffsetTop(),r=this.getOffsetBottom(),o=e();if(o&&this.placeholderNode){var i=se(o),a=se(this.placeholderNode),s=ce(a,i,n),c=le(a,i,r);if(void 0!==s&&t.top===s||void 0!==c&&t.bottom===c)return}}this.prepareMeasure()}}]),n}(f.Component);be.contextType=te.b,he([ae()],be.prototype,"updatePosition",null),he([ae()],be.prototype,"lazyUpdatePosition",null);var ye=be;function Oe(e){return null!=e&&e===e.window}function ge(e,t){if("undefined"==typeof window)return 0;var n=t?"scrollTop":"scrollLeft",r=0;return Oe(e)?r=e[t?"pageYOffset":"pageXOffset"]:e instanceof Document?r=e.documentElement[n]:e&&(r=e[n]),e&&!Oe(e)&&"number"!=typeof r&&(r=(e.ownerDocument||e).documentElement[n]),r}function je(e,t,n,r){var o=n-t;return(e/=r/2)<1?o/2*e*e*e+t:o/2*((e-=2)*e*e+2)+t}function xe(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.getContainer,r=void 0===n?function(){return window}:n,o=t.callback,i=t.duration,a=void 0===i?450:i,s=r(),c=ge(s,!0),l=Date.now(),f=function t(){var n=Date.now()-l,r=je(n>a?a:n,c,e,a);Oe(s)?s.scrollTo(window.pageXOffset,r):s instanceof HTMLDocument||"HTMLDocument"===s.constructor.name?s.documentElement.scrollTop=r:s.scrollTop=r,n<a?ie()(t):"function"==typeof o&&o()};ie()(f)}var we=f.createContext(null);function _e(){return window}function Pe(e,t){if(!e.getClientRects().length)return 0;var n=e.getBoundingClientRect();return n.width||n.height?t===window?(t=e.ownerDocument.documentElement,n.top-t.clientTop):n.top-t.getBoundingClientRect().top:n.top}var ke=/#(\S+)$/,Ee=function(e){W()(n,e);var t=Z()(n);function n(){var e;return F()(this,n),(e=t.apply(this,arguments)).state={activeLink:null},e.links=[],e.registerLink=function(t){e.links.includes(t)||e.links.push(t)},e.unregisterLink=function(t){var n=e.links.indexOf(t);-1!==n&&e.links.splice(n,1)},e.getContainer=function(){var t=e.context.getTargetContainer;return(e.props.getContainer||t||_e)()},e.handleScrollTo=function(t){var n=e.props,r=n.offsetTop,o=n.targetOffset;e.setCurrentActiveLink(t);var i=e.getContainer(),a=ge(i,!0),s=ke.exec(t);if(s){var c=document.getElementById(s[1]);if(c){var l=a+Pe(c,i);l-=void 0!==o?o:r||0,e.animating=!0,xe(l,{callback:function(){e.animating=!1},getContainer:e.getContainer})}}},e.saveInkNode=function(t){e.inkNode=t},e.setCurrentActiveLink=function(t){var n=e.state.activeLink,r=e.props.onChange;n!==t&&(e.setState({activeLink:t}),r&&r(t))},e.handleScroll=function(){if(!e.animating){var t=e.props,n=t.offsetTop,r=t.bounds,o=t.targetOffset,i=e.getCurrentAnchor(void 0!==o?o:n||0,r);e.setCurrentActiveLink(i)}},e.updateInk=function(){var t=X()(e).prefixCls,n=q.findDOMNode(X()(e)).getElementsByClassName("".concat(t,"-link-title-active"))[0];n&&(e.inkNode.style.top="".concat(n.offsetTop+n.clientHeight/2-4.5,"px"))},e.render=function(){var t=e.context,n=t.getPrefixCls,r=t.direction,o=e.props,i=o.prefixCls,a=o.className,s=void 0===a?"":a,c=o.style,l=o.offsetTop,u=o.affix,d=o.showInkInFixed,p=o.children,m=e.state.activeLink,h=n("anchor",i);e.prefixCls=h;var v=J()("".concat(h,"-ink-ball"),{visible:m}),b=J()("".concat(h,"-wrapper"),R()({},"".concat(h,"-rtl"),"rtl"===r),s),y=J()(h,{fixed:!u&&!d}),O=L()({maxHeight:l?"calc(100vh - ".concat(l,"px)"):"100vh"},c),g=f.createElement("div",{className:b,style:O},f.createElement("div",{className:y},f.createElement("div",{className:"".concat(h,"-ink")},f.createElement("span",{className:v,ref:e.saveInkNode})),p));return f.createElement(we.Provider,{value:{registerLink:e.registerLink,unregisterLink:e.unregisterLink,activeLink:e.state.activeLink,scrollTo:e.handleScrollTo,onClick:e.props.onClick}},u?f.createElement(ye,{offsetTop:l,target:e.getContainer},g):g)},e}return B()(n,[{key:"componentDidMount",value:function(){this.scrollContainer=this.getContainer(),this.scrollEvent=Object(K.a)(this.scrollContainer,"scroll",this.handleScroll),this.handleScroll()}},{key:"componentDidUpdate",value:function(){if(this.scrollEvent){var e=this.getContainer();this.scrollContainer!==e&&(this.scrollContainer=e,this.scrollEvent.remove(),this.scrollEvent=Object(K.a)(this.scrollContainer,"scroll",this.handleScroll),this.handleScroll())}this.updateInk()}},{key:"componentWillUnmount",value:function(){this.scrollEvent&&this.scrollEvent.remove()}},{key:"getCurrentAnchor",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:5,n=this.props.getCurrentAnchor;if("function"==typeof n)return n();var r=[],o=this.getContainer();if(this.links.forEach((function(n){var i=ke.exec(n.toString());if(i){var a=document.getElementById(i[1]);if(a){var s=Pe(a,o);s<e+t&&r.push({link:n,top:s})}}})),r.length){var i=r.reduce((function(e,t){return t.top>e.top?t:e}));return i.link}return""}}]),n}(f.Component);Ee.defaultProps={affix:!0,showInkInFixed:!1},Ee.contextType=te.b;var Ce=function(e){W()(n,e);var t=Z()(n);function n(){var e;return F()(this,n),(e=t.apply(this,arguments)).handleClick=function(t){var n=e.context,r=n.scrollTo,o=n.onClick,i=e.props,a=i.href,s=i.title;o&&o(t,{title:s,href:a}),r(a)},e.renderAnchorLink=function(t){var n=t.getPrefixCls,r=e.props,o=r.prefixCls,i=r.href,a=r.title,s=r.children,c=r.className,l=r.target,u=n("anchor",o),d=e.context.activeLink===i,p=J()("".concat(u,"-link"),R()({},"".concat(u,"-link-active"),d),c),m=J()("".concat(u,"-link-title"),R()({},"".concat(u,"-link-title-active"),d));return f.createElement("div",{className:p},f.createElement("a",{className:m,href:i,title:"string"==typeof a?a:"",target:l,onClick:e.handleClick},a),s)},e}return B()(n,[{key:"componentDidMount",value:function(){this.context.registerLink(this.props.href)}},{key:"componentDidUpdate",value:function(e){var t=e.href,n=this.props.href;t!==n&&(this.context.unregisterLink(t),this.context.registerLink(n))}},{key:"componentWillUnmount",value:function(){this.context.unregisterLink(this.props.href)}},{key:"render",value:function(){return f.createElement(te.a,null,this.renderAnchorLink)}}]),n}(f.Component);Ce.defaultProps={href:"#"},Ce.contextType=we;var Te=Ce;Ee.Link=Te;var Ne=Ee,Se=n("Al62"),De=Ne.Link,ze=Object(E.css)([Se.d[3]],"{display:none;}position:fixed;top:64px;right:0;width:250px;padding:16px;height:605px;overflow:auto;ul{font-size:12px;li{height:25px;line-height:25px;word-wrap:break-word;}}"),Le=function(){var e=Object(d.e)(),t=Object(Se.a)(e).headings;return Object(E.jsx)("div",{css:ze},Object(E.jsx)(Ne,null,t.map((function(e){return Object(E.jsx)(De,{key:e.slug,href:"#"+e.slug,title:e.value})}))))},Me=Le;void 0!==Le&&Le&&Le===Object(Le)&&Object.isExtensible(Le)&&!Le.hasOwnProperty("__filemeta")&&Object.defineProperty(Le,"__filemeta",{configurable:!0,value:{name:"HeaderNav",filename:"src/components/AnchorNavigator.tsx"}});var Re=function(){var e=Object(d.e)(),t=Object(Se.c)(e),n=t[0],r=t[1];return Object(E.jsx)(u.a.Fragment,null,n&&Object(E.jsx)("a",{href:n,className:"ant-btn"},"Prev"),r&&Object(E.jsx)("a",{href:r,className:"ant-btn"},"Next"))},Ae=Re;void 0!==Re&&Re&&Re===Object(Re)&&Object.isExtensible(Re)&&!Re.hasOwnProperty("__filemeta")&&Object.defineProperty(Re,"__filemeta",{configurable:!0,value:{name:"nextButtons",filename:"src/components/next.tsx"}});n("TpwP");var Fe={name:"1iqf5ci",styles:"display:flex;flex-direction:row;.docSearch-content{word-wrap:break-all;width:100%;}.try-out,.auth-wrapper,.information-container{display:none;}"},Ue=Object(d.b)()((function(e){var t=e.children,n=Object(d.d)();return Object(E.jsx)(N.a,{theme:n},Object(E.jsx)(D.a,null,Object(E.jsx)(S.a,{title:"Documentation"}),Object(E.jsx)("div",{css:Fe},Object(E.jsx)("div",{className:"docSearch-content"},t),Object(E.jsx)(Me,null)),Object(E.jsx)("div",null,Object(E.jsx)(Ae,null))))})),Be=Ue;void 0!==Ue&&Ue&&Ue===Object(Ue)&&Object.isExtensible(Ue)&&!Ue.hasOwnProperty("__filemeta")&&Object.defineProperty(Ue,"__filemeta",{configurable:!0,value:{name:"__DOCZ_DUMMY_EXPORT_DEFAULT",filename:"src/gatsby-theme-docz/index.tsx"}});var He=n("rid2"),Xe=function(e){var t=e.description,n=e.lang,r=e.meta,o=e.keywords,i=e.title,a=k(),s=i||a.config.title,c=t||a.config.description;return Object(E.jsx)(He.Helmet,{title:s,titleTemplate:"%s | "+a.config.title,htmlAttributes:{lang:n},meta:[{name:"description",content:c},{property:"og:title",content:s},{property:"og:description",content:c},{property:"og:type",content:"website"},{name:"twitter:card",content:"summary"},{name:"twitter:title",content:s},{name:"twitter:description",content:c}].concat(o.length>0?{name:"keywords",content:o.join(", ")}:[]).concat(r)})};Xe.defaultProps={lang:"en",meta:[],keywords:[]};var Ie=Xe;function We(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Qe(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?We(Object(n),!0).forEach((function(t){Object(o.a)(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):We(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}void 0!==Xe&&Xe&&Xe===Object(Xe)&&Object.isExtensible(Xe)&&!Xe.hasOwnProperty("__filemeta")&&Object.defineProperty(Xe,"__filemeta",{configurable:!0,value:{name:"SEO",filename:"node_modules/gatsby-theme-docz/src/base/Seo.js"}}),void 0!==Xe&&Xe&&Xe===Object(Xe)&&Object.isExtensible(Xe)&&!Xe.hasOwnProperty("__filemeta")&&Object.defineProperty(Xe,"__filemeta",{configurable:!0,value:{name:"SEO",filename:"node_modules/gatsby-theme-docz/src/base/Seo.js"}});var Ze=function(e){var t=e.children,n=e.entry,r=e.isTransclusion,o=Object(i.a)(e,["children","entry","isTransclusion"]),a=Object(d.c)(),s=a.notFound,c=a.layout,l=Qe(Qe({},o),{},{doc:n});return n||r?r?t:Object(E.jsx)(j,{components:a},Object(E.jsx)(T,null,Object(E.jsx)(c,l,t))):Object(E.jsx)(s,null)},qe=function(e){var t=e.children,n=Object(i.a)(e,["children"]),o=n.pageContext,a=k(),c=function(e,t){var n=t&&t.frontmatter&&"/"===t.frontmatter.route,r=l()("value.route","/");if(t&&!t.entry&&n)return e.entries.find(r);var o=s()("entry.filepath",t);return e.entries.find(l()("value.filepath",o))}(a,o),u=function(e,t){var n=e.entries,r=s()("_frontmatter.__filemeta.filename",t);return!t.pageContext&&n.includes(n.find(l()("value.filepath",r)))}(a,n);return Object(E.jsx)(f.Fragment,null,c&&Object(E.jsx)(Ie,{title:c.value.name}),Object(E.jsx)(Be,{db:a,currentEntry:c},Object(E.jsx)(Ze,Object(r.a)({},n,{entry:c,isTransclusion:u}),t)))};t.a=qe;void 0!==qe&&qe&&qe===Object(qe)&&Object.isExtensible(qe)&&!qe.hasOwnProperty("__filemeta")&&Object.defineProperty(qe,"__filemeta",{configurable:!0,value:{name:"Layout",filename:"node_modules/gatsby-theme-docz/src/base/Layout.js"}}),void 0!==qe&&qe&&qe===Object(qe)&&Object.isExtensible(qe)&&!qe.hasOwnProperty("__filemeta")&&Object.defineProperty(qe,"__filemeta",{configurable:!0,value:{name:"Layout",filename:"node_modules/gatsby-theme-docz/src/base/Layout.js"}})},oasZ:function(e,t,n){var r=n("sZCt")("matchesProperty",n("3pNy"));r.placeholder=n("wuTn"),e.exports=r},rSSF:function(e,t,n){},t23M:function(e,t,n){"use strict";var r=n("7a9J"),o=n("QDMQ"),i=n("ls4f"),a=n("x364"),s=n("VuTP"),c=n("q1tI"),l=n("i8i4"),f=n.n(l);var u=n("Zm9Q"),d=n("Kwbf"),p=n("c+Xe"),m=n("bdgK"),h=function(e){Object(a.a)(n,e);var t=Object(s.a)(n);function n(){var e;return Object(o.a)(this,n),(e=t.apply(this,arguments)).resizeObserver=null,e.childNode=null,e.currentElement=null,e.state={width:0,height:0,offsetHeight:0,offsetWidth:0},e.onResize=function(t){var n=e.props.onResize,o=t[0].target,i=o.getBoundingClientRect(),a=i.width,s=i.height,c=o.offsetWidth,l=o.offsetHeight,f=Math.floor(a),u=Math.floor(s);if(e.state.width!==f||e.state.height!==u||e.state.offsetWidth!==c||e.state.offsetHeight!==l){var d={width:f,height:u,offsetWidth:c,offsetHeight:l};e.setState(d),n&&Promise.resolve().then((function(){n(Object(r.a)(Object(r.a)({},d),{},{offsetWidth:c,offsetHeight:l}))}))}},e.setChildNode=function(t){e.childNode=t},e}return Object(i.a)(n,[{key:"componentDidMount",value:function(){this.onComponentUpdated()}},{key:"componentDidUpdate",value:function(){this.onComponentUpdated()}},{key:"componentWillUnmount",value:function(){this.destroyObserver()}},{key:"onComponentUpdated",value:function(){if(this.props.disabled)this.destroyObserver();else{var e,t=(e=this.childNode||this)instanceof HTMLElement?e:f.a.findDOMNode(e);t!==this.currentElement&&(this.destroyObserver(),this.currentElement=t),!this.resizeObserver&&t&&(this.resizeObserver=new m.default(this.onResize),this.resizeObserver.observe(t))}}},{key:"destroyObserver",value:function(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null)}},{key:"render",value:function(){var e=this.props.children,t=Object(u.a)(e);if(t.length>1)Object(d.a)(!1,"Find more than one child node with `children` in ResizeObserver. Will only observe first one.");else if(0===t.length)return Object(d.a)(!1,"`children` of ResizeObserver is empty. Nothing is in observe."),null;var n=t[0];if(c.isValidElement(n)&&Object(p.b)(n)){var r=n.ref;t[0]=c.cloneElement(n,{ref:Object(p.a)(r,this.setChildNode)})}return 1===t.length?t[0]:t.map((function(e,t){return!c.isValidElement(e)||"key"in e&&null!==e.key?e:c.cloneElement(e,{key:"".concat("rc-observer-key","-").concat(t)})}))}}]),n}(c.Component);h.displayName="ResizeObserver";t.a=h}}]);
//# sourceMappingURL=804f16158a7ef42a7bad4c7877b41224126ae8d1-16143f597378037bb2e6.js.map