PageSourceSearch

https://archive-os-3-24.netlify.app/assets/js/8d2ee5ff.b7d668c9.js

js archive-os-3-24.netlify.app collected 2026-10-04 10:31:28 UTC 23,040 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunktigera_docs=self.webpackChunktigera_docs||[]).push([[5360],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>m});var n=a(67294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?o(Object(a),!0).forEach((function(t){r(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):o(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,n,r=function(e,t){if(null==e)return{};var a,n,r={},o=Object.keys(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)a=o[n],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),u=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},p=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,p=i(e,["components","mdxType","originalType","parentName"]),c=u(a),m=r,k=c["".concat(s,".").concat(m)]||c[m]||d[m]||o;return a?n.createElement(k,l(l({ref:t},p),{},{components:a})):n.createElement(k,l({ref:t},p))}));function m(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,l=new Array(o);l[0]=c;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var u=2;u<o;u++)l[u]=a[u];return n.createElement.apply(null,l)}return n.createElement.apply(null,a)}c.displayName="MDXCreateElement"},1826:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>s,default:()=>m,frontMatter:()=>i,metadata:()=>u,toc:()=>d});var n=a(87462),r=(a(67294),a(3905)),o=a(74866),l=a(85162);const i={description:"Configure dual stack or IPv6 only for workloads."},s="Configure dual stack or IPv6 only",u={unversionedId:"networking/ipam/ipv6",id:"version-3.24/networking/ipam/ipv6",title:"Configure dual stack or IPv6 only",description:"Configure dual stack or IPv6 only for workloads.",source:"@site/calico_versioned_docs/version-3.24/networking/ipam/ipv6.mdx",sourceDirName:"networking/ipam",slug:"/networking/ipam/ipv6",permalink:"/calico/3.24/networking/ipam/ipv6",draft:!1,editUrl:"https://github.com/tigera/docs/edit/main/calico_versioned_docs/version-3.24/networking/ipam/ipv6.mdx",tags:[],version:"3.24",frontMatter:{description:"Configure dual stack or IPv6 only for workloads."},sidebar:"calicoSidebar",previous:{title:"Configure IP autodetection",permalink:"/calico/3.24/networking/ipam/ip-autodetection"},next:{title:"Configure Kubernetes control plane to operate over IPv6",permalink:"/calico/3.24/networking/ipam/ipv6-control-plane"}},p={},d=[{value:"Big picture",id:"big-picture",level:2},{value:"Value",id:"value",level:2},{value:"Features",id:"features",level:2},{value:"Before you begin",id:"before-you-begin",level:2},{value:"How to",id:"how-to",level:2},{value:"Enable IPv6 only",id:"enable-ipv6-only",level:3},{value:"Enable dual stack",id:"enable-dual-stack",level:3},{value:"Additional resources",id:"additional-resources",level:2}],c={toc:d};
1function m(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"configure-dual-stack-or-ipv6-only"},"Configure dual stack or IPv6 only"),(0,r.kt)("h2",{id:"big-picture"},"Big picture"),(0,r.kt)("p",null,"Configure Calico IP address allocation to use dual stack or IPv6 only for workload communications."),(0,r.kt)("h2",{id:"value"},"Value"),(0,r.kt)("p",null,"Workload communication over IPv6 is increasingly desirable, as well as or instead of IPv4. Calico supports:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"IPv4 only")," (default)"),(0,r.kt)("p",{parentName:"li"},"Each workload gets an IPv4 address, and can communicate over IPv4.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Dual stack")),(0,r.kt)("p",{parentName:"li"},"Each workload gets an IPv4 and an IPv6 address, and can communicate over IPv4 or IPv6.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"IPv6 only")),(0,r.kt)("p",{parentName:"li"},"Each workload gets an IPv6 address, and can communicate over IPv6."))),(0,r.kt)("h2",{id:"features"},"Features"),(0,r.kt)("p",null,"This how-to guide uses the following Calico features:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"CNI plugin configuration")," with ",(0,r.kt)("inlineCode",{parentName:"li"},"assign_ipv6")," and ",(0,r.kt)("inlineCode",{parentName:"li"},"assign_ipv4")," flags"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"IPPool"))),(0,r.kt)("h2",{id:"before-you-begin"},"Before you begin"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Calico requirements")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Calico IPAM")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kubernetes version requirements")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"For dual stack, 1.16 and later"),(0,r.kt)("li",{parentName:"ul"},"For one IP stack at a time (IPv4 or IPv6), any Kubernetes version")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kubernetes IPv6 host requirements")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"An IPv6 address that is reachable from the other hosts"),(0,r.kt)("li",{parentName:"ul"},"The sysctl setting, ",(0,r.kt)("inlineCode",{parentName:"li"},"net.ipv6.conf.all.forwarding"),", is set to ",(0,r.kt)("inlineCode",{parentName:"li"},"1"),".\nThis ensures both Kubernetes service traffic and Calico traffic is forwarded appropriately."),(0,r.kt)("li",{parentName:"ul"},"A default IPv6 route")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Kubernetes IPv4 host requirements")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"An IPv4 address that is reachable from the other hosts"),(0,r.kt)("li",{parentName:"ul"},"The sysctl setting, ",(0,r.kt)("inlineCode",{parentName:"li"},"net.ipv4.conf.all.forwarding"),", is set to ",(0,r.kt)("inlineCode",{parentName:"li"},"1"),".\nThis ensures both Kubernetes service traffic and Calico traffic is forwarded appropriately."),(0,r.kt)("li",{parentName:"ul"},"A default IPv4 route")),(0,r.kt)("h2",{id:"how-to"},"How to"),(0,r.kt)("admonition",{type:"note"},(0,r.kt)("p",{parentName:"admonition"},"The following tasks are only for new clusters.")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#enable-ipv6-only"},"Enable IPv6 only")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#enable-dual-stack"},"Enable dual stack"))),(0,r.kt)("h3",{id:"enable-ipv6-only"},"Enable IPv6 only"),(0,r.kt)(o.Z,{mdxType:"Tabs"},(0,r.kt)(l.Z,{label:"Operator",value:"Operator-0",mdxType:"TabItem"},(0,r.kt)("p",null,"To configure an IPv6-only cluster using the operator, edit your default Installation at install time to include a single IPv6 pool, and no IPv4 pools. For example:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: operator.tigera.io/v1\nkind: Installation\nmetadata:\n  name: default\nspec:\n  calicoNetwork:\n     # Note: The ipPools section cannot be modified post-install.\n    ipPools:\n      - blockSize: 122\n        cidr: 2001::00/64\n        encapsulation: None\n        natOutgoing: Enabled\n        nodeSelector: all()\n"))),(0,r.kt)(l.Z,{label:"Manifest",value:"Manifest-1",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Set up a new Kubernetes cluster with an IPv6 pod CIDR and service IP range.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Using the ",(0,r.kt)("a",{parentName:"p",href:"/calico/3.24/getting-started/kubernetes/self-managed-onprem/onpremises"},"Calico Kubernetes install guide"),", download the correct Calico manifest for the cluster and datastore type.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Edit the CNI config (calico-config ConfigMap in the manifest) to disable IPv4 assignments and enable IPv6 assignments."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},'    "ipam": {\n        "type": "calico-ipam",\n        "assign_ipv4": "false",\n        "assign_ipv6": "true"\n    },\n'))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Configure IPv6 support by adding the following variable settings to the environment for the ",(0,r.kt)("inlineCode",{parentName:"p"},"calico-node")," container:"),(0,r.kt)("table",{parentName:"li"},(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Variable name"),(0,r.kt)("th",{parentName:"tr",align:null},"Value"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"IP6")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"autodetect"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"FELIX_IPV6SUPPORT")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"true"))))),(0,r.kt)("admonition",{parentName:"li",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"If your IPv6 IP pools include private IP addresses, pods that are assigned private IP addresses cannot perform outbound NAT by default. "),(0,r.kt)("p",{parentName:"admonition"},"To enable outbound NAT for these pods, add ",(0,r.kt)("inlineCode",{parentName:"p"},"CALICO_IPV6POOL_NAT_OUTGOING: true")," to the environment of the ",(0,r.kt)("inlineCode",{parentName:"p"},"calico-node")," container."))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"}
1,"For clusters ",(0,r.kt)("strong",{parentName:"p"},"not")," provisioned with kubeadm (see note below), configure the default IPv6 IP pool by adding the following variable setting to the environment for the ",(0,r.kt)("inlineCode",{parentName:"p"},"calico-node")," container:"),(0,r.kt)("table",{parentName:"li"},(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Variable name"),(0,r.kt)("th",{parentName:"tr",align:null},"Value"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"CALICO_IPV6POOL_CIDR")),(0,r.kt)("td",{parentName:"tr",align:null},"the same as the IPv6 range you configured as the cluster CIDR to kube-controller-manager and kube-proxy")))),(0,r.kt)("admonition",{parentName:"li",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"For clusters provisioned with kubeadm, Calico autodetects the IPv4 and IPv6 pod CIDRs and does not require configuration."))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Apply the edited manifest with ",(0,r.kt)("inlineCode",{parentName:"p"},"kubectl apply -f"),"."),(0,r.kt)("p",{parentName:"li"},"New pods will get IPv6 addresses, and can communicate with each other and the outside world over IPv6."))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"(Optional) Update host to not look for IPv4 addresses")),(0,r.kt)("p",null,"If you want your workloads to have IPv6 addresses only, because you do not have IPv4 addresses or connectivity\nbetween your nodes, complete these additional steps to tell Calico not to look for any IPv4 addresses."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Disable ",(0,r.kt)("a",{parentName:"li",href:"/calico/3.24/networking/ipam/ip-autodetection"},"IP autodetection of IPv4")," by setting ",(0,r.kt)("inlineCode",{parentName:"li"},"IP")," to ",(0,r.kt)("inlineCode",{parentName:"li"},"none"),"."),(0,r.kt)("li",{parentName:"ol"},"Calculate the Calico BGP router ID for IPv6 using either of the following methods.",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Set the environment variable ",(0,r.kt)("inlineCode",{parentName:"li"},"CALICO_ROUTER_ID=hash")," on calico/node.\nThis configures Calico to calculate the router ID based on the hostname."),(0,r.kt)("li",{parentName:"ul"},"Pass a unique value for ",(0,r.kt)("inlineCode",{parentName:"li"},"CALICO_ROUTER_ID")," to each node individually.")))))),(0,r.kt)("h3",{id:"enable-dual-stack"},"Enable dual stack"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Set up a new cluster following the Kubernetes ",(0,r.kt)("a",{parentName:"li",href:"https://kubernetes.io/docs/concepts/services-networking/dual-stack/#prerequisites"},"prerequisites")," and ",(0,r.kt)("a",{parentName:"li",href:"https://kubernetes.io/docs/concepts/services-networking/dual-stack/#enable-ipv4-ipv6-dual-stack"},"enablement steps"),".")),(0,r.kt)(o.Z,{mdxType:"Tabs"},(0,r.kt)(l.Z,{label:"Operator",value:"Operator-2",mdxType:"TabItem"},(0,r.kt)("p",null,"To configure dual-stack cluster using the operator, edit your default Installation at install time to include both an IPv4 and IPv6 pool. For example:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"apiVersion: operator.tigera.io/v1\nkind: Installation\nmetadata:\n  name: default\nspec:\n   # Configures Calico networking.\n  calicoNetwork:\n     # Note: The ipPools section cannot be modified post-install.\n    ipPools:\n      - blockSize: 26\n        cidr: 10.48.0.0/21\n        encapsulation: IPIP\n        natOutgoing: Enabled\n        nodeSelector: all()\n      - blockSize: 122\n        cidr: 2001::00/64\n        encapsulation: None\n        natOutgoing: Enabled\n        nodeSelector: all()\n"))),(0,r.kt)(l.Z,{label:"Manifest",value:"Manifest-3",mdxType:"TabItem"},(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Using the ",(0,r.kt)("a",{parentName:"p",href:"/calico/3.24/getting-started/kubernetes/self-managed-onprem/onpremises"},"Calico Kubernetes install guide"),", download the correct Calico manifest for the cluster and datastore type.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Edit the CNI config (",(0,r.kt)("inlineCode",{parentName:"p"},"calico-config")," ConfigMap in the manifest), and enable IPv4 and IPv6 address allocation by setting both fields to true."),(0,r.kt)("pre",{parentName:"li"},(0,r.kt)("code",{parentName:"pre"},'    "ipam": {\n        "type": "calico-ipam",\n        "assign_ipv4": "true",\n        "assign_ipv6": "true"\n    },\n'))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Configure IPv6 support by adding the following variable settings to the environment for the ",(0,r.kt)("inlineCode",{parentName:"p"},"calico-node")," container:"),(0,r.kt)("table",{parentName:"li"},(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Variable name"),(0,r.kt)("th",{parentName:"tr",align:null},"Value"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"IP6")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"autodetect"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"FELIX_IPV6SUPPORT")),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"true"))))),(0,r.kt)("admonition",{parentName:"li",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"If your IPv6 IP pools include private IP addresses, pods that are assigned private IP addresses cannot perform outbound NAT by default. "),(0,r.kt)("p",{parentName:"admonition"},"To enable outbound NAT for these pods, add ",(0,r.kt)("inlineCode",{parentName:"p"},"CALICO_IPV6POOL_NAT_OUTGOING: true")," to the environment of the ",(0,r.kt)("inlineCode",{parentName:"p"},"calico-node")," container."))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"}
1,"For clusters ",(0,r.kt)("strong",{parentName:"p"},"not")," provisioned with kubeadm (see note below), configure the default IPv6 IP pool by adding the following variable setting to the environment for the ",(0,r.kt)("inlineCode",{parentName:"p"},"calico-node")," container:"),(0,r.kt)("table",{parentName:"li"},(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},"Variable name"),(0,r.kt)("th",{parentName:"tr",align:null},"Value"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("inlineCode",{parentName:"td"},"CALICO_IPV6POOL_CIDR")),(0,r.kt)("td",{parentName:"tr",align:null},"the same as the IPv6 range you configured as the IPv6 cluster CIDR to kube-controller-manager and kube-proxy")))),(0,r.kt)("admonition",{parentName:"li",type:"note"},(0,r.kt)("p",{parentName:"admonition"},"For clusters provisioned with kubeadm, Calico autodetects the IPv4 and IPv6 pod CIDRs and does not require configuration."))),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},"Apply the edited manifest with ",(0,r.kt)("inlineCode",{parentName:"p"},"kubectl apply -f"),"."),(0,r.kt)("p",{parentName:"li"},"New pods will get both IPv4 and IPv6 addresses, and can communicate with each other and the outside world over IPv4 or IPv6."))))),(0,r.kt)("h2",{id:"additional-resources"},"Additional resources"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/calico/3.24/networking/ipam/ipv6-control-plane"},"Configure Kubernetes control plane to operate over IPv6"))))}m.isMDXComponent=!0},85162:(e,t,a)=>{a.d(t,{Z:()=>l});var n=a(67294),r=a(86010);const o="tabItem_Ymn6";function l(e){let{children:t,hidden:a,className:l}=e;return n.createElement("div",{role:"tabpanel",className:(0,r.Z)(o,l),hidden:a},t)}},74866:(e,t,a)=>{a.d(t,{Z:()=>I});var n=a(87462),r=a(67294),o=a(86010),l=a(12466),i=a(76775),s=a(91980),u=a(67392),p=a(50012);function d(e){return function(e){return r.Children.map(e,(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:t,label:a,attributes:n,default:r}}=e;return{value:t,label:a,attributes:n,default:r}}))}function c(e){const{values:t,children:a}=e;return(0,r.useMemo)((()=>{const e=t??d(a);return function(e){const t=(0,u.l)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e}),[t,a])}function m(e){let{value:t,tabValues:a}=e;return a.some((e=>e.value===t))}function k(e){let{queryString:t=!1,groupId:a}=e;const n=(0,i.k6)(),o=function(e){let{queryString:t=!1,groupId:a}=e;if("string"==typeof t)return t;if(!1===t)return null;if(!0===t&&!a)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return a??null}({queryString:t,groupId:a});return[(0,s._X)(o),(0,r.useCallback)((e=>{if(!o)return;const t=new URLSearchParams(n.location.search);t.set(o,e),n.replace({...n.location,search:t.toString()})}),[o,n])]}function f(e){const{defaultValue:t,queryString:a=!1,groupId:n}=e,o=c(e),[l,i]=(0,r.useState)((()=>function(e){let{defaultValue:t,tabValues:a}=e;if(0===a.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(t){if(!m({value:t,tabValues:a}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${t}" but none of its children has the corresponding value. Available values are: ${a.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return t}const n=a.find((e=>e.default))??a[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:o}))),[s,u]=k({queryString:a,groupId:n}),[d,f]=function(e){let{groupId:t}=e;const a=function(e){return e?`docusaurus.tab.${e}`:null}(t),[n,o]=(0,p.Nk)(a);return[n,(0,r.useCallback)((e=>{a&&o.set(e)}),[a,o])]}({groupId:n}),v=(()=>{const e=s??d;return m({value:e,tabValues:o})?e:null})();(0,r.useLayoutEffect)((()=>{v&&i(v)}),[v]);return{selectedValue:l,selectValue:(0,r.useCallback)((e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);i(e),u(e),f(e)}),[u,f,o]),tabValues:o}}var v=a(72389);const b="tabList__CuJ",g="tabItem_LNqP";function h(e){let{className:t,block:a,selectedValue:i,selectValue:s,tabValues:u}=e;const p=[],{blockElementScrollPositionUntilNextRender:d}=(0,l.o5)(),c=e=>{const t=e.currentTarget,a=p.indexOf(t),n=u[a].value;n!==i&&(d(t),s(n))},m=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const a=p.indexOf(e.currentTarget)+1;t=p[a]??p[0];break}case"ArrowLeft":{const a=p.indexOf(e.currentTarget)-1;t=p[a]??p[p.length-1];break}}t?.focus()};return r.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.Z)("tabs",{"tabs--block":a},t)},u.map((e=>{let{value:t,label:a,attributes:l}=e;return r.createElement("li",(0,n.Z)({role:"tab",tabIndex:i===t?0:-1,"aria-selected":i===t,key:t,ref:e=>p.push(e),onKeyDown:m,onClick:c},l,{className:(0,o.Z)("tabs__item",g,l?.className,{"tabs__item--active":i===t})}),a??t)})))}function N(e){let{lazy:t,children:a,selectedValue:n}=e;
1const o=(Array.isArray(a)?a:[a]).filter(Boolean);if(t){const e=o.find((e=>e.props.value===n));return e?(0,r.cloneElement)(e,{className:"margin-top--md"}):null}return r.createElement("div",{className:"margin-top--md"},o.map(((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==n}))))}function y(e){const t=f(e);return r.createElement("div",{className:(0,o.Z)("tabs-container",b)},r.createElement(h,(0,n.Z)({},e,t)),r.createElement(N,(0,n.Z)({},e,t)))}function I(e){const t=(0,v.Z)();return r.createElement(y,(0,n.Z)({key:String(t)},e))}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.