Page Not Found
We could not find what you were looking for.
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
diff --git a/404.html b/404.html index 0212772..dd607a6 100644 --- a/404.html +++ b/404.html @@ -2,23 +2,23 @@
- +We could not find what you were looking for.
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
We could not find what you were looking for.
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
a8s
Stack",id:"a8s-stack",level:3},{value:"Go to the a8s Stack documentation",id:"go-to-the-a8s-stack-documentation",level:3},{value:"klutch
Stack",id:"klutch-stack",level:3},{value:"Go to the klutch Stack documentation",id:"go-to-the-klutch-stack-documentation",level:3}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"a9s-cli",children:"a9s CLI"})}),"\n",(0,t.jsxs)(s.p,{children:["anynines provides a command line tool called ",(0,t.jsx)(s.code,{children:"a9s"})," to facilitate application development, devops tasks and interact with selected anynines products."]}),"\n",(0,t.jsx)(s.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"MacOS / Linux."}),"\n",(0,t.jsx)(s.li,{children:"Using the backup/restore feature of a8s PostgreSQL requires an S3 compatible endpoint."}),"\n",(0,t.jsxs)(s.li,{children:["Install Go (if you want ",(0,t.jsx)(s.code,{children:"go env"})," to identify your OS and arch)."]}),"\n",(0,t.jsx)(s.li,{children:"Install Git."}),"\n",(0,t.jsx)(s.li,{children:"Install Docker."}),"\n",(0,t.jsx)(s.li,{children:"Install Kubectl."}),"\n",(0,t.jsx)(s.li,{children:"Install Kind and/or Minikube."}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"installing-the-cli",children:"Installing the CLI"}),"\n",(0,t.jsxs)(s.p,{children:["In order to install the ",(0,t.jsx)(s.code,{children:"a9s"})," CLI execute the following shell script:"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"RELEASE=$(curl -L -s https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/stable.txt); OS=$(go env GOOS); ARCH=$(go env GOARCH); curl -fsSL -o a9s https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/releases/$RELEASE/a9s-$OS-$ARCH\n \nsudo chmod 755 a9s\nsudo mv a9s /usr/local/bin\n"})}),"\n",(0,t.jsxs)(s.p,{children:["This will download the ",(0,t.jsx)(s.code,{children:"a9s"})," binary suitable for your architecture and move it to ",(0,t.jsx)(s.code,{children:"/usr/local/bin"}),".\nDepending on your system you have to adjust the ",(0,t.jsx)(s.code,{children:"PATH"})," variable or move the binary to a folder that's already in the ",(0,t.jsx)(s.code,{children:"PATH"}),"."]}),"\n",(0,t.jsx)(s.h2,{id:"using-the-cli",children:"Using the CLI"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"a9s\n"})}),"\n",(0,t.jsx)(s.h2,{id:"use-cases",children:"Use Cases"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"a9s"})," CLI can be used to install and use the following stacks:"]}),"\n",(0,t.jsxs)(s.h3,{id:"a8s-stack",children:[(0,t.jsx)(s.code,{children:"a8s"})," Stack"]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["Install a local Kubernetes cluster (",(0,t.jsx)(s.code,{children:"minikube"})," or ",(0,t.jsx)(s.code,{children:"kind"}),")."]}),"\n",(0,t.jsxs)(s.li,{children:["Install the ",(0,t.jsx)(s.a,{href:"https://cert-manager.io/",children:"cert-manager"}),"."]}),"\n",(0,t.jsx)(s.li,{children:"Install a local Minio object store for storing Backups."}),"\n",(0,t.jsxs)(s.li,{children:["Install the a8s PostgreSQL Operator PostgreSQL supporting","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["creating dedicated PostgreSQL clusters with","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"synchronous and asynchronous streaming replication."}),"\n",(0,t.jsx)(s.li,{children:"automatic failure detection and automatic failover."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"backup and restore capabilities storing backups in an S3 compatible object store such as AWS S3 or Minio."}),"\n",(0,t.jsx)(s.li,{children:"ability to easily create database users and Kubernetes Secrets by using the Service Bindings abstraction"}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["Easily apply ",(0,t.jsx)(s.code,{children:".sql"})," files and SQL commands to PostgreSQL clusters."]}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"go-to-the-a8s-stack-documentation",children:(0,t.jsx)(s.a,{href:"/docs/a9s-cli-a8s/",children:"Go to the a8s Stack documentation"})}),"\n",(0,t.jsxs)(s.h3,{id:"klutch-stack",children:[(0,t.jsx)(s.code,{children:"klutch"})," Stack"]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["Install a local Klutch Control Plane Cluster using ",(0,t.jsx)(s.code,{children:"kind"})]}),"\n",(0,t.jsx)(s.li,{children:"Install Crossplane and the a8s stack on the Control Plane Cluster"}),"\n",(0,t.jsx)(s.li,{children:"Bind resources from an App Cluster to the Control Plane Cluster"}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"go-to-the-klutch-stack-documentation",children:(0,t.jsx)(s.a,{href:"/docs/a9s-cli-klutch/",children:"Go to the klutch Stack documentation"})})]})}function u(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>l,x:()=>c});var a=n(6540);const t={},i=a.createContext(t);function l(e){const s=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),a.createElement(i.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/02875b28.9bf4c50e.js b/assets/js/02875b28.9bf4c50e.js
deleted file mode 100644
index 29481e4..0000000
--- a/assets/js/02875b28.9bf4c50e.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[7041],{4893:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>c,toc:()=>r});var a=n(4848),i=n(8453);const t={id:"a9s-cli",title:"a9s CLI",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]},l="a9s CLI",c={id:"a9s-cli",title:"a9s CLI",description:"anynines provides a command line tool called a9s to facilitate application development, devops tasks and interact with selected anynines products.",source:"@site/docs/a9s-cli-index.md",sourceDirName:".",slug:"/a9s-cli",permalink:"/docs/develop/a9s-cli",draft:!1,unlisted:!1,tags:[{inline:!0,label:"a9s cli",permalink:"/docs/develop/tags/a-9-s-cli"},{inline:!0,label:"a9s hub",permalink:"/docs/develop/tags/a-9-s-hub"},{inline:!0,label:"a9s data services",permalink:"/docs/develop/tags/a-9-s-data-services"},{inline:!0,label:"a8s data services",permalink:"/docs/develop/tags/a-8-s-data-services"},{inline:!0,label:"a9s postgres",permalink:"/docs/develop/tags/a-9-s-postgres"},{inline:!0,label:"a8s postgres",permalink:"/docs/develop/tags/a-8-s-postgres"},{inline:!0,label:"data service",permalink:"/docs/develop/tags/data-service"},{inline:!0,label:"introduction",permalink:"/docs/develop/tags/introduction"},{inline:!0,label:"kubernetes",permalink:"/docs/develop/tags/kubernetes"},{inline:!0,label:"minikube",permalink:"/docs/develop/tags/minikube"},{inline:!0,label:"kind",permalink:"/docs/develop/tags/kind"},{inline:!0,label:"klutch",permalink:"/docs/develop/tags/klutch"}],version:"current",frontMatter:{id:"a9s-cli",title:"a9s CLI",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]},sidebar:"tutorialSidebar",previous:{title:"a9s CLI a8s",permalink:"/docs/develop/a9s-cli-a8s"},next:{title:"a9s CLI Klutch",permalink:"/docs/develop/a9s-cli-klutch"}},o={},r=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installing the CLI",id:"installing-the-cli",level:2},{value:"Using the CLI",id:"using-the-cli",level:2},{value:"Use Cases",id:"use-cases",level:2},{value:"a8s
Stack",id:"a8s-stack",level:3},{value:"Go to the a8s Stack documentation",id:"go-to-the-a8s-stack-documentation",level:3},{value:"klutch
Stack",id:"klutch-stack",level:3},{value:"Go to the klutch Stack documentation",id:"go-to-the-klutch-stack-documentation",level:3}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.h1,{id:"a9s-cli",children:"a9s CLI"}),"\n",(0,a.jsxs)(s.p,{children:["anynines provides a command line tool called ",(0,a.jsx)(s.code,{children:"a9s"})," to facilitate application development, devops tasks and interact with selected anynines products."]}),"\n",(0,a.jsx)(s.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsx)(s.li,{children:"MacOS / Linux."}),"\n",(0,a.jsx)(s.li,{children:"Using the backup/restore feature of a8s PostgreSQL requires an S3 compatible endpoint."}),"\n",(0,a.jsxs)(s.li,{children:["Install Go (if you want ",(0,a.jsx)(s.code,{children:"go env"})," to identify your OS and arch)."]}),"\n",(0,a.jsx)(s.li,{children:"Install Git."}),"\n",(0,a.jsx)(s.li,{children:"Install Docker."}),"\n",(0,a.jsx)(s.li,{children:"Install Kubectl."}),"\n",(0,a.jsx)(s.li,{children:"Install Kind and/or Minikube."}),"\n"]}),"\n",(0,a.jsx)(s.h2,{id:"installing-the-cli",children:"Installing the CLI"}),"\n",(0,a.jsxs)(s.p,{children:["In order to install the ",(0,a.jsx)(s.code,{children:"a9s"})," CLI execute the following shell script:"]}),"\n",(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-bash",children:"RELEASE=$(curl -L -s https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/stable.txt); OS=$(go env GOOS); ARCH=$(go env GOARCH); curl -fsSL -o a9s https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/releases/$RELEASE/a9s-$OS-$ARCH\n \nsudo chmod 755 a9s\nsudo mv a9s /usr/local/bin\n"})}),"\n",(0,a.jsxs)(s.p,{children:["This will download the ",(0,a.jsx)(s.code,{children:"a9s"})," binary suitable for your architecture and move it to ",(0,a.jsx)(s.code,{children:"/usr/local/bin"}),".\nDepending on your system you have to adjust the ",(0,a.jsx)(s.code,{children:"PATH"})," variable or move the binary to a folder that's already in the ",(0,a.jsx)(s.code,{children:"PATH"}),"."]}),"\n",(0,a.jsx)(s.h2,{id:"using-the-cli",children:"Using the CLI"}),"\n",(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-bash",children:"a9s\n"})}),"\n",(0,a.jsx)(s.h2,{id:"use-cases",children:"Use Cases"}),"\n",(0,a.jsxs)(s.p,{children:["The ",(0,a.jsx)(s.code,{children:"a9s"})," CLI can be used to install and use the following stacks:"]}),"\n",(0,a.jsxs)(s.h3,{id:"a8s-stack",children:[(0,a.jsx)(s.code,{children:"a8s"})," Stack"]}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsxs)(s.li,{children:["Install a local Kubernetes cluster (",(0,a.jsx)(s.code,{children:"minikube"})," or ",(0,a.jsx)(s.code,{children:"kind"}),")."]}),"\n",(0,a.jsxs)(s.li,{children:["Install the ",(0,a.jsx)(s.a,{href:"https://cert-manager.io/",children:"cert-manager"}),"."]}),"\n",(0,a.jsx)(s.li,{children:"Install a local Minio object store for storing Backups."}),"\n",(0,a.jsxs)(s.li,{children:["Install the a8s PostgreSQL Operator PostgreSQL supporting","\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsxs)(s.li,{children:["creating dedicated PostgreSQL clusters with","\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsx)(s.li,{children:"synchronous and asynchronous streaming replication."}),"\n",(0,a.jsx)(s.li,{children:"automatic failure detection and automatic failover."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(s.li,{children:"backup and restore capabilities storing backups in an S3 compatible object store such as AWS S3 or Minio."}),"\n",(0,a.jsx)(s.li,{children:"ability to easily create database users and Kubernetes Secrets by using the Service Bindings abstraction"}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(s.li,{children:["Easily apply ",(0,a.jsx)(s.code,{children:".sql"})," files and SQL commands to PostgreSQL clusters."]}),"\n"]}),"\n",(0,a.jsx)(s.h3,{id:"go-to-the-a8s-stack-documentation",children:(0,a.jsx)(s.a,{href:"/docs/a9s-cli-a8s/",children:"Go to the a8s Stack documentation"})}),"\n",(0,a.jsxs)(s.h3,{id:"klutch-stack",children:[(0,a.jsx)(s.code,{children:"klutch"})," Stack"]}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsxs)(s.li,{children:["Install a local Klutch Control Plane Cluster using ",(0,a.jsx)(s.code,{children:"kind"})]}),"\n",(0,a.jsx)(s.li,{children:"Install Crossplane and the a8s stack on the Control Plane Cluster"}),"\n",(0,a.jsx)(s.li,{children:"Bind resources from an App Cluster to the Control Plane Cluster"}),"\n"]}),"\n",(0,a.jsx)(s.h3,{id:"go-to-the-klutch-stack-documentation",children:(0,a.jsx)(s.a,{href:"/docs/a9s-cli-klutch/",children:"Go to the klutch Stack documentation"})})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,a.jsx)(s,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>l,x:()=>c});var a=n(6540);const i={},t=a.createContext(i);function l(e){const s=a.useContext(t);return a.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),a.createElement(t.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0914dfc1.949e23ff.js b/assets/js/0914dfc1.949e23ff.js
deleted file mode 100644
index ce66498..0000000
--- a/assets/js/0914dfc1.949e23ff.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[3459],{1914:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>a,metadata:()=>c,toc:()=>o});var i=n(4848),r=n(8453);const a={id:"a9s-cli-a8s",title:"a9s CLI a8s",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]},t="a8s Stack",c={id:"a9s-cli-a8s",title:"a9s CLI a8s",description:"Create a local Kubernetes cluster using Minikube or Kind, install a8s PostgreSQL including its dependencies as well as a local Minio object store.",source:"@site/versioned_docs/version-0.14.0/a9s-cli-a8s.md",sourceDirName:".",slug:"/a9s-cli-a8s",permalink:"/docs/a9s-cli-a8s",draft:!1,unlisted:!1,tags:[{inline:!0,label:"a9s cli",permalink:"/docs/tags/a-9-s-cli"},{inline:!0,label:"a9s hub",permalink:"/docs/tags/a-9-s-hub"},{inline:!0,label:"a9s data services",permalink:"/docs/tags/a-9-s-data-services"},{inline:!0,label:"a8s data services",permalink:"/docs/tags/a-8-s-data-services"},{inline:!0,label:"a9s postgres",permalink:"/docs/tags/a-9-s-postgres"},{inline:!0,label:"a8s postgres",permalink:"/docs/tags/a-8-s-postgres"},{inline:!0,label:"data service",permalink:"/docs/tags/data-service"},{inline:!0,label:"introduction",permalink:"/docs/tags/introduction"},{inline:!0,label:"kubernetes",permalink:"/docs/tags/kubernetes"},{inline:!0,label:"minikube",permalink:"/docs/tags/minikube"},{inline:!0,label:"kind",permalink:"/docs/tags/kind"},{inline:!0,label:"klutch",permalink:"/docs/tags/klutch"}],version:"0.14.0",frontMatter:{id:"a9s-cli-a8s",title:"a9s CLI a8s",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]}},l={},o=[{value:"Cold-Run",id:"cold-run",level:2},{value:"Setting Up a Working Directory",id:"setting-up-a-working-directory",level:3},{value:"Configuring the Backup Store",id:"configuring-the-backup-store",level:3},{value:"Skip Checking Prerequisites",id:"skip-checking-prerequisites",level:2},{value:"Number of Kubernetes Nodes",id:"number-of-kubernetes-nodes",level:2},{value:"Cluster Memory",id:"cluster-memory",level:2},{value:"Deployment Version",id:"deployment-version",level:2},{value:"Kubernetes Provider",id:"kubernetes-provider",level:2},{value:"Backup Infrastructure Region",id:"backup-infrastructure-region",level:2},{value:"Unattended Mode",id:"unattended-mode",level:2},{value:"Printing the Working Directory",id:"printing-the-working-directory",level:2},{value:"Creating a PostgreSQL Service Instance",id:"creating-a-postgresql-service-instance",level:2},{value:"Creating PostgreSQL Service Instance YAML Without Applying it",id:"creating-postgresql-service-instance-yaml-without-applying-it",level:3},{value:"Creating a Custom PostgreSQL Service Instance",id:"creating-a-custom-postgresql-service-instance",level:3},{value:"Deleting a PostgreSQL Service Instance",id:"deleting-a-postgresql-service-instance",level:2},{value:"Applying a SQL File to a PostgreSQL Service Instance",id:"applying-a-sql-file-to-a-postgresql-service-instance",level:2},{value:"Applying a SQL Statement to a PostgreSQL Service Instance",id:"applying-a-sql-statement-to-a-postgresql-service-instance",level:2},{value:"Creating a Backup of a PostgreSQL Service Instance",id:"creating-a-backup-of-a-postgresql-service-instance",level:2},{value:"Restoring a Backup of PostgreSQL Service Instance",id:"restoring-a-backup-of-postgresql-service-instance",level:2},{value:"Creating a PostgreSQL Service Binding",id:"creating-a-postgresql-service-binding",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.h1,{id:"a8s-stack",children:"a8s Stack"}),"\n",(0,i.jsx)(s.h1,{id:"creating-a-local-a8s-postgres-cluster",children:"Creating a Local a8s Postgres Cluster"}),"\n",(0,i.jsxs)(s.p,{children:["Create a local Kubernetes cluster using ",(0,i.jsx)(s.code,{children:"Minikube"})," or ",(0,i.jsx)(s.code,{children:"Kind"}),", ",(0,i.jsx)(s.strong,{children:"install a8s PostgreSQL"})," including its dependencies as well as a local ",(0,i.jsx)(s.a,{href:"https://min.io/",children:"Minio"})," object store."]}),"\n",(0,i.jsxs)(s.p,{children:["Get ready for ",(0,i.jsx)(s.strong,{children:"local development of applications with PostgreSQL"})," and/or ",(0,i.jsx)(s.strong,{children:"experimentation with a8s Postgres"})," by issuing the command:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s\n"})}),"\n",(0,i.jsx)(s.p,{children:"Recommended is 12 GB of free memory for the creation of three cluster nodes with each 4 GB. The number of nodes and memory size can be adjusted."}),"\n",(0,i.jsx)(s.h2,{id:"cold-run",children:"Cold-Run"}),"\n",(0,i.jsx)(s.p,{children:"When creating a cluster for the first time, a few setup steps will have to be taken which need to be performed only once:"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Setting up a working directory for the use with the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI. ",(0,i.jsx)(s.strong,{children:"This step asks for your confirmation of the proposed directory."})]}),"\n",(0,i.jsx)(s.li,{children:"Configuring the access credentials for the S3 compatible object store which is needed to use the backup/restore feature of a8s Postgres. This step is performed automatically."}),"\n",(0,i.jsxs)(s.li,{children:["Cloning deployment resources required by the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI to create a cluster. This step is performed automatically."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"setting-up-a-working-directory",children:"Setting Up a Working Directory"}),"\n",(0,i.jsxs)(s.p,{children:["The working directory is where are ",(0,i.jsx)(s.code,{children:"a9s"})," CLI related resources will go. This includes ",(0,i.jsx)(s.code,{children:"yaml"})," specifications being cloned from remote repositories, but also those generated by the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI for your convenience."]}),"\n",(0,i.jsxs)(s.p,{children:["Once established, the working directory is stored in the ",(0,i.jsx)(s.code,{children:"~/.a9s"})," configuration file."]}),"\n",(0,i.jsxs)(s.p,{children:["The default working directory is ",(0,i.jsx)(s.code,{children:"~/a9s"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"Alternatively, provide a custom working directory at the corresponding prompt."}),"\n",(0,i.jsx)(s.h3,{id:"configuring-the-backup-store",children:"Configuring the Backup Store"}),"\n",(0,i.jsx)(s.p,{children:"A non-prod Minio object store is installed in your local Kubernetes cluster and is automatically configured as the default backup store for a8s PostgreSQL backups."}),"\n",(0,i.jsxs)(s.p,{children:["If you want to use an alternative backup store, see ",(0,i.jsx)(s.code,{children:"a9s create cluster a8s --help"})," for the defaults of your particular CLI version and list of configuration options."]}),"\n",(0,i.jsx)(s.p,{children:"Most S3 compatible object stores, including AWS S3 itself of course, should work."}),"\n",(0,i.jsx)(s.h2,{id:"skip-checking-prerequisites",children:"Skip Checking Prerequisites"}),"\n",(0,i.jsx)(s.p,{children:"It is possible to skip the verification of prerequisites. This includes skipping the search for: required shell commands, a running Docker daemon and a running Kubernetes cluster."}),"\n",(0,i.jsxs)(s.p,{children:["In order to skip precheck use the ",(0,i.jsx)(s.code,{children:"--no-precheck"})," option:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --no-precheck\n"})}),"\n",(0,i.jsx)(s.h2,{id:"number-of-kubernetes-nodes",children:"Number of Kubernetes Nodes"}),"\n",(0,i.jsx)(s.p,{children:"Specifying the number of Nodes in the Kubernetes cluster:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --cluster-nr-of-nodes 1\n"})}),"\n",(0,i.jsx)(s.h2,{id:"cluster-memory",children:"Cluster Memory"}),"\n",(0,i.jsxs)(s.p,{children:["Specifying the memory of ",(0,i.jsx)(s.strong,{children:"each"})," Node of the Kubernetes cluster:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --cluster-memory 4gb\n"})}),"\n",(0,i.jsx)(s.h2,{id:"deployment-version",children:"Deployment Version"}),"\n",(0,i.jsxs)(s.p,{children:["The deployment version refers to the version of manifests used for installing software. Deployment versions are managed by anynines in a Git repository. The deployment version option allows you to select a particular version of the deployment manifests identified by ",(0,i.jsx)(s.strong,{children:"Git tags"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["Select a particular release by providing the ",(0,i.jsx)(s.code,{children:"--deployment-version"})," parameter:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --deployment-version v1.2.0\n"})}),"\n",(0,i.jsx)(s.p,{children:"Use:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --deployment-version latest\n"})}),"\n",(0,i.jsx)(s.p,{children:"To get the latest, untagged version of the deployment manifests."}),"\n",(0,i.jsx)(s.h2,{id:"kubernetes-provider",children:"Kubernetes Provider"}),"\n",(0,i.jsxs)(s.p,{children:["When creating a Kubernetes cluster, the mechanism to manage the cluster can be selected by specifying the ",(0,i.jsx)(s.code,{children:"--provider"})," option:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s -p kind \na9s create cluster a8s -p minikube (default)\n"})}),"\n",(0,i.jsx)(s.p,{children:"Follow the instructions to learn about available sub commands."}),"\n",(0,i.jsx)(s.h2,{id:"backup-infrastructure-region",children:"Backup Infrastructure Region"}),"\n",(0,i.jsxs)(s.p,{children:["When using the backup and restore functionality, a backup infrastructure region must be specified by using the ",(0,i.jsx)(s.code,{children:"--backup-region"})," option:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --backup-region us-east-1\n"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note"}),": By default, an existing ",(0,i.jsx)(s.code,{children:"backup-config.yaml"})," will be used. Hence, if you intend to change\nyour backup config, remove the existing ",(0,i.jsx)(s.code,{children:"backup-config.yaml"}),", first:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"rm a8s-deployment/deploy/a8s/backup-config/backup-store-config.yaml\n"})}),"\n",(0,i.jsx)(s.h2,{id:"unattended-mode",children:"Unattended Mode"}),"\n",(0,i.jsxs)(s.p,{children:["It is possible to skip all yes-no questions by ",(0,i.jsx)(s.strong,{children:"enabling the unattended mode"})," by passing the ",(0,i.jsx)(s.code,{children:"-y"})," or ",(0,i.jsx)(s.code,{children:"--yes"})," flag:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --yes\n"})}),"\n",(0,i.jsx)(s.h2,{id:"printing-the-working-directory",children:"Printing the Working Directory"}),"\n",(0,i.jsxs)(s.p,{children:["The working directory is stored in the ",(0,i.jsx)(s.code,{children:"~/.a8s"})," configuration file. The working directory contains all resources downloaded and generated by the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI."]}),"\n",(0,i.jsx)(s.p,{children:"To print the working directory execute:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s cluster pwd\n"})}),"\n",(0,i.jsx)(s.h1,{id:"a8s-postgresql",children:"a8s PostgreSQL"}),"\n",(0,i.jsxs)(s.p,{children:["A selected subset of the a8s PostgreSQL features are available through the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI."]}),"\n",(0,i.jsx)(s.h2,{id:"creating-a-postgresql-service-instance",children:"Creating a PostgreSQL Service Instance"}),"\n",(0,i.jsxs)(s.p,{children:["Creating a service instance with the name ",(0,i.jsx)(s.code,{children:"sample-pg-cluster"}),":"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --name sample-pg-cluster\n"})}),"\n",(0,i.jsxs)(s.p,{children:["The generated YAML specification will be stored in the ",(0,i.jsx)(s.code,{children:"usermanifests"}),"."]}),"\n",(0,i.jsx)(s.h3,{id:"creating-postgresql-service-instance-yaml-without-applying-it",children:"Creating PostgreSQL Service Instance YAML Without Applying it"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --name sample-pg-cluster --no-apply\n"})}),"\n",(0,i.jsxs)(s.p,{children:["The generated YAML specification will be stored in the ",(0,i.jsx)(s.code,{children:"usermanifests"})," but ",(0,i.jsx)(s.code,{children:"kubectl apply"})," won't be executed."]}),"\n",(0,i.jsx)(s.h3,{id:"creating-a-custom-postgresql-service-instance",children:"Creating a Custom PostgreSQL Service Instance"}),"\n",(0,i.jsx)(s.p,{children:"The command:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --api-version v1beta3 --name sample-pg-cluster --namespace default --replicas 3 --requests-cpu 200m --limits-memory 200Mi --service-version 14 --volume-size 2Gi\n"})}),"\n",(0,i.jsxs)(s.p,{children:["Will generate a YAML spec called ",(0,i.jsx)(s.code,{children:"usermanifests/my-pg-instance.yaml"})," with the following content:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"apiVersion: postgresql.anynines.com/v1beta3\nkind: Postgresql\nmetadata:\n name: my-pg\nspec:\n replicas: 3\n resources:\n limits:\n memory: 200m\n requests:\n cpu: 200m\n version: 14\n volumeSize: 2Gi\n"})}),"\n",(0,i.jsx)(s.h2,{id:"deleting-a-postgresql-service-instance",children:"Deleting a PostgreSQL Service Instance"}),"\n",(0,i.jsxs)(s.p,{children:["Deleting a service instance with the name ",(0,i.jsx)(s.code,{children:"sample-pg-cluster"}),":"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s delete pg instance --name sample-pg-cluster\n"})}),"\n",(0,i.jsx)(s.p,{children:"Or by providing an explicit namespace:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s delete pg instance --name sample-pg-cluster -n default\n"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note"}),": If the service instance doesn't exist, a warning is printed and the command exists with the\nreturn code ",(0,i.jsx)(s.code,{children:"0"})," as the desired state of the service instance being delete is reached."]}),"\n",(0,i.jsx)(s.h2,{id:"applying-a-sql-file-to-a-postgresql-service-instance",children:"Applying a SQL File to a PostgreSQL Service Instance"}),"\n",(0,i.jsxs)(s.p,{children:["Uploading a SQL file, executing it using ",(0,i.jsx)(s.code,{children:"psql"})," and deleting the file can be done with:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster\n"})}),"\n",(0,i.jsx)(s.p,{children:"The file is uploaded to the current primary pod of the service instance."}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note"}),": Ensure that, during the execution of the command, there is no change of the primary node for a given clustered service instance as otherwise the file upload may fail or target the wrong pod."]}),"\n",(0,i.jsxs)(s.p,{children:["Use ",(0,i.jsx)(s.code,{children:"--yes"})," to skip the confirmation prompt."]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster --yes\n"})}),"\n",(0,i.jsxs)(s.p,{children:["Use ",(0,i.jsx)(s.code,{children:"--no-delete"})," to leave the file in the pod:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster --no-delete\n"})}),"\n",(0,i.jsx)(s.h2,{id:"applying-a-sql-statement-to-a-postgresql-service-instance",children:"Applying a SQL Statement to a PostgreSQL Service Instance"}),"\n",(0,i.jsx)(s.p,{children:"Applying a SQL statement on the primary pod of a PostgreSQL service instance can be accomplished with:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:'a9s pg apply -i sample-pg-cluster --sql "select count(*) from posts" --yes\n'})}),"\n",(0,i.jsx)(s.h2,{id:"creating-a-backup-of-a-postgresql-service-instance",children:"Creating a Backup of a PostgreSQL Service Instance"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg backup --name sample-pg-cluster-backup-1 -i sample-pg-cluster\n"})}),"\n",(0,i.jsx)(s.h2,{id:"restoring-a-backup-of-postgresql-service-instance",children:"Restoring a Backup of PostgreSQL Service Instance"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg restore --name sample-pg-cluster-restore-1 -b sample-pg-cluster-backup-1 -i sample-pg-cluster\n"})}),"\n",(0,i.jsx)(s.h2,{id:"creating-a-postgresql-service-binding",children:"Creating a PostgreSQL Service Binding"}),"\n",(0,i.jsx)(s.p,{children:"A Service Binding is an entity facilitating the secure consumption of a service instance.\nBy creating a service instance, a Postgres user is created along with a corresponding Kubernetes Secret."}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg servicebinding --name sb-clustered-1 -i sample-pg-cluster\n"})}),"\n",(0,i.jsxs)(s.p,{children:["Will therefore create a Kubernetes Secret named ",(0,i.jsx)(s.code,{children:"sb-clustered-1-service-binding"})," and provide the following\nkeys containing everything an application needs to connect to the PostgreSQL service instance:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"database"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"instance_service"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"password"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"username"})}),"\n"]}),"\n",(0,i.jsx)(s.h1,{id:"cleaning-up",children:"Cleaning Up"}),"\n",(0,i.jsx)(s.p,{children:"In order to delete the cluster run:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s delete cluster a8s\n"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note"}),": This will not delete config files."]}),"\n",(0,i.jsx)(s.p,{children:"Config files are stored in the cluster working directory."}),"\n",(0,i.jsx)(s.p,{children:"They can be removed with:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"rm -rf $( a9s cluster pwd )\n"})})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>t,x:()=>c});var i=n(6540);const r={},a=i.createContext(r);function t(e){const s=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),i.createElement(a.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0914dfc1.ef1b9984.js b/assets/js/0914dfc1.ef1b9984.js
new file mode 100644
index 0000000..0e3e82f
--- /dev/null
+++ b/assets/js/0914dfc1.ef1b9984.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[3459],{4956:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>t,metadata:()=>i,toc:()=>o});const i=JSON.parse('{"id":"a9s-cli-a8s","title":"a9s CLI a8s","description":"Create a local Kubernetes cluster using Minikube or Kind, install a8s PostgreSQL including its dependencies as well as a local Minio object store.","source":"@site/versioned_docs/version-0.14.0/a9s-cli-a8s.md","sourceDirName":".","slug":"/a9s-cli-a8s","permalink":"/docs/a9s-cli-a8s","draft":false,"unlisted":false,"tags":[{"inline":true,"label":"a9s cli","permalink":"/docs/tags/a-9-s-cli"},{"inline":true,"label":"a9s hub","permalink":"/docs/tags/a-9-s-hub"},{"inline":true,"label":"a9s data services","permalink":"/docs/tags/a-9-s-data-services"},{"inline":true,"label":"a8s data services","permalink":"/docs/tags/a-8-s-data-services"},{"inline":true,"label":"a9s postgres","permalink":"/docs/tags/a-9-s-postgres"},{"inline":true,"label":"a8s postgres","permalink":"/docs/tags/a-8-s-postgres"},{"inline":true,"label":"data service","permalink":"/docs/tags/data-service"},{"inline":true,"label":"introduction","permalink":"/docs/tags/introduction"},{"inline":true,"label":"kubernetes","permalink":"/docs/tags/kubernetes"},{"inline":true,"label":"minikube","permalink":"/docs/tags/minikube"},{"inline":true,"label":"kind","permalink":"/docs/tags/kind"},{"inline":true,"label":"klutch","permalink":"/docs/tags/klutch"}],"version":"0.14.0","frontMatter":{"id":"a9s-cli-a8s","title":"a9s CLI a8s","tags":["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],"keywords":["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]}}');var r=n(4848),a=n(8453);const t={id:"a9s-cli-a8s",title:"a9s CLI a8s",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]},c="a8s Stack",l={},o=[{value:"Cold-Run",id:"cold-run",level:2},{value:"Setting Up a Working Directory",id:"setting-up-a-working-directory",level:3},{value:"Configuring the Backup Store",id:"configuring-the-backup-store",level:3},{value:"Skip Checking Prerequisites",id:"skip-checking-prerequisites",level:2},{value:"Number of Kubernetes Nodes",id:"number-of-kubernetes-nodes",level:2},{value:"Cluster Memory",id:"cluster-memory",level:2},{value:"Deployment Version",id:"deployment-version",level:2},{value:"Kubernetes Provider",id:"kubernetes-provider",level:2},{value:"Backup Infrastructure Region",id:"backup-infrastructure-region",level:2},{value:"Unattended Mode",id:"unattended-mode",level:2},{value:"Printing the Working Directory",id:"printing-the-working-directory",level:2},{value:"Creating a PostgreSQL Service Instance",id:"creating-a-postgresql-service-instance",level:2},{value:"Creating PostgreSQL Service Instance YAML Without Applying it",id:"creating-postgresql-service-instance-yaml-without-applying-it",level:3},{value:"Creating a Custom PostgreSQL Service Instance",id:"creating-a-custom-postgresql-service-instance",level:3},{value:"Deleting a PostgreSQL Service Instance",id:"deleting-a-postgresql-service-instance",level:2},{value:"Applying a SQL File to a PostgreSQL Service Instance",id:"applying-a-sql-file-to-a-postgresql-service-instance",level:2},{value:"Applying a SQL Statement to a PostgreSQL Service Instance",id:"applying-a-sql-statement-to-a-postgresql-service-instance",level:2},{value:"Creating a Backup of a PostgreSQL Service Instance",id:"creating-a-backup-of-a-postgresql-service-instance",level:2},{value:"Restoring a Backup of PostgreSQL Service Instance",id:"restoring-a-backup-of-postgresql-service-instance",level:2},{value:"Creating a PostgreSQL Service Binding",id:"creating-a-postgresql-service-binding",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"a8s-stack",children:"a8s Stack"})}),"\n",(0,r.jsx)(s.h1,{id:"creating-a-local-a8s-postgres-cluster",children:"Creating a Local a8s Postgres Cluster"}),"\n",(0,r.jsxs)(s.p,{children:["Create a local Kubernetes cluster using ",(0,r.jsx)(s.code,{children:"Minikube"})," or ",(0,r.jsx)(s.code,{children:"Kind"}),", ",(0,r.jsx)(s.strong,{children:"install a8s PostgreSQL"})," including its dependencies as well as a local ",(0,r.jsx)(s.a,{href:"https://min.io/",children:"Minio"})," object store."]}),"\n",(0,r.jsxs)(s.p,{children:["Get ready for ",(0,r.jsx)(s.strong,{children:"local development of applications with PostgreSQL"})," and/or ",(0,r.jsx)(s.strong,{children:"experimentation with a8s Postgres"})," by issuing the command:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s\n"})}),"\n",(0,r.jsx)(s.p,{children:"Recommended is 12 GB of free memory for the creation of three cluster nodes with each 4 GB. The number of nodes and memory size can be adjusted."}),"\n",(0,r.jsx)(s.h2,{id:"cold-run",children:"Cold-Run"}),"\n",(0,r.jsx)(s.p,{children:"When creating a cluster for the first time, a few setup steps will have to be taken which need to be performed only once:"}),"\n",(0,r.jsxs)(s.ol,{children:["\n",(0,r.jsxs)(s.li,{children:["Setting up a working directory for the use with the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI. ",(0,r.jsx)(s.strong,{children:"This step asks for your confirmation of the proposed directory."})]}),"\n",(0,r.jsx)(s.li,{children:"Configuring the access credentials for the S3 compatible object store which is needed to use the backup/restore feature of a8s Postgres. This step is performed automatically."}),"\n",(0,r.jsxs)(s.li,{children:["Cloning deployment resources required by the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI to create a cluster. This step is performed automatically."]}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"setting-up-a-working-directory",children:"Setting Up a Working Directory"}),"\n",(0,r.jsxs)(s.p,{children:["The working directory is where are ",(0,r.jsx)(s.code,{children:"a9s"})," CLI related resources will go. This includes ",(0,r.jsx)(s.code,{children:"yaml"})," specifications being cloned from remote repositories, but also those generated by the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI for your convenience."]}),"\n",(0,r.jsxs)(s.p,{children:["Once established, the working directory is stored in the ",(0,r.jsx)(s.code,{children:"~/.a9s"})," configuration file."]}),"\n",(0,r.jsxs)(s.p,{children:["The default working directory is ",(0,r.jsx)(s.code,{children:"~/a9s"}),"."]}),"\n",(0,r.jsx)(s.p,{children:"Alternatively, provide a custom working directory at the corresponding prompt."}),"\n",(0,r.jsx)(s.h3,{id:"configuring-the-backup-store",children:"Configuring the Backup Store"}),"\n",(0,r.jsx)(s.p,{children:"A non-prod Minio object store is installed in your local Kubernetes cluster and is automatically configured as the default backup store for a8s PostgreSQL backups."}),"\n",(0,r.jsxs)(s.p,{children:["If you want to use an alternative backup store, see ",(0,r.jsx)(s.code,{children:"a9s create cluster a8s --help"})," for the defaults of your particular CLI version and list of configuration options."]}),"\n",(0,r.jsx)(s.p,{children:"Most S3 compatible object stores, including AWS S3 itself of course, should work."}),"\n",(0,r.jsx)(s.h2,{id:"skip-checking-prerequisites",children:"Skip Checking Prerequisites"}),"\n",(0,r.jsx)(s.p,{children:"It is possible to skip the verification of prerequisites. This includes skipping the search for: required shell commands, a running Docker daemon and a running Kubernetes cluster."}),"\n",(0,r.jsxs)(s.p,{children:["In order to skip precheck use the ",(0,r.jsx)(s.code,{children:"--no-precheck"})," option:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --no-precheck\n"})}),"\n",(0,r.jsx)(s.h2,{id:"number-of-kubernetes-nodes",children:"Number of Kubernetes Nodes"}),"\n",(0,r.jsx)(s.p,{children:"Specifying the number of Nodes in the Kubernetes cluster:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --cluster-nr-of-nodes 1\n"})}),"\n",(0,r.jsx)(s.h2,{id:"cluster-memory",children:"Cluster Memory"}),"\n",(0,r.jsxs)(s.p,{children:["Specifying the memory of ",(0,r.jsx)(s.strong,{children:"each"})," Node of the Kubernetes cluster:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --cluster-memory 4gb\n"})}),"\n",(0,r.jsx)(s.h2,{id:"deployment-version",children:"Deployment Version"}),"\n",(0,r.jsxs)(s.p,{children:["The deployment version refers to the version of manifests used for installing software. Deployment versions are managed by anynines in a Git repository. The deployment version option allows you to select a particular version of the deployment manifests identified by ",(0,r.jsx)(s.strong,{children:"Git tags"}),"."]}),"\n",(0,r.jsxs)(s.p,{children:["Select a particular release by providing the ",(0,r.jsx)(s.code,{children:"--deployment-version"})," parameter:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --deployment-version v1.2.0\n"})}),"\n",(0,r.jsx)(s.p,{children:"Use:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --deployment-version latest\n"})}),"\n",(0,r.jsx)(s.p,{children:"To get the latest, untagged version of the deployment manifests."}),"\n",(0,r.jsx)(s.h2,{id:"kubernetes-provider",children:"Kubernetes Provider"}),"\n",(0,r.jsxs)(s.p,{children:["When creating a Kubernetes cluster, the mechanism to manage the cluster can be selected by specifying the ",(0,r.jsx)(s.code,{children:"--provider"})," option:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s -p kind \na9s create cluster a8s -p minikube (default)\n"})}),"\n",(0,r.jsx)(s.p,{children:"Follow the instructions to learn about available sub commands."}),"\n",(0,r.jsx)(s.h2,{id:"backup-infrastructure-region",children:"Backup Infrastructure Region"}),"\n",(0,r.jsxs)(s.p,{children:["When using the backup and restore functionality, a backup infrastructure region must be specified by using the ",(0,r.jsx)(s.code,{children:"--backup-region"})," option:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --backup-region us-east-1\n"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note"}),": By default, an existing ",(0,r.jsx)(s.code,{children:"backup-config.yaml"})," will be used. Hence, if you intend to change\nyour backup config, remove the existing ",(0,r.jsx)(s.code,{children:"backup-config.yaml"}),", first:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"rm a8s-deployment/deploy/a8s/backup-config/backup-store-config.yaml\n"})}),"\n",(0,r.jsx)(s.h2,{id:"unattended-mode",children:"Unattended Mode"}),"\n",(0,r.jsxs)(s.p,{children:["It is possible to skip all yes-no questions by ",(0,r.jsx)(s.strong,{children:"enabling the unattended mode"})," by passing the ",(0,r.jsx)(s.code,{children:"-y"})," or ",(0,r.jsx)(s.code,{children:"--yes"})," flag:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --yes\n"})}),"\n",(0,r.jsx)(s.h2,{id:"printing-the-working-directory",children:"Printing the Working Directory"}),"\n",(0,r.jsxs)(s.p,{children:["The working directory is stored in the ",(0,r.jsx)(s.code,{children:"~/.a8s"})," configuration file. The working directory contains all resources downloaded and generated by the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI."]}),"\n",(0,r.jsx)(s.p,{children:"To print the working directory execute:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s cluster pwd\n"})}),"\n",(0,r.jsx)(s.h1,{id:"a8s-postgresql",children:"a8s PostgreSQL"}),"\n",(0,r.jsxs)(s.p,{children:["A selected subset of the a8s PostgreSQL features are available through the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI."]}),"\n",(0,r.jsx)(s.h2,{id:"creating-a-postgresql-service-instance",children:"Creating a PostgreSQL Service Instance"}),"\n",(0,r.jsxs)(s.p,{children:["Creating a service instance with the name ",(0,r.jsx)(s.code,{children:"sample-pg-cluster"}),":"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --name sample-pg-cluster\n"})}),"\n",(0,r.jsxs)(s.p,{children:["The generated YAML specification will be stored in the ",(0,r.jsx)(s.code,{children:"usermanifests"}),"."]}),"\n",(0,r.jsx)(s.h3,{id:"creating-postgresql-service-instance-yaml-without-applying-it",children:"Creating PostgreSQL Service Instance YAML Without Applying it"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --name sample-pg-cluster --no-apply\n"})}),"\n",(0,r.jsxs)(s.p,{children:["The generated YAML specification will be stored in the ",(0,r.jsx)(s.code,{children:"usermanifests"})," but ",(0,r.jsx)(s.code,{children:"kubectl apply"})," won't be executed."]}),"\n",(0,r.jsx)(s.h3,{id:"creating-a-custom-postgresql-service-instance",children:"Creating a Custom PostgreSQL Service Instance"}),"\n",(0,r.jsx)(s.p,{children:"The command:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --api-version v1beta3 --name sample-pg-cluster --namespace default --replicas 3 --requests-cpu 200m --limits-memory 200Mi --service-version 14 --volume-size 2Gi\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Will generate a YAML spec called ",(0,r.jsx)(s.code,{children:"usermanifests/my-pg-instance.yaml"})," with the following content:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"apiVersion: postgresql.anynines.com/v1beta3\nkind: Postgresql\nmetadata:\n name: my-pg\nspec:\n replicas: 3\n resources:\n limits:\n memory: 200m\n requests:\n cpu: 200m\n version: 14\n volumeSize: 2Gi\n"})}),"\n",(0,r.jsx)(s.h2,{id:"deleting-a-postgresql-service-instance",children:"Deleting a PostgreSQL Service Instance"}),"\n",(0,r.jsxs)(s.p,{children:["Deleting a service instance with the name ",(0,r.jsx)(s.code,{children:"sample-pg-cluster"}),":"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s delete pg instance --name sample-pg-cluster\n"})}),"\n",(0,r.jsx)(s.p,{children:"Or by providing an explicit namespace:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s delete pg instance --name sample-pg-cluster -n default\n"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note"}),": If the service instance doesn't exist, a warning is printed and the command exists with the\nreturn code ",(0,r.jsx)(s.code,{children:"0"})," as the desired state of the service instance being delete is reached."]}),"\n",(0,r.jsx)(s.h2,{id:"applying-a-sql-file-to-a-postgresql-service-instance",children:"Applying a SQL File to a PostgreSQL Service Instance"}),"\n",(0,r.jsxs)(s.p,{children:["Uploading a SQL file, executing it using ",(0,r.jsx)(s.code,{children:"psql"})," and deleting the file can be done with:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster\n"})}),"\n",(0,r.jsx)(s.p,{children:"The file is uploaded to the current primary pod of the service instance."}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note"}),": Ensure that, during the execution of the command, there is no change of the primary node for a given clustered service instance as otherwise the file upload may fail or target the wrong pod."]}),"\n",(0,r.jsxs)(s.p,{children:["Use ",(0,r.jsx)(s.code,{children:"--yes"})," to skip the confirmation prompt."]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster --yes\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Use ",(0,r.jsx)(s.code,{children:"--no-delete"})," to leave the file in the pod:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster --no-delete\n"})}),"\n",(0,r.jsx)(s.h2,{id:"applying-a-sql-statement-to-a-postgresql-service-instance",children:"Applying a SQL Statement to a PostgreSQL Service Instance"}),"\n",(0,r.jsx)(s.p,{children:"Applying a SQL statement on the primary pod of a PostgreSQL service instance can be accomplished with:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:'a9s pg apply -i sample-pg-cluster --sql "select count(*) from posts" --yes\n'})}),"\n",(0,r.jsx)(s.h2,{id:"creating-a-backup-of-a-postgresql-service-instance",children:"Creating a Backup of a PostgreSQL Service Instance"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg backup --name sample-pg-cluster-backup-1 -i sample-pg-cluster\n"})}),"\n",(0,r.jsx)(s.h2,{id:"restoring-a-backup-of-postgresql-service-instance",children:"Restoring a Backup of PostgreSQL Service Instance"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg restore --name sample-pg-cluster-restore-1 -b sample-pg-cluster-backup-1 -i sample-pg-cluster\n"})}),"\n",(0,r.jsx)(s.h2,{id:"creating-a-postgresql-service-binding",children:"Creating a PostgreSQL Service Binding"}),"\n",(0,r.jsx)(s.p,{children:"A Service Binding is an entity facilitating the secure consumption of a service instance.\nBy creating a service instance, a Postgres user is created along with a corresponding Kubernetes Secret."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg servicebinding --name sb-clustered-1 -i sample-pg-cluster\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Will therefore create a Kubernetes Secret named ",(0,r.jsx)(s.code,{children:"sb-clustered-1-service-binding"})," and provide the following\nkeys containing everything an application needs to connect to the PostgreSQL service instance:"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.code,{children:"database"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.code,{children:"instance_service"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.code,{children:"password"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.code,{children:"username"})}),"\n"]}),"\n",(0,r.jsx)(s.h1,{id:"cleaning-up",children:"Cleaning Up"}),"\n",(0,r.jsx)(s.p,{children:"In order to delete the cluster run:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s delete cluster a8s\n"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note"}),": This will not delete config files."]}),"\n",(0,r.jsx)(s.p,{children:"Config files are stored in the cluster working directory."}),"\n",(0,r.jsx)(s.p,{children:"They can be removed with:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"rm -rf $( a9s cluster pwd )\n"})})]})}function h(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>t,x:()=>c});var i=n(6540);const r={},a=i.createContext(r);function t(e){const s=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),i.createElement(a.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/13ead1de.47096fad.js b/assets/js/13ead1de.47096fad.js
deleted file mode 100644
index c225aad..0000000
--- a/assets/js/13ead1de.47096fad.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[9821],{5200:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>t,default:()=>h,frontMatter:()=>r,metadata:()=>d,toc:()=>o});var l=s(4848),i=s(8453);const r={id:"a9s-cli-klutch",title:"a9s CLI Klutch",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]},t="klutch Stack",d={id:"a9s-cli-klutch",title:"a9s CLI Klutch",description:"Create a local Klutch Control Plane Cluster using Kind, including the a8s stack. Deploy an App Cluster and bind resources to the Control Plane Cluster.",source:"@site/docs/a9s-cli-klutch.md",sourceDirName:".",slug:"/a9s-cli-klutch",permalink:"/docs/develop/a9s-cli-klutch",draft:!1,unlisted:!1,tags:[{inline:!0,label:"a9s cli",permalink:"/docs/develop/tags/a-9-s-cli"},{inline:!0,label:"a9s hub",permalink:"/docs/develop/tags/a-9-s-hub"},{inline:!0,label:"a9s data services",permalink:"/docs/develop/tags/a-9-s-data-services"},{inline:!0,label:"a8s data services",permalink:"/docs/develop/tags/a-8-s-data-services"},{inline:!0,label:"a9s postgres",permalink:"/docs/develop/tags/a-9-s-postgres"},{inline:!0,label:"a8s postgres",permalink:"/docs/develop/tags/a-8-s-postgres"},{inline:!0,label:"data service",permalink:"/docs/develop/tags/data-service"},{inline:!0,label:"introduction",permalink:"/docs/develop/tags/introduction"},{inline:!0,label:"kubernetes",permalink:"/docs/develop/tags/kubernetes"},{inline:!0,label:"minikube",permalink:"/docs/develop/tags/minikube"},{inline:!0,label:"kind",permalink:"/docs/develop/tags/kind"},{inline:!0,label:"klutch",permalink:"/docs/develop/tags/klutch"}],version:"current",frontMatter:{id:"a9s-cli-klutch",title:"a9s CLI Klutch",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]},sidebar:"tutorialSidebar",previous:{title:"a9s CLI",permalink:"/docs/develop/a9s-cli"},next:{title:"Hands-On Tutorials",permalink:"/docs/develop/hands-on-tutorials/"}},c={},o=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installing the kubectl-bind
plugin:",id:"installing-the-kubectl-bind-plugin",level:3},{value:"Running on Linux",id:"running-on-linux",level:3},{value:"Commands",id:"commands",level:2},{value:"1. deploy
",id:"1-deploy",level:3},{value:"2. bind
",id:"2-bind",level:3},{value:"3. delete
",id:"3-delete",level:3}];function a(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.h1,{id:"klutch-stack",children:"klutch Stack"}),"\n",(0,l.jsxs)(n.p,{children:["Create a local Klutch Control Plane Cluster using ",(0,l.jsx)(n.code,{children:"Kind"}),", including the ",(0,l.jsx)(n.code,{children:"a8s"})," stack. Deploy an App Cluster and ",(0,l.jsx)(n.strong,{children:"bind"})," resources to the Control Plane Cluster.\nThis will allow you to use ",(0,l.jsx)(n.code,{children:"a8s"})," resource instances such as ",(0,l.jsx)(n.code,{children:"postgresql"})," on the App Cluster, which will run on the Control Plane Cluster."]}),"\n",(0,l.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:[(0,l.jsx)(n.a,{href:"/docs/develop/a9s-cli#prerequisites",children:"General prerequisites"})," are met."]}),"\n",(0,l.jsxs)(n.li,{children:["Install ",(0,l.jsx)(n.a,{href:"https://helm.sh/docs/intro/install/",children:"Helm"}),"."]}),"\n",(0,l.jsxs)(n.li,{children:["Install ",(0,l.jsx)(n.code,{children:"kubectl-bind"})," plugin version 1.3.0 or higher (see below)."]}),"\n",(0,l.jsxs)(n.li,{children:["On ",(0,l.jsx)(n.strong,{children:"linux"}),", docker must be runnable without sudo. See the ",(0,l.jsx)(n.a,{href:"https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user",children:"docker documentation"})," for further details."]}),"\n"]}),"\n",(0,l.jsxs)(n.h3,{id:"installing-the-kubectl-bind-plugin",children:["Installing the ",(0,l.jsx)(n.code,{children:"kubectl-bind"})," plugin:"]}),"\n",(0,l.jsxs)(n.p,{children:["Download a binary for your platform with the following URL, make it executable and place it in a location in your ",(0,l.jsx)(n.code,{children:"PATH"}),":"]}),"\n",(0,l.jsx)(n.p,{children:(0,l.jsx)(n.code,{children:"https://anynines-artifacts.s3.eu-central-1.amazonaws.com/central-management/v1.3.0/$OS-$ARCH/kubectl-bind"})}),"\n",(0,l.jsxs)(n.p,{children:["Replace ",(0,l.jsx)(n.code,{children:"OS"})," and ",(0,l.jsx)(n.code,{children:"ARCH"})," with values for your platform, e.g. ",(0,l.jsx)(n.code,{children:"darwin-arm64"})," or ",(0,l.jsx)(n.code,{children:"linux-amd64"}),". You can also use the following script to achieve this:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:'RELEASE="v1.3.0"\nOS=$(go env GOOS); ARCH=$(go env GOARCH); curl -fsSL -o kubectl-bind https://anynines-artifacts.s3.eu-central-1.amazonaws.com/central-management/$RELEASE/$OS-$ARCH/kubectl-bind\n\nsudo chmod 755 kubectl-bind\nsudo mv kubectl-bind /usr/local/bin\n'})}),"\n",(0,l.jsx)(n.h3,{id:"running-on-linux",children:"Running on Linux"}),"\n",(0,l.jsxs)(n.p,{children:["To avoid issues with ",(0,l.jsx)(n.code,{children:"Kind"})," on Linux, increase the ",(0,l.jsx)(n.code,{children:"inotify"})," resource limits as described ",(0,l.jsx)(n.a,{href:"https://kind.sigs.k8s.io/docs/user/known-issues/#pod-errors-due-to-too-many-open-files",children:"here"}),"."]}),"\n",(0,l.jsx)(n.h2,{id:"commands",children:"Commands"}),"\n",(0,l.jsxs)(n.h3,{id:"1-deploy",children:["1. ",(0,l.jsx)(n.code,{children:"deploy"})]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Usage"}),":"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"a9s klutch deploy [options]\n"})}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Options"}),":"]}),"\n",(0,l.jsxs)(n.table,{children:[(0,l.jsx)(n.thead,{children:(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.th,{children:"Flag"}),(0,l.jsx)(n.th,{children:"Description"}),(0,l.jsx)(n.th,{children:"Example"})]})}),(0,l.jsxs)(n.tbody,{children:[(0,l.jsxs)(n.tr,{children:[(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"-y"}),", ",(0,l.jsx)(n.code,{children:"--yes"})]}),(0,l.jsx)(n.td,{children:"Skip confirmation prompts"}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"a9s klutch deploy --yes"})})]}),(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"--port"})}),(0,l.jsxs)(n.td,{children:["The port to expose the Control Plane Cluster on. Defaults to ",(0,l.jsx)(n.code,{children:"8080"}),"."]}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"a9s klutch deploy --port 8080"})})]})]})]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Description"}),":"]}),"\n",(0,l.jsxs)(n.p,{children:["This command deploys a ",(0,l.jsx)(n.code,{children:"Kind"})," cluster named ",(0,l.jsx)(n.code,{children:"klutch-control-plane"})," and installs the required\ncomponents for Klutch. These components include:"]}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsxs)(n.li,{children:["The ",(0,l.jsx)(n.code,{children:"klutch-bind"})," backend and ",(0,l.jsx)(n.a,{href:"https://dexidp.io/",children:"Dex Idp"})," as a dummy OICD provider."]}),"\n",(0,l.jsx)(n.li,{children:"Crossplane and the anynines configuration packages."}),"\n",(0,l.jsxs)(n.li,{children:["The complete ",(0,l.jsx)(n.code,{children:"a8s"})," stack including ",(0,l.jsx)(n.code,{children:"Postgresql"})," operator, backup, restore and service binding capabilities."]}),"\n"]}),"\n",(0,l.jsxs)(n.p,{children:["In addition to the Control Plane Cluster, an App Cluster named ",(0,l.jsx)(n.code,{children:"klutch-app"})," is deployed. This cluster can be used for the ",(0,l.jsx)(n.code,{children:"a9s klutch bind"})," command to bind resources to the Control Plane Cluster."]}),"\n",(0,l.jsx)(n.p,{children:"The Control Plane Cluster exports the following resources for binding:"}),"\n",(0,l.jsxs)(n.ul,{children:["\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.code,{children:"postgresqlinstance.anynines.com"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.code,{children:"servicebinding.anynines.com"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.code,{children:"backup.anynines.com"})}),"\n",(0,l.jsx)(n.li,{children:(0,l.jsx)(n.code,{children:"restore.anynines.com"})}),"\n"]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Important"}),": For technical reasons, the Control Plane Cluster is exposed on the local network using the local IP address. If your IP or network changes, the Control Plane Cluster may become unreachable and will have to be redeployed."]}),"\n",(0,l.jsxs)(n.h3,{id:"2-bind",children:["2. ",(0,l.jsx)(n.code,{children:"bind"})]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Usage"}),":"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{children:"a9s klutch bind [options]\n"})}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Options"}),":"]}),"\n",(0,l.jsxs)(n.table,{children:[(0,l.jsx)(n.thead,{children:(0,l.jsxs)(n.tr,{children:[(0,l.jsx)(n.th,{children:"Flag"}),(0,l.jsx)(n.th,{children:"Description"}),(0,l.jsx)(n.th,{children:"Example"})]})}),(0,l.jsx)(n.tbody,{children:(0,l.jsxs)(n.tr,{children:[(0,l.jsxs)(n.td,{children:[(0,l.jsx)(n.code,{children:"-y"}),", ",(0,l.jsx)(n.code,{children:"--yes"})]}),(0,l.jsx)(n.td,{children:"Skip confirmation prompts"}),(0,l.jsx)(n.td,{children:(0,l.jsx)(n.code,{children:"a9s klutch bind --yes"})})]})})]}),"\n",(0,l.jsxs)(n.p,{children:[(0,l.jsx)(n.strong,{children:"Description"}),":"]}),"\n",(0,l.jsxs)(n.p,{children:["This command will invoke ",(0,l.jsx)(n.code,{children:"kubectl bind"})," in order to bind a resource exported by the Control Plane Cluster. This process will open a browser window for you where you can authenticate with the dummy dex OIDC provider using these credentials:"]}),"\n",(0,l.jsxs)(n.p,{children:["Email: ",(0,l.jsx)(n.code,{children:"admin@example.com"})]}),"\n",(0,l.jsxs)(n.p,{children:["Password: ",(0,l.jsx)(n.code,{children:"password"})]}),"\n",(0,l.jsxs)(n.p,{children:["After logging in, grant access, and then ",(0,l.jsx)(n.strong,{children:"choose the resource you would like to bind"}),". Once this is done, return to your terminal and wait for the process to finish."]}),"\n",(0,l.jsxs)(n.p,{children:["After the ",(0,l.jsx)(n.code,{children:"bind"})," command has succeeded, you can deploy instances of the chosen resource on your App Cluster, which will run in the Control Plane Cluster. The command will print an example manifest for the resource you bound that you can apply to the App Cluster with ",(0,l.jsx)(n.code,{children:"kubectl"}),". You can do this easily by copying the printed yaml and using a heredoc, like so:"]}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-bash",children:"kubectl apply -f - <kubectl-bind
plugin:",id:"installing-the-kubectl-bind-plugin",level:3},{value:"Running on Linux",id:"running-on-linux",level:3},{value:"Commands",id:"commands",level:2},{value:"1. deploy
",id:"1-deploy",level:3},{value:"2. bind
",id:"2-bind",level:3},{value:"3. delete
",id:"3-delete",level:3}];function a(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"klutch-stack",children:"klutch Stack"})}),"\n",(0,i.jsxs)(n.p,{children:["Create a local Klutch Control Plane Cluster using ",(0,i.jsx)(n.code,{children:"Kind"}),", including the ",(0,i.jsx)(n.code,{children:"a8s"})," stack. Deploy an App Cluster and ",(0,i.jsx)(n.strong,{children:"bind"})," resources to the Control Plane Cluster.\nThis will allow you to use ",(0,i.jsx)(n.code,{children:"a8s"})," resource instances such as ",(0,i.jsx)(n.code,{children:"postgresql"})," on the App Cluster, which will run on the Control Plane Cluster."]}),"\n",(0,i.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/docs/develop/a9s-cli#prerequisites",children:"General prerequisites"})," are met."]}),"\n",(0,i.jsxs)(n.li,{children:["Install ",(0,i.jsx)(n.a,{href:"https://helm.sh/docs/intro/install/",children:"Helm"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Install ",(0,i.jsx)(n.code,{children:"kubectl-bind"})," plugin version 1.3.0 or higher (see below)."]}),"\n",(0,i.jsxs)(n.li,{children:["On ",(0,i.jsx)(n.strong,{children:"linux"}),", docker must be runnable without sudo. See the ",(0,i.jsx)(n.a,{href:"https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user",children:"docker documentation"})," for further details."]}),"\n"]}),"\n",(0,i.jsxs)(n.h3,{id:"installing-the-kubectl-bind-plugin",children:["Installing the ",(0,i.jsx)(n.code,{children:"kubectl-bind"})," plugin:"]}),"\n",(0,i.jsxs)(n.p,{children:["Download a binary for your platform with the following URL, make it executable and place it in a location in your ",(0,i.jsx)(n.code,{children:"PATH"}),":"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"https://anynines-artifacts.s3.eu-central-1.amazonaws.com/central-management/v1.3.0/$OS-$ARCH/kubectl-bind"})}),"\n",(0,i.jsxs)(n.p,{children:["Replace ",(0,i.jsx)(n.code,{children:"OS"})," and ",(0,i.jsx)(n.code,{children:"ARCH"})," with values for your platform, e.g. ",(0,i.jsx)(n.code,{children:"darwin-arm64"})," or ",(0,i.jsx)(n.code,{children:"linux-amd64"}),". You can also use the following script to achieve this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'RELEASE="v1.3.0"\nOS=$(go env GOOS); ARCH=$(go env GOARCH); curl -fsSL -o kubectl-bind https://anynines-artifacts.s3.eu-central-1.amazonaws.com/central-management/$RELEASE/$OS-$ARCH/kubectl-bind\n\nsudo chmod 755 kubectl-bind\nsudo mv kubectl-bind /usr/local/bin\n'})}),"\n",(0,i.jsx)(n.h3,{id:"running-on-linux",children:"Running on Linux"}),"\n",(0,i.jsxs)(n.p,{children:["To avoid issues with ",(0,i.jsx)(n.code,{children:"Kind"})," on Linux, increase the ",(0,i.jsx)(n.code,{children:"inotify"})," resource limits as described ",(0,i.jsx)(n.a,{href:"https://kind.sigs.k8s.io/docs/user/known-issues/#pod-errors-due-to-too-many-open-files",children:"here"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"commands",children:"Commands"}),"\n",(0,i.jsxs)(n.h3,{id:"1-deploy",children:["1. ",(0,i.jsx)(n.code,{children:"deploy"})]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Usage"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"a9s klutch deploy [options]\n"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Options"}),":"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Flag"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Example"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsxs)(n.td,{children:[(0,i.jsx)(n.code,{children:"-y"}),", ",(0,i.jsx)(n.code,{children:"--yes"})]}),(0,i.jsx)(n.td,{children:"Skip confirmation prompts"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"a9s klutch deploy --yes"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--port"})}),(0,i.jsxs)(n.td,{children:["The port to expose the Control Plane Cluster on. Defaults to ",(0,i.jsx)(n.code,{children:"8080"}),"."]}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"a9s klutch deploy --port 8080"})})]})]})]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Description"}),":"]}),"\n",(0,i.jsxs)(n.p,{children:["This command deploys a ",(0,i.jsx)(n.code,{children:"Kind"})," cluster named ",(0,i.jsx)(n.code,{children:"klutch-control-plane"})," and installs the required\ncomponents for Klutch. These components include:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.code,{children:"klutch-bind"})," backend and ",(0,i.jsx)(n.a,{href:"https://dexidp.io/",children:"Dex Idp"})," as a dummy OICD provider."]}),"\n",(0,i.jsx)(n.li,{children:"Crossplane and the anynines configuration packages."}),"\n",(0,i.jsxs)(n.li,{children:["The complete ",(0,i.jsx)(n.code,{children:"a8s"})," stack including ",(0,i.jsx)(n.code,{children:"Postgresql"})," operator, backup, restore and service binding capabilities."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["In addition to the Control Plane Cluster, an App Cluster named ",(0,i.jsx)(n.code,{children:"klutch-app"})," is deployed. This cluster can be used for the ",(0,i.jsx)(n.code,{children:"a9s klutch bind"})," command to bind resources to the Control Plane Cluster."]}),"\n",(0,i.jsx)(n.p,{children:"The Control Plane Cluster exports the following resources for binding:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"postgresqlinstance.anynines.com"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"servicebinding.anynines.com"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"backup.anynines.com"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"restore.anynines.com"})}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Important"}),": For technical reasons, the Control Plane Cluster is exposed on the local network using the local IP address. If your IP or network changes, the Control Plane Cluster may become unreachable and will have to be redeployed."]}),"\n",(0,i.jsxs)(n.h3,{id:"2-bind",children:["2. ",(0,i.jsx)(n.code,{children:"bind"})]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Usage"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"a9s klutch bind [options]\n"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Options"}),":"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Flag"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Example"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsxs)(n.td,{children:[(0,i.jsx)(n.code,{children:"-y"}),", ",(0,i.jsx)(n.code,{children:"--yes"})]}),(0,i.jsx)(n.td,{children:"Skip confirmation prompts"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"a9s klutch bind --yes"})})]})})]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Description"}),":"]}),"\n",(0,i.jsxs)(n.p,{children:["This command will invoke ",(0,i.jsx)(n.code,{children:"kubectl bind"})," in order to bind a resource exported by the Control Plane Cluster. This process will open a browser window for you where you can authenticate with the dummy dex OIDC provider using these credentials:"]}),"\n",(0,i.jsxs)(n.p,{children:["Email: ",(0,i.jsx)(n.code,{children:"admin@example.com"})]}),"\n",(0,i.jsxs)(n.p,{children:["Password: ",(0,i.jsx)(n.code,{children:"password"})]}),"\n",(0,i.jsxs)(n.p,{children:["After logging in, grant access, and then ",(0,i.jsx)(n.strong,{children:"choose the resource you would like to bind"}),". Once this is done, return to your terminal and wait for the process to finish."]}),"\n",(0,i.jsxs)(n.p,{children:["After the ",(0,i.jsx)(n.code,{children:"bind"})," command has succeeded, you can deploy instances of the chosen resource on your App Cluster, which will run in the Control Plane Cluster. The command will print an example manifest for the resource you bound that you can apply to the App Cluster with ",(0,i.jsx)(n.code,{children:"kubectl"}),". You can do this easily by copying the printed yaml and using a heredoc, like so:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"kubectl apply -f - <a8s
Stack",id:"a8s-stack",level:3},{value:"Cold-Run",id:"cold-run",level:2},{value:"Setting Up a Working Directory",id:"setting-up-a-working-directory",level:3},{value:"Configuring the Backup Store",id:"configuring-the-backup-store",level:3},{value:"Skip Checking Prerequisites",id:"skip-checking-prerequisites",level:2},{value:"Number of Kubernetes Nodes",id:"number-of-kubernetes-nodes",level:2},{value:"Cluster Memory",id:"cluster-memory",level:2},{value:"Deployment Version",id:"deployment-version",level:2},{value:"Kubernetes Provider",id:"kubernetes-provider",level:2},{value:"Backup Infrastructure Region",id:"backup-infrastructure-region",level:2},{value:"Unattended Mode",id:"unattended-mode",level:2},{value:"Printing the Working Directory",id:"printing-the-working-directory",level:2},{value:"Creating a PostgreSQL Service Instance",id:"creating-a-postgresql-service-instance",level:2},{value:"Creating PostgreSQL Service Instance YAML Without Applying it",id:"creating-postgresql-service-instance-yaml-without-applying-it",level:3},{value:"Creating a Custom PostgreSQL Service Instance",id:"creating-a-custom-postgresql-service-instance",level:3},{value:"Deleting a PostgreSQL Service Instance",id:"deleting-a-postgresql-service-instance",level:2},{value:"Applying a SQL File to a PostgreSQL Service Instance",id:"applying-a-sql-file-to-a-postgresql-service-instance",level:2},{value:"Applying a SQL Statement to a PostgreSQL Service Instance",id:"applying-a-sql-statement-to-a-postgresql-service-instance",level:2},{value:"Creating a Backup of a PostgreSQL Service Instance",id:"creating-a-backup-of-a-postgresql-service-instance",level:2},{value:"Restoring a Backup of PostgreSQL Service Instance",id:"restoring-a-backup-of-postgresql-service-instance",level:2},{value:"Creating a PostgreSQL Service Binding",id:"creating-a-postgresql-service-binding",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"a9s-cli",children:"a9s CLI"})}),"\n",(0,r.jsxs)(s.p,{children:["anynines provides a command line tool called ",(0,r.jsx)(s.code,{children:"a9s"})," to facilitate application development, devops tasks and interact with selected anynines products."]}),"\n",(0,r.jsx)(s.h2,{id:"use-cases",children:"Use Cases"}),"\n",(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.code,{children:"a9s"})," CLI can be used to install and use the following stacks:"]}),"\n",(0,r.jsxs)(s.h3,{id:"a8s-stack",children:[(0,r.jsx)(s.code,{children:"a8s"})," Stack"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Install a local Kubernetes cluster (",(0,r.jsx)(s.code,{children:"minikube"})," or ",(0,r.jsx)(s.code,{children:"kind"}),")."]}),"\n",(0,r.jsxs)(s.li,{children:["Install the ",(0,r.jsx)(s.a,{href:"https://cert-manager.io/",children:"cert-manager"}),"."]}),"\n",(0,r.jsx)(s.li,{children:"Install a local Minio object store for storing Backups."}),"\n",(0,r.jsxs)(s.li,{children:["Install the a8s PostgreSQL Operator PostgreSQL supporting","\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["creating dedicated PostgreSQL clusters with","\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"synchronous and asynchronous streaming replication."}),"\n",(0,r.jsx)(s.li,{children:"automatic failure detection and automatic failover."}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(s.li,{children:"backup and restore capabilities storing backups in an S3 compatible object store such as AWS S3 or Minio."}),"\n",(0,r.jsx)(s.li,{children:"ability to easily create database users and Kubernetes Secrets by using the Service Bindings abstraction"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["Easily apply ",(0,r.jsx)(s.code,{children:".sql"})," files and SQL commands to PostgreSQL clusters."]}),"\n"]}),"\n",(0,r.jsx)(s.h1,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Using the backup/restore feature of a8s PostgreSQL requires an S3 compatible endpoint."}),"\n",(0,r.jsxs)(s.li,{children:["Install Go (if you want ",(0,r.jsx)(s.code,{children:"go env"})," to identify your OS and arch)."]}),"\n",(0,r.jsx)(s.li,{children:"Install Git."}),"\n",(0,r.jsx)(s.li,{children:"Install Docker."}),"\n",(0,r.jsx)(s.li,{children:"Install Kubectl."}),"\n",(0,r.jsx)(s.li,{children:"Install Kind and/or Minikube."}),"\n",(0,r.jsxs)(s.li,{children:["Install the ",(0,r.jsx)(s.a,{href:"https://cert-manager.io/docs/reference/cmctl/",children:"cert-manager CLI"}),"."]}),"\n"]}),"\n",(0,r.jsx)(s.h1,{id:"installing-the-cli",children:"Installing the CLI"}),"\n",(0,r.jsxs)(s.p,{children:["In order to install the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI execute the following shell script:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"RELEASE=$(curl -L -s https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/stable.txt); OS=$(go env GOOS); ARCH=$(go env GOARCH); curl -fsSL -o a9s https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/releases/$RELEASE/a9s-$OS-$ARCH\n \nsudo chmod 755 a9s\nsudo mv a9s /usr/local/bin\n"})}),"\n",(0,r.jsxs)(s.p,{children:["This will download the ",(0,r.jsx)(s.code,{children:"a9s"})," binary suitable for your architecture and move it to ",(0,r.jsx)(s.code,{children:"/usr/local/bin"}),".\nDepending on your system you have to adjust the ",(0,r.jsx)(s.code,{children:"PATH"})," variable or move the binary to a folder that's already in the ",(0,r.jsx)(s.code,{children:"PATH"}),"."]}),"\n",(0,r.jsx)(s.h1,{id:"using-the-cli",children:"Using the CLI"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s\n"})}),"\n",(0,r.jsx)(s.h1,{id:"creating-a-local-a8s-postgres-cluster",children:"Creating a Local a8s Postgres Cluster"}),"\n",(0,r.jsxs)(s.p,{children:["Create a local Kubernetes cluster using ",(0,r.jsx)(s.code,{children:"Minikube"})," or ",(0,r.jsx)(s.code,{children:"Kind"}),", ",(0,r.jsx)(s.strong,{children:"install a8s PostgreSQL"})," including its dependencies as well as a local ",(0,r.jsx)(s.a,{href:"https://min.io/",children:"Minio"})," object store."]}),"\n",(0,r.jsxs)(s.p,{children:["Get ready for ",(0,r.jsx)(s.strong,{children:"local development of applications with PostgreSQL"})," and/or ",(0,r.jsx)(s.strong,{children:"experimentation with a8s Postgres"})," by issuing the command:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s\n"})}),"\n",(0,r.jsx)(s.p,{children:"Recommended is 12 GB of free memory for the creation of three cluster nodes with each 4 GB. The number of nodes and memory size can be adjusted."}),"\n",(0,r.jsx)(s.h2,{id:"cold-run",children:"Cold-Run"}),"\n",(0,r.jsx)(s.p,{children:"When creating a cluster for the first time, a few setup steps will have to be taken which need to be performed only once:"}),"\n",(0,r.jsxs)(s.ol,{children:["\n",(0,r.jsxs)(s.li,{children:["Setting up a working directory for the use with the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI. ",(0,r.jsx)(s.strong,{children:"This step asks for your confirmation of the proposed directory."})]}),"\n",(0,r.jsx)(s.li,{children:"Configuring the access credentials for the S3 compatible object store which is needed to use the backup/restore feature of a8s Postgres. This step is performed automatically."}),"\n",(0,r.jsxs)(s.li,{children:["Cloning deployment resources required by the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI to create a cluster. This step is performed automatically."]}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"setting-up-a-working-directory",children:"Setting Up a Working Directory"}),"\n",(0,r.jsxs)(s.p,{children:["The working directory is where are ",(0,r.jsx)(s.code,{children:"a9s"})," CLI related resources will go. This includes ",(0,r.jsx)(s.code,{children:"yaml"})," specifications being cloned from remote repositories, but also those generated by the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI for your convenience."]}),"\n",(0,r.jsxs)(s.p,{children:["Once established, the working directory is stored in the ",(0,r.jsx)(s.code,{children:"~/.a9s"})," configuration file."]}),"\n",(0,r.jsxs)(s.p,{children:["The default working directory is ",(0,r.jsx)(s.code,{children:"~/a9s"}),"."]}),"\n",(0,r.jsx)(s.p,{children:"Alternatively, provide a custom working directory at the corresponding prompt."}),"\n",(0,r.jsx)(s.h3,{id:"configuring-the-backup-store",children:"Configuring the Backup Store"}),"\n",(0,r.jsx)(s.p,{children:"A non-prod Minio object store is installed in your local Kubernetes cluster and is automatically configured as the default backup store for a8s PostgreSQL backups."}),"\n",(0,r.jsxs)(s.p,{children:["If you want to use an alternative backup store, see ",(0,r.jsx)(s.code,{children:"a9s create cluster a8s --help"})," for the defaults of your particular CLI version and list of configuration options."]}),"\n",(0,r.jsx)(s.p,{children:"Most S3 compatible object stores, including AWS S3 itself of course, should work."}),"\n",(0,r.jsx)(s.h2,{id:"skip-checking-prerequisites",children:"Skip Checking Prerequisites"}),"\n",(0,r.jsx)(s.p,{children:"It is possible to skip the verification of prerequisites. This includes skipping the search for: required shell commands, a running Docker daemon and a running Kubernetes cluster."}),"\n",(0,r.jsxs)(s.p,{children:["In order to skip precheck use the ",(0,r.jsx)(s.code,{children:"--no-precheck"})," option:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --no-precheck\n"})}),"\n",(0,r.jsx)(s.h2,{id:"number-of-kubernetes-nodes",children:"Number of Kubernetes Nodes"}),"\n",(0,r.jsx)(s.p,{children:"Specifying the number of Nodes in the Kubernetes cluster:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --cluster-nr-of-nodes 1\n"})}),"\n",(0,r.jsx)(s.h2,{id:"cluster-memory",children:"Cluster Memory"}),"\n",(0,r.jsxs)(s.p,{children:["Specifying the memory of ",(0,r.jsx)(s.strong,{children:"each"})," Node of the Kubernetes cluster:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --cluster-memory 4gb\n"})}),"\n",(0,r.jsx)(s.h2,{id:"deployment-version",children:"Deployment Version"}),"\n",(0,r.jsxs)(s.p,{children:["The deployment version refers to the version of manifests used for installing software. Deployment versions are managed by anynines in a Git repository. The deployment version option allows you to select a particular version of the deployment manifests identified by ",(0,r.jsx)(s.strong,{children:"Git tags"}),"."]}),"\n",(0,r.jsxs)(s.p,{children:["Select a particular release by providing the ",(0,r.jsx)(s.code,{children:"--deployment-version"})," parameter:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --deployment-version v1.2.0\n"})}),"\n",(0,r.jsx)(s.p,{children:"Use:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --deployment-version latest\n"})}),"\n",(0,r.jsx)(s.p,{children:"To get the latest, untagged version of the deployment manifests."}),"\n",(0,r.jsx)(s.h2,{id:"kubernetes-provider",children:"Kubernetes Provider"}),"\n",(0,r.jsxs)(s.p,{children:["When creating a Kubernetes cluster, the mechanism to manage the cluster can be selected by specifying the ",(0,r.jsx)(s.code,{children:"--provider"})," option:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s -p kind \na9s create cluster a8s -p minikube (default)\n"})}),"\n",(0,r.jsx)(s.p,{children:"Follow the instructions to learn about available sub commands."}),"\n",(0,r.jsx)(s.h2,{id:"backup-infrastructure-region",children:"Backup Infrastructure Region"}),"\n",(0,r.jsxs)(s.p,{children:["When using the backup and restore functionality, a backup infrastructure region must be specified by using the ",(0,r.jsx)(s.code,{children:"--backup-region"})," option:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --backup-region us-east-1\n"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note"}),": By default, an existing ",(0,r.jsx)(s.code,{children:"backup-config.yaml"})," will be used. Hence, if you intend to change\nyour backup config, remove the existing ",(0,r.jsx)(s.code,{children:"backup-config.yaml"}),", first:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"rm a8s-deployment/deploy/a8s/backup-config/backup-store-config.yaml\n"})}),"\n",(0,r.jsx)(s.h2,{id:"unattended-mode",children:"Unattended Mode"}),"\n",(0,r.jsxs)(s.p,{children:["It is possible to skip all yes-no questions by ",(0,r.jsx)(s.strong,{children:"enabling the unattended mode"})," by passing the ",(0,r.jsx)(s.code,{children:"-y"})," or ",(0,r.jsx)(s.code,{children:"--yes"})," flag:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --yes\n"})}),"\n",(0,r.jsx)(s.h2,{id:"printing-the-working-directory",children:"Printing the Working Directory"}),"\n",(0,r.jsxs)(s.p,{children:["The working directory is stored in the ",(0,r.jsx)(s.code,{children:"~/.a8s"})," configuration file. The working directory contains all resources downloaded and generated by the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI."]}),"\n",(0,r.jsx)(s.p,{children:"To print the working directory execute:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s cluster pwd\n"})}),"\n",(0,r.jsx)(s.h1,{id:"a8s-postgresql",children:"a8s PostgreSQL"}),"\n",(0,r.jsxs)(s.p,{children:["A selected subset of the a8s PostgreSQL features are available through the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI."]}),"\n",(0,r.jsx)(s.h2,{id:"creating-a-postgresql-service-instance",children:"Creating a PostgreSQL Service Instance"}),"\n",(0,r.jsxs)(s.p,{children:["Creating a service instance with the name ",(0,r.jsx)(s.code,{children:"sample-pg-cluster"}),":"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --name sample-pg-cluster\n"})}),"\n",(0,r.jsxs)(s.p,{children:["The generated YAML specification will be stored in the ",(0,r.jsx)(s.code,{children:"usermanifests"}),"."]}),"\n",(0,r.jsx)(s.h3,{id:"creating-postgresql-service-instance-yaml-without-applying-it",children:"Creating PostgreSQL Service Instance YAML Without Applying it"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --name sample-pg-cluster --no-apply\n"})}),"\n",(0,r.jsxs)(s.p,{children:["The generated YAML specification will be stored in the ",(0,r.jsx)(s.code,{children:"usermanifests"})," but ",(0,r.jsx)(s.code,{children:"kubectl apply"})," won't be executed."]}),"\n",(0,r.jsx)(s.h3,{id:"creating-a-custom-postgresql-service-instance",children:"Creating a Custom PostgreSQL Service Instance"}),"\n",(0,r.jsx)(s.p,{children:"The command:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --api-version v1beta3 --name sample-pg-cluster --namespace default --replicas 3 --requests-cpu 200m --limits-memory 200Mi --service-version 14 --volume-size 2Gi\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Will generate a YAML spec called ",(0,r.jsx)(s.code,{children:"usermanifests/my-pg-instance.yaml"})," with the following content:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"apiVersion: postgresql.anynines.com/v1beta3\nkind: Postgresql\nmetadata:\n name: my-pg\nspec:\n replicas: 3\n resources:\n limits:\n memory: 200m\n requests:\n cpu: 200m\n version: 14\n volumeSize: 2Gi\n"})}),"\n",(0,r.jsx)(s.h2,{id:"deleting-a-postgresql-service-instance",children:"Deleting a PostgreSQL Service Instance"}),"\n",(0,r.jsxs)(s.p,{children:["Deleting a service instance with the name ",(0,r.jsx)(s.code,{children:"sample-pg-cluster"}),":"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s delete pg instance --name sample-pg-cluster\n"})}),"\n",(0,r.jsx)(s.p,{children:"Or by providing an explicit namespace:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s delete pg instance --name sample-pg-cluster -n default\n"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note"}),": If the service instance doesn't exist, a warning is printed and the command exists with the\nreturn code ",(0,r.jsx)(s.code,{children:"0"})," as the desired state of the service instance being delete is reached."]}),"\n",(0,r.jsx)(s.h2,{id:"applying-a-sql-file-to-a-postgresql-service-instance",children:"Applying a SQL File to a PostgreSQL Service Instance"}),"\n",(0,r.jsxs)(s.p,{children:["Uploading a SQL file, executing it using ",(0,r.jsx)(s.code,{children:"psql"})," and deleting the file can be done with:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster\n"})}),"\n",(0,r.jsx)(s.p,{children:"The file is uploaded to the current primary pod of the service instance."}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note"}),": Ensure that, during the execution of the command, there is no change of the primary node for a given clustered service instance as otherwise the file upload may fail or target the wrong pod."]}),"\n",(0,r.jsxs)(s.p,{children:["Use ",(0,r.jsx)(s.code,{children:"--yes"})," to skip the confirmation prompt."]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster --yes\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Use ",(0,r.jsx)(s.code,{children:"--no-delete"})," to leave the file in the pod:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster --no-delete\n"})}),"\n",(0,r.jsx)(s.h2,{id:"applying-a-sql-statement-to-a-postgresql-service-instance",children:"Applying a SQL Statement to a PostgreSQL Service Instance"}),"\n",(0,r.jsx)(s.p,{children:"Applying a SQL statement on the primary pod of a PostgreSQL service instance can be accomplished with:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:'a9s pg apply -i sample-pg-cluster --sql "select count(*) from posts" --yes\n'})}),"\n",(0,r.jsx)(s.h2,{id:"creating-a-backup-of-a-postgresql-service-instance",children:"Creating a Backup of a PostgreSQL Service Instance"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg backup --name sample-pg-cluster-backup-1 -i sample-pg-cluster\n"})}),"\n",(0,r.jsx)(s.h2,{id:"restoring-a-backup-of-postgresql-service-instance",children:"Restoring a Backup of PostgreSQL Service Instance"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg restore --name sample-pg-cluster-restore-1 -b sample-pg-cluster-backup-1 -i sample-pg-cluster\n"})}),"\n",(0,r.jsx)(s.h2,{id:"creating-a-postgresql-service-binding",children:"Creating a PostgreSQL Service Binding"}),"\n",(0,r.jsx)(s.p,{children:"A Service Binding is an entity facilitating the secure consumption of a service instance.\nBy creating a service instance, a Postgres user is created along with a corresponding Kubernetes Secret."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg servicebinding --name sb-clustered-1 -i sample-pg-cluster\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Will therefore create a Kubernetes Secret named ",(0,r.jsx)(s.code,{children:"sb-clustered-1-service-binding"})," and provide the following\nkeys containing everything an application needs to connect to the PostgreSQL service instance:"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.code,{children:"database"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.code,{children:"instance_service"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.code,{children:"password"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.code,{children:"username"})}),"\n"]}),"\n",(0,r.jsx)(s.h1,{id:"cleaning-up",children:"Cleaning Up"}),"\n",(0,r.jsx)(s.p,{children:"In order to delete the cluster run:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s delete cluster a8s\n"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note"}),": This will not delete config files."]}),"\n",(0,r.jsx)(s.p,{children:"Config files are stored in the cluster working directory."}),"\n",(0,r.jsx)(s.p,{children:"They can be removed with:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"rm -rf $( a9s cluster pwd )\n"})})]})}function h(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>t,x:()=>c});var i=n(6540);const r={},a=i.createContext(r);function t(e){const s=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),i.createElement(a.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/1cd7d199.142ddd35.js b/assets/js/1cd7d199.142ddd35.js
deleted file mode 100644
index 4038039..0000000
--- a/assets/js/1cd7d199.142ddd35.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[7775],{5523:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>a,metadata:()=>c,toc:()=>o});var i=n(4848),r=n(8453);const a={id:"a9s-cli",title:"a9s CLI",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind"]},t="a9s CLI",c={id:"a9s-cli",title:"a9s CLI",description:"anynines provides a command line tool called a9s to facilitate application development, devops tasks and interact with selected anynines products.",source:"@site/versioned_docs/version-0.13.1/a9s-cli.md",sourceDirName:".",slug:"/a9s-cli",permalink:"/docs/0.13.1/a9s-cli",draft:!1,unlisted:!1,tags:[{inline:!0,label:"a9s cli",permalink:"/docs/0.13.1/tags/a-9-s-cli"},{inline:!0,label:"a9s hub",permalink:"/docs/0.13.1/tags/a-9-s-hub"},{inline:!0,label:"a9s data services",permalink:"/docs/0.13.1/tags/a-9-s-data-services"},{inline:!0,label:"a8s data services",permalink:"/docs/0.13.1/tags/a-8-s-data-services"},{inline:!0,label:"a9s postgres",permalink:"/docs/0.13.1/tags/a-9-s-postgres"},{inline:!0,label:"a8s postgres",permalink:"/docs/0.13.1/tags/a-8-s-postgres"},{inline:!0,label:"data service",permalink:"/docs/0.13.1/tags/data-service"},{inline:!0,label:"introduction",permalink:"/docs/0.13.1/tags/introduction"},{inline:!0,label:"kubernetes",permalink:"/docs/0.13.1/tags/kubernetes"},{inline:!0,label:"minikube",permalink:"/docs/0.13.1/tags/minikube"},{inline:!0,label:"kind",permalink:"/docs/0.13.1/tags/kind"}],version:"0.13.1",frontMatter:{id:"a9s-cli",title:"a9s CLI",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind"]}},l={},o=[{value:"Use Cases",id:"use-cases",level:2},{value:"a8s
Stack",id:"a8s-stack",level:3},{value:"Cold-Run",id:"cold-run",level:2},{value:"Setting Up a Working Directory",id:"setting-up-a-working-directory",level:3},{value:"Configuring the Backup Store",id:"configuring-the-backup-store",level:3},{value:"Skip Checking Prerequisites",id:"skip-checking-prerequisites",level:2},{value:"Number of Kubernetes Nodes",id:"number-of-kubernetes-nodes",level:2},{value:"Cluster Memory",id:"cluster-memory",level:2},{value:"Deployment Version",id:"deployment-version",level:2},{value:"Kubernetes Provider",id:"kubernetes-provider",level:2},{value:"Backup Infrastructure Region",id:"backup-infrastructure-region",level:2},{value:"Unattended Mode",id:"unattended-mode",level:2},{value:"Printing the Working Directory",id:"printing-the-working-directory",level:2},{value:"Creating a PostgreSQL Service Instance",id:"creating-a-postgresql-service-instance",level:2},{value:"Creating PostgreSQL Service Instance YAML Without Applying it",id:"creating-postgresql-service-instance-yaml-without-applying-it",level:3},{value:"Creating a Custom PostgreSQL Service Instance",id:"creating-a-custom-postgresql-service-instance",level:3},{value:"Deleting a PostgreSQL Service Instance",id:"deleting-a-postgresql-service-instance",level:2},{value:"Applying a SQL File to a PostgreSQL Service Instance",id:"applying-a-sql-file-to-a-postgresql-service-instance",level:2},{value:"Applying a SQL Statement to a PostgreSQL Service Instance",id:"applying-a-sql-statement-to-a-postgresql-service-instance",level:2},{value:"Creating a Backup of a PostgreSQL Service Instance",id:"creating-a-backup-of-a-postgresql-service-instance",level:2},{value:"Restoring a Backup of PostgreSQL Service Instance",id:"restoring-a-backup-of-postgresql-service-instance",level:2},{value:"Creating a PostgreSQL Service Binding",id:"creating-a-postgresql-service-binding",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.h1,{id:"a9s-cli",children:"a9s CLI"}),"\n",(0,i.jsxs)(s.p,{children:["anynines provides a command line tool called ",(0,i.jsx)(s.code,{children:"a9s"})," to facilitate application development, devops tasks and interact with selected anynines products."]}),"\n",(0,i.jsx)(s.h2,{id:"use-cases",children:"Use Cases"}),"\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.code,{children:"a9s"})," CLI can be used to install and use the following stacks:"]}),"\n",(0,i.jsxs)(s.h3,{id:"a8s-stack",children:[(0,i.jsx)(s.code,{children:"a8s"})," Stack"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Install a local Kubernetes cluster (",(0,i.jsx)(s.code,{children:"minikube"})," or ",(0,i.jsx)(s.code,{children:"kind"}),")."]}),"\n",(0,i.jsxs)(s.li,{children:["Install the ",(0,i.jsx)(s.a,{href:"https://cert-manager.io/",children:"cert-manager"}),"."]}),"\n",(0,i.jsx)(s.li,{children:"Install a local Minio object store for storing Backups."}),"\n",(0,i.jsxs)(s.li,{children:["Install the a8s PostgreSQL Operator PostgreSQL supporting","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["creating dedicated PostgreSQL clusters with","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"synchronous and asynchronous streaming replication."}),"\n",(0,i.jsx)(s.li,{children:"automatic failure detection and automatic failover."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.li,{children:"backup and restore capabilities storing backups in an S3 compatible object store such as AWS S3 or Minio."}),"\n",(0,i.jsx)(s.li,{children:"ability to easily create database users and Kubernetes Secrets by using the Service Bindings abstraction"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Easily apply ",(0,i.jsx)(s.code,{children:".sql"})," files and SQL commands to PostgreSQL clusters."]}),"\n"]}),"\n",(0,i.jsx)(s.h1,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Using the backup/restore feature of a8s PostgreSQL requires an S3 compatible endpoint."}),"\n",(0,i.jsxs)(s.li,{children:["Install Go (if you want ",(0,i.jsx)(s.code,{children:"go env"})," to identify your OS and arch)."]}),"\n",(0,i.jsx)(s.li,{children:"Install Git."}),"\n",(0,i.jsx)(s.li,{children:"Install Docker."}),"\n",(0,i.jsx)(s.li,{children:"Install Kubectl."}),"\n",(0,i.jsx)(s.li,{children:"Install Kind and/or Minikube."}),"\n",(0,i.jsxs)(s.li,{children:["Install the ",(0,i.jsx)(s.a,{href:"https://cert-manager.io/docs/reference/cmctl/",children:"cert-manager CLI"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.h1,{id:"installing-the-cli",children:"Installing the CLI"}),"\n",(0,i.jsxs)(s.p,{children:["In order to install the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI execute the following shell script:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"RELEASE=$(curl -L -s https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/stable.txt); OS=$(go env GOOS); ARCH=$(go env GOARCH); curl -fsSL -o a9s https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/releases/$RELEASE/a9s-$OS-$ARCH\n \nsudo chmod 755 a9s\nsudo mv a9s /usr/local/bin\n"})}),"\n",(0,i.jsxs)(s.p,{children:["This will download the ",(0,i.jsx)(s.code,{children:"a9s"})," binary suitable for your architecture and move it to ",(0,i.jsx)(s.code,{children:"/usr/local/bin"}),".\nDepending on your system you have to adjust the ",(0,i.jsx)(s.code,{children:"PATH"})," variable or move the binary to a folder that's already in the ",(0,i.jsx)(s.code,{children:"PATH"}),"."]}),"\n",(0,i.jsx)(s.h1,{id:"using-the-cli",children:"Using the CLI"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s\n"})}),"\n",(0,i.jsx)(s.h1,{id:"creating-a-local-a8s-postgres-cluster",children:"Creating a Local a8s Postgres Cluster"}),"\n",(0,i.jsxs)(s.p,{children:["Create a local Kubernetes cluster using ",(0,i.jsx)(s.code,{children:"Minikube"})," or ",(0,i.jsx)(s.code,{children:"Kind"}),", ",(0,i.jsx)(s.strong,{children:"install a8s PostgreSQL"})," including its dependencies as well as a local ",(0,i.jsx)(s.a,{href:"https://min.io/",children:"Minio"})," object store."]}),"\n",(0,i.jsxs)(s.p,{children:["Get ready for ",(0,i.jsx)(s.strong,{children:"local development of applications with PostgreSQL"})," and/or ",(0,i.jsx)(s.strong,{children:"experimentation with a8s Postgres"})," by issuing the command:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s\n"})}),"\n",(0,i.jsx)(s.p,{children:"Recommended is 12 GB of free memory for the creation of three cluster nodes with each 4 GB. The number of nodes and memory size can be adjusted."}),"\n",(0,i.jsx)(s.h2,{id:"cold-run",children:"Cold-Run"}),"\n",(0,i.jsx)(s.p,{children:"When creating a cluster for the first time, a few setup steps will have to be taken which need to be performed only once:"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Setting up a working directory for the use with the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI. ",(0,i.jsx)(s.strong,{children:"This step asks for your confirmation of the proposed directory."})]}),"\n",(0,i.jsx)(s.li,{children:"Configuring the access credentials for the S3 compatible object store which is needed to use the backup/restore feature of a8s Postgres. This step is performed automatically."}),"\n",(0,i.jsxs)(s.li,{children:["Cloning deployment resources required by the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI to create a cluster. This step is performed automatically."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"setting-up-a-working-directory",children:"Setting Up a Working Directory"}),"\n",(0,i.jsxs)(s.p,{children:["The working directory is where are ",(0,i.jsx)(s.code,{children:"a9s"})," CLI related resources will go. This includes ",(0,i.jsx)(s.code,{children:"yaml"})," specifications being cloned from remote repositories, but also those generated by the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI for your convenience."]}),"\n",(0,i.jsxs)(s.p,{children:["Once established, the working directory is stored in the ",(0,i.jsx)(s.code,{children:"~/.a9s"})," configuration file."]}),"\n",(0,i.jsxs)(s.p,{children:["The default working directory is ",(0,i.jsx)(s.code,{children:"~/a9s"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"Alternatively, provide a custom working directory at the corresponding prompt."}),"\n",(0,i.jsx)(s.h3,{id:"configuring-the-backup-store",children:"Configuring the Backup Store"}),"\n",(0,i.jsx)(s.p,{children:"A non-prod Minio object store is installed in your local Kubernetes cluster and is automatically configured as the default backup store for a8s PostgreSQL backups."}),"\n",(0,i.jsxs)(s.p,{children:["If you want to use an alternative backup store, see ",(0,i.jsx)(s.code,{children:"a9s create cluster a8s --help"})," for the defaults of your particular CLI version and list of configuration options."]}),"\n",(0,i.jsx)(s.p,{children:"Most S3 compatible object stores, including AWS S3 itself of course, should work."}),"\n",(0,i.jsx)(s.h2,{id:"skip-checking-prerequisites",children:"Skip Checking Prerequisites"}),"\n",(0,i.jsx)(s.p,{children:"It is possible to skip the verification of prerequisites. This includes skipping the search for: required shell commands, a running Docker daemon and a running Kubernetes cluster."}),"\n",(0,i.jsxs)(s.p,{children:["In order to skip precheck use the ",(0,i.jsx)(s.code,{children:"--no-precheck"})," option:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --no-precheck\n"})}),"\n",(0,i.jsx)(s.h2,{id:"number-of-kubernetes-nodes",children:"Number of Kubernetes Nodes"}),"\n",(0,i.jsx)(s.p,{children:"Specifying the number of Nodes in the Kubernetes cluster:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --cluster-nr-of-nodes 1\n"})}),"\n",(0,i.jsx)(s.h2,{id:"cluster-memory",children:"Cluster Memory"}),"\n",(0,i.jsxs)(s.p,{children:["Specifying the memory of ",(0,i.jsx)(s.strong,{children:"each"})," Node of the Kubernetes cluster:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --cluster-memory 4gb\n"})}),"\n",(0,i.jsx)(s.h2,{id:"deployment-version",children:"Deployment Version"}),"\n",(0,i.jsxs)(s.p,{children:["The deployment version refers to the version of manifests used for installing software. Deployment versions are managed by anynines in a Git repository. The deployment version option allows you to select a particular version of the deployment manifests identified by ",(0,i.jsx)(s.strong,{children:"Git tags"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["Select a particular release by providing the ",(0,i.jsx)(s.code,{children:"--deployment-version"})," parameter:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --deployment-version v1.2.0\n"})}),"\n",(0,i.jsx)(s.p,{children:"Use:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --deployment-version latest\n"})}),"\n",(0,i.jsx)(s.p,{children:"To get the latest, untagged version of the deployment manifests."}),"\n",(0,i.jsx)(s.h2,{id:"kubernetes-provider",children:"Kubernetes Provider"}),"\n",(0,i.jsxs)(s.p,{children:["When creating a Kubernetes cluster, the mechanism to manage the cluster can be selected by specifying the ",(0,i.jsx)(s.code,{children:"--provider"})," option:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s -p kind \na9s create cluster a8s -p minikube (default)\n"})}),"\n",(0,i.jsx)(s.p,{children:"Follow the instructions to learn about available sub commands."}),"\n",(0,i.jsx)(s.h2,{id:"backup-infrastructure-region",children:"Backup Infrastructure Region"}),"\n",(0,i.jsxs)(s.p,{children:["When using the backup and restore functionality, a backup infrastructure region must be specified by using the ",(0,i.jsx)(s.code,{children:"--backup-region"})," option:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --backup-region us-east-1\n"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note"}),": By default, an existing ",(0,i.jsx)(s.code,{children:"backup-config.yaml"})," will be used. Hence, if you intend to change\nyour backup config, remove the existing ",(0,i.jsx)(s.code,{children:"backup-config.yaml"}),", first:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"rm a8s-deployment/deploy/a8s/backup-config/backup-store-config.yaml\n"})}),"\n",(0,i.jsx)(s.h2,{id:"unattended-mode",children:"Unattended Mode"}),"\n",(0,i.jsxs)(s.p,{children:["It is possible to skip all yes-no questions by ",(0,i.jsx)(s.strong,{children:"enabling the unattended mode"})," by passing the ",(0,i.jsx)(s.code,{children:"-y"})," or ",(0,i.jsx)(s.code,{children:"--yes"})," flag:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --yes\n"})}),"\n",(0,i.jsx)(s.h2,{id:"printing-the-working-directory",children:"Printing the Working Directory"}),"\n",(0,i.jsxs)(s.p,{children:["The working directory is stored in the ",(0,i.jsx)(s.code,{children:"~/.a8s"})," configuration file. The working directory contains all resources downloaded and generated by the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI."]}),"\n",(0,i.jsx)(s.p,{children:"To print the working directory execute:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s cluster pwd\n"})}),"\n",(0,i.jsx)(s.h1,{id:"a8s-postgresql",children:"a8s PostgreSQL"}),"\n",(0,i.jsxs)(s.p,{children:["A selected subset of the a8s PostgreSQL features are available through the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI."]}),"\n",(0,i.jsx)(s.h2,{id:"creating-a-postgresql-service-instance",children:"Creating a PostgreSQL Service Instance"}),"\n",(0,i.jsxs)(s.p,{children:["Creating a service instance with the name ",(0,i.jsx)(s.code,{children:"sample-pg-cluster"}),":"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --name sample-pg-cluster\n"})}),"\n",(0,i.jsxs)(s.p,{children:["The generated YAML specification will be stored in the ",(0,i.jsx)(s.code,{children:"usermanifests"}),"."]}),"\n",(0,i.jsx)(s.h3,{id:"creating-postgresql-service-instance-yaml-without-applying-it",children:"Creating PostgreSQL Service Instance YAML Without Applying it"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --name sample-pg-cluster --no-apply\n"})}),"\n",(0,i.jsxs)(s.p,{children:["The generated YAML specification will be stored in the ",(0,i.jsx)(s.code,{children:"usermanifests"})," but ",(0,i.jsx)(s.code,{children:"kubectl apply"})," won't be executed."]}),"\n",(0,i.jsx)(s.h3,{id:"creating-a-custom-postgresql-service-instance",children:"Creating a Custom PostgreSQL Service Instance"}),"\n",(0,i.jsx)(s.p,{children:"The command:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --api-version v1beta3 --name sample-pg-cluster --namespace default --replicas 3 --requests-cpu 200m --limits-memory 200Mi --service-version 14 --volume-size 2Gi\n"})}),"\n",(0,i.jsxs)(s.p,{children:["Will generate a YAML spec called ",(0,i.jsx)(s.code,{children:"usermanifests/my-pg-instance.yaml"})," with the following content:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"apiVersion: postgresql.anynines.com/v1beta3\nkind: Postgresql\nmetadata:\n name: my-pg\nspec:\n replicas: 3\n resources:\n limits:\n memory: 200m\n requests:\n cpu: 200m\n version: 14\n volumeSize: 2Gi\n"})}),"\n",(0,i.jsx)(s.h2,{id:"deleting-a-postgresql-service-instance",children:"Deleting a PostgreSQL Service Instance"}),"\n",(0,i.jsxs)(s.p,{children:["Deleting a service instance with the name ",(0,i.jsx)(s.code,{children:"sample-pg-cluster"}),":"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s delete pg instance --name sample-pg-cluster\n"})}),"\n",(0,i.jsx)(s.p,{children:"Or by providing an explicit namespace:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s delete pg instance --name sample-pg-cluster -n default\n"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note"}),": If the service instance doesn't exist, a warning is printed and the command exists with the\nreturn code ",(0,i.jsx)(s.code,{children:"0"})," as the desired state of the service instance being delete is reached."]}),"\n",(0,i.jsx)(s.h2,{id:"applying-a-sql-file-to-a-postgresql-service-instance",children:"Applying a SQL File to a PostgreSQL Service Instance"}),"\n",(0,i.jsxs)(s.p,{children:["Uploading a SQL file, executing it using ",(0,i.jsx)(s.code,{children:"psql"})," and deleting the file can be done with:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster\n"})}),"\n",(0,i.jsx)(s.p,{children:"The file is uploaded to the current primary pod of the service instance."}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note"}),": Ensure that, during the execution of the command, there is no change of the primary node for a given clustered service instance as otherwise the file upload may fail or target the wrong pod."]}),"\n",(0,i.jsxs)(s.p,{children:["Use ",(0,i.jsx)(s.code,{children:"--yes"})," to skip the confirmation prompt."]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster --yes\n"})}),"\n",(0,i.jsxs)(s.p,{children:["Use ",(0,i.jsx)(s.code,{children:"--no-delete"})," to leave the file in the pod:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster --no-delete\n"})}),"\n",(0,i.jsx)(s.h2,{id:"applying-a-sql-statement-to-a-postgresql-service-instance",children:"Applying a SQL Statement to a PostgreSQL Service Instance"}),"\n",(0,i.jsx)(s.p,{children:"Applying a SQL statement on the primary pod of a PostgreSQL service instance can be accomplished with:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:'a9s pg apply -i sample-pg-cluster --sql "select count(*) from posts" --yes\n'})}),"\n",(0,i.jsx)(s.h2,{id:"creating-a-backup-of-a-postgresql-service-instance",children:"Creating a Backup of a PostgreSQL Service Instance"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg backup --name sample-pg-cluster-backup-1 -i sample-pg-cluster\n"})}),"\n",(0,i.jsx)(s.h2,{id:"restoring-a-backup-of-postgresql-service-instance",children:"Restoring a Backup of PostgreSQL Service Instance"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg restore --name sample-pg-cluster-restore-1 -b sample-pg-cluster-backup-1 -i sample-pg-cluster\n"})}),"\n",(0,i.jsx)(s.h2,{id:"creating-a-postgresql-service-binding",children:"Creating a PostgreSQL Service Binding"}),"\n",(0,i.jsx)(s.p,{children:"A Service Binding is an entity facilitating the secure consumption of a service instance.\nBy creating a service instance, a Postgres user is created along with a corresponding Kubernetes Secret."}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg servicebinding --name sb-clustered-1 -i sample-pg-cluster\n"})}),"\n",(0,i.jsxs)(s.p,{children:["Will therefore create a Kubernetes Secret named ",(0,i.jsx)(s.code,{children:"sb-clustered-1-service-binding"})," and provide the following\nkeys containing everything an application needs to connect to the PostgreSQL service instance:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"database"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"instance_service"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"password"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"username"})}),"\n"]}),"\n",(0,i.jsx)(s.h1,{id:"cleaning-up",children:"Cleaning Up"}),"\n",(0,i.jsx)(s.p,{children:"In order to delete the cluster run:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s delete cluster a8s\n"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note"}),": This will not delete config files."]}),"\n",(0,i.jsx)(s.p,{children:"Config files are stored in the cluster working directory."}),"\n",(0,i.jsx)(s.p,{children:"They can be removed with:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"rm -rf $( a9s cluster pwd )\n"})})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>t,x:()=>c});var i=n(6540);const r={},a=i.createContext(r);function t(e){const s=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),i.createElement(a.Provider,{value:s},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/1f391b9e.1d84c9e3.js b/assets/js/1f391b9e.1d84c9e3.js
new file mode 100644
index 0000000..3989c27
--- /dev/null
+++ b/assets/js/1f391b9e.1d84c9e3.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[6061],{8811:(e,n,t)=>{t.d(n,{A:()=>o});t(6540);var a=t(4164),i=t(6907),s=t(8630),l=t(4182),r=t(4848);function c(e){let{className:n}=e;return(0,r.jsx)(l.A,{type:"caution",title:(0,r.jsx)(i.Rc,{}),className:(0,a.A)(n,s.G.common.unlistedBanner),children:(0,r.jsx)(i.Uh,{})})}function o(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.AE,{}),(0,r.jsx)(c,{...e})]})}},4648:(e,n,t)=>{t.d(n,{A:()=>d});t(6540);var a=t(4164),i=t(6907),s=t(8630),l=t(4182),r=t(4848);function c(e){let{className:n}=e;return(0,r.jsx)(l.A,{type:"caution",title:(0,r.jsx)(i.Yh,{}),className:(0,a.A)(n,s.G.common.draftBanner),children:(0,r.jsx)(i.TT,{})})}var o=t(8811);function d(e){let{metadata:n}=e;const{unlisted:t,frontMatter:a}=n;return(0,r.jsxs)(r.Fragment,{children:[(t||a.unlisted)&&(0,r.jsx)(o.A,{}),a.draft&&(0,r.jsx)(c,{})]})}},9972:(e,n,t)=>{t.r(n),t.d(n,{default:()=>f});t(6540);var a=t(4164),i=t(6644),s=t(8630),l=t(1297),r=t(5930),c=t(8793),o=t(4648),d=t(5659);const m={mdxPageWrapper:"mdxPageWrapper_j9I6"};var u=t(4848);function f(e){const{content:n}=e,{metadata:t,assets:f}=n,{title:h,editUrl:v,description:x,frontMatter:g,lastUpdatedBy:p,lastUpdatedAt:j}=t,{keywords:A,wrapperClassName:b,hide_table_of_contents:L}=g,N=f.image??g.image,C=!!(v||j||p);return(0,u.jsx)(i.e3,{className:(0,a.A)(b??s.G.wrapper.mdxPages,s.G.page.mdxPage),children:(0,u.jsxs)(l.A,{children:[(0,u.jsx)(i.be,{title:h,description:x,keywords:A,image:N}),(0,u.jsx)("main",{className:"container container--fluid margin-vert--lg",children:(0,u.jsxs)("div",{className:(0,a.A)("row",m.mdxPageWrapper),children:[(0,u.jsxs)("div",{className:(0,a.A)("col",!L&&"col--8"),children:[(0,u.jsx)(o.A,{metadata:t}),(0,u.jsx)("article",{children:(0,u.jsx)(r.A,{children:(0,u.jsx)(n,{})})}),C&&(0,u.jsx)(d.A,{className:(0,a.A)("margin-top--sm",s.G.pages.pageFooterEditMetaRow),editUrl:v,lastUpdatedAt:j,lastUpdatedBy:p})]}),!L&&n.toc.length>0&&(0,u.jsx)("div",{className:"col col--2",children:(0,u.jsx)(c.A,{toc:n.toc,minHeadingLevel:g.toc_min_heading_level,maxHeadingLevel:g.toc_max_heading_level})})]})})]})})}},8793:(e,n,t)=>{t.d(n,{A:()=>o});t(6540);var a=t(4164),i=t(1507);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var l=t(4848);const r="table-of-contents__link toc-highlight",c="table-of-contents__link--active";function o(e){let{className:n,...t}=e;return(0,l.jsx)("div",{className:(0,a.A)(s.tableOfContents,"thin-scrollbar",n),children:(0,l.jsx)(i.A,{...t,linkClassName:r,linkActiveClassName:c})})}},1507:(e,n,t)=>{t.d(n,{A:()=>v});var a=t(6540),i=t(6957);function s(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const a=t.slice(2,e.level);e.parentIndex=Math.max(...a),t[e.level]=n}));const a=[];return n.forEach((e=>{const{parentIndex:t,...i}=e;t>=0?n[t].children.push(i):a.push(i)})),a}function l(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return n.flatMap((e=>{const n=l({toc:e.children,minHeadingLevel:t,maxHeadingLevel:a});return function(e){return e.level>=t&&e.level<=a}(e)?[{...e,children:n}]:n}))}function r(e){const n=e.getBoundingClientRect();return n.top===n.bottom?r(e.parentNode):n}function c(e,n){let{anchorTopOffset:t}=n;const a=e.find((e=>r(e).top>=t));if(a){return function(e){return e.top>0&&e.bottom["'])(?.*?)\1/,f=/\{(? [\d,-]+)\}/,x={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},b={...x,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},j=Object.keys(x);function g(e,t){const n=e.map((e=>{const{start:n,end:s}=b[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${s})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function v(e,t){let n=e.replace(/\n$/,"");const{language:s,magicComments:o,metastring:a}=t;if(a&&f.test(a)){const e=a.match(f).groups.range;if(0===o.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${a}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=o[0].className,s=h()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(s),code:n}}if(void 0===s)return{lineClassNames:{},code:n};const c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return g(["js","jsBlock"],t);case"jsx":case"tsx":return g(["js","jsBlock","jsx"],t);case"html":return g(["js","jsBlock","html"],t);case"python":case"py":case"bash":return g(["bash"],t);case"markdown":case"md":return g(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return g(["tex"],t);case"lua":case"haskell":case"sql":return g(["lua"],t);case"wasm":return g(["wasm"],t);case"vb":case"vba":case"visual-basic":return g(["vb","rem"],t);case"vbnet":return g(["vbnet","rem"],t);case"batch":return g(["rem"],t);case"basic":return g(["rem","f90"],t);case"fsharp":return g(["js","ml"],t);case"ocaml":case"sml":return g(["ml"],t);case"fortran":return g(["f90"],t);case"cobol":return g(["cobol"],t);default:return g(j,t)}}(s,o),r=n.split("\n"),i=Object.fromEntries(o.map((e=>[e.className,{start:0,range:""}]))),l=Object.fromEntries(o.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),u=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let h=0;h void 0!==e));l[t]?i[l[t]].range+=`${h},`:d[t]?i[d[t]].start=h:u[t]&&(i[u[t]].range+=`${i[u[t]].start}-${h-1},`),r.splice(h,1)}n=r.join("\n");const m={};return Object.entries(i).forEach((e=>{let[t,{range:n}]=e;h()(n).forEach((e=>{m[e]??=[],m[e].push(t)}))})),{lineClassNames:m,code:n}}const y={codeBlockContainer:"codeBlockContainer_Ckt0"};var N=n(4848);function A(e){let{as:t,...n}=e;const s=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[s,o]=e;const a=t[s];a&&"string"==typeof o&&(n[a]=o)})),n}(d());return(0,N.jsx)(t,{...n,style:s,className:(0,r.A)(n.className,y.codeBlockContainer,u.G.common.codeBlock)})}const B={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function k(e){let{children:t,className:n}=e;return(0,N.jsx)(A,{as:"pre",tabIndex:0,className:(0,r.A)(B.codeBlockStandalone,"thin-scrollbar",n),children:(0,N.jsx)("code",{className:B.codeBlockLines,children:t})})}var w=n(1971);const C={attributes:!0,characterData:!0,childList:!0,subtree:!0};function E(e,t){const[n,o]=(0,s.useState)(),a=(0,s.useCallback)((()=>{o(e.current?.closest("[role=tabpanel][hidden]"))}),[e,o]);(0,s.useEffect)((()=>{a()}),[a]),function(e,t,n){void 0===n&&(n=C);const o=(0,w._q)(t),a=(0,w.Be)(n);(0,s.useEffect)((()=>{const t=new MutationObserver(o);return e&&t.observe(e,a),()=>t.disconnect()}),[e,o,a])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),a())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var L=n(1765);const T={codeLine:"codeLine_lJS_",codeLineNumber:"codeLineNumber_Tfdd",codeLineContent:"codeLineContent_feaV"};function _(e){let{line:t,classNames:n,showLineNumbers:s,getLineProps:o,getTokenProps:a}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const c=o({line:t,className:(0,r.A)(n,s&&T.codeLine)}),i=t.map(((e,t)=>(0,N.jsx)("span",{...a({token:e})},t)));return(0,N.jsxs)("span",{...c,children:[s?(0,N.jsxs)(N.Fragment,{children:[(0,N.jsx)("span",{className:T.codeLineNumber}),(0,N.jsx)("span",{className:T.codeLineContent,children:i})]}):i,(0,N.jsx)("br",{})]})}var S=n(6885);function U(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function M(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const z={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function I(e){let{code:t,className:n}=e;const[o,a]=(0,s.useState)(!1),c=(0,s.useRef)(void 0),i=(0,s.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const s=document.createElement("textarea"),o=document.activeElement;s.value=e,s.setAttribute("readonly",""),s.style.contain="strict",s.style.position="absolute",s.style.left="-9999px",s.style.fontSize="12pt";const a=document.getSelection(),c=a.rangeCount>0&&a.getRangeAt(0);n.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;let r=!1;try{r=document.execCommand("copy")}catch{}s.remove(),c&&(a.removeAllRanges(),a.addRange(c)),o&&o.focus()}(t),a(!0),c.current=window.setTimeout((()=>{a(!1)}),1e3)}),[t]);return(0,s.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),(0,N.jsx)("button",{type:"button","aria-label":o?(0,S.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,S.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,S.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,r.A)("clean-btn",n,z.copyButton,o&&z.copyButtonCopied),onClick:i,children:(0,N.jsxs)("span",{className:z.copyButtonIcons,"aria-hidden":"true",children:[(0,N.jsx)(U,{className:z.copyButtonIcon}),(0,N.jsx)(M,{className:z.copyButtonSuccessIcon})]})})}function H(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const R={wordWrapButtonIcon:"wordWrapButtonIcon_Bwma",wordWrapButtonEnabled:"wordWrapButtonEnabled_EoeP"};function V(e){let{className:t,onClick:n,isEnabled:s}=e;const o=(0,S.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,N.jsx)("button",{type:"button",onClick:n,className:(0,r.A)("clean-btn",t,s&&R.wordWrapButtonEnabled),"aria-label":o,title:o,children:(0,N.jsx)(H,{className:R.wordWrapButtonIcon,"aria-hidden":"true"})})}function $(e){let{children:t,className:n="",metastring:o,title:a,showLineNumbers:c,language:i}=e;const{prism:{defaultLanguage:u,magicComments:m}}=(0,l.p)(),h=function(e){return e?.toLowerCase()}(i??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??u),f=d(),x=function(){const[e,t]=(0,s.useState)(!1),[n,o]=(0,s.useState)(!1),a=(0,s.useRef)(null),c=(0,s.useCallback)((()=>{const n=a.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[a,e]),r=(0,s.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=a.current,n=e>t||a.current.querySelector("code").hasAttribute("style");o(n)}),[a]);return E(a,r),(0,s.useEffect)((()=>{r()}),[e,r]),(0,s.useEffect)((()=>(window.addEventListener("resize",r,{passive:!0}),()=>{window.removeEventListener("resize",r)})),[r]),{codeBlockRef:a,isEnabled:e,isCodeScrollable:n,toggle:c}}(),b=function(e){return e?.match(p)?.groups.title??""}(o)||a,{lineClassNames:j,code:g}=v(t,{metastring:o,language:h,magicComments:m}),y=c??function(e){return Boolean(e?.includes("showLineNumbers"))}(o);return(0,N.jsxs)(A,{as:"div",className:(0,r.A)(n,h&&!n.includes(`language-${h}`)&&`language-${h}`),children:[b&&(0,N.jsx)("div",{className:B.codeBlockTitle,children:b}),(0,N.jsxs)("div",{className:B.codeBlockContent,children:[(0,N.jsx)(L.f4,{theme:f,code:g,language:h??"text",children:e=>{let{className:t,style:n,tokens:s,getLineProps:o,getTokenProps:a}=e;return(0,N.jsx)("pre",{tabIndex:0,ref:x.codeBlockRef,className:(0,r.A)(t,B.codeBlock,"thin-scrollbar"),style:n,children:(0,N.jsx)("code",{className:(0,r.A)(B.codeBlockLines,y&&B.codeBlockLinesWithNumbering),children:s.map(((e,t)=>(0,N.jsx)(_,{line:e,getLineProps:o,getTokenProps:a,classNames:j[t],showLineNumbers:y},t)))})})}}),(0,N.jsxs)("div",{className:B.buttonGroup,children:[(x.isEnabled||x.isCodeScrollable)&&(0,N.jsx)(V,{className:B.codeButton,onClick:()=>x.toggle(),isEnabled:x.isEnabled}),(0,N.jsx)(I,{className:B.codeButton,code:g})]})]})]})}function W(e){let{children:t,...n}=e;const o=(0,c.A)(),a=function(e){return s.Children.toArray(e).some((e=>(0,s.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),r="string"==typeof a?$:k;return(0,N.jsx)(r,{...n,children:a},String(o))}function D(e){return(0,N.jsx)("code",{...e})}var P=n(7083);var q=n(3240),G=n(5545);const O={details:"details_lb9f",isBrowser:"isBrowser_bmU9",collapsibleContent:"collapsibleContent_i85q"};function F(e){return!!e&&("SUMMARY"===e.tagName||F(e.parentElement))}function Z(e,t){return!!e&&(e===t||Z(e.parentElement,t))}function J(e){let{summary:t,children:n,...o}=e;(0,q.A)().collectAnchor(o.id);const a=(0,c.A)(),i=(0,s.useRef)(null),{collapsed:l,setCollapsed:d}=(0,G.u)({initialState:!o.open}),[u,m]=(0,s.useState)(o.open),h=s.isValidElement(t)?t:(0,N.jsx)("summary",{children:t??"Details"});return(0,N.jsxs)("details",{...o,ref:i,open:u,"data-collapsed":l,className:(0,r.A)(O.details,a&&O.isBrowser,o.className),onMouseDown:e=>{F(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;F(t)&&Z(t,i.current)&&(e.preventDefault(),l?(d(!1),m(!0)):d(!0))},children:[h,(0,N.jsx)(G.N,{lazy:!1,collapsed:l,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{d(e),m(!e)},children:(0,N.jsx)("div",{className:O.collapsibleContent,children:n})})]})}const Y={details:"details_b_Ee"},K="alert alert--info";function Q(e){let{...t}=e;return(0,N.jsx)(J,{...t,className:(0,r.A)(K,Y.details,t.className)})}function X(e){const t=s.Children.toArray(e.children),n=t.find((e=>s.isValidElement(e)&&"summary"===e.type)),o=(0,N.jsx)(N.Fragment,{children:t.filter((e=>e!==n))});return(0,N.jsx)(Q,{...e,summary:n,children:o})}var ee=n(2067);function te(e){return(0,N.jsx)(ee.A,{...e})}const ne={containsTaskList:"containsTaskList_mC6p"};function se(e){if(void 0!==e)return(0,r.A)(e,e?.includes("contains-task-list")&&ne.containsTaskList)}const oe={img:"img_ev3q"};var ae=n(7570);const ce={Head:a.A,details:X,Details:X,code:function(e){return function(e){return void 0!==e.children&&s.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))}(e)?(0,N.jsx)(D,{...e}):(0,N.jsx)(W,{...e})},a:function(e){return(0,N.jsx)(P.A,{...e})},pre:function(e){return(0,N.jsx)(N.Fragment,{children:e.children})},ul:function(e){return(0,N.jsx)("ul",{...e,className:se(e.className)})},li:function(e){return(0,q.A)().collectAnchor(e.id),(0,N.jsx)("li",{...e})},img:function(e){return(0,N.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,r.A)(t,oe.img))});var t},h1:e=>(0,N.jsx)(te,{as:"h1",...e}),h2:e=>(0,N.jsx)(te,{as:"h2",...e}),h3:e=>(0,N.jsx)(te,{as:"h3",...e}),h4:e=>(0,N.jsx)(te,{as:"h4",...e}),h5:e=>(0,N.jsx)(te,{as:"h5",...e}),h6:e=>(0,N.jsx)(te,{as:"h6",...e}),admonition:ae.A,mermaid:()=>null};function re(e){let{children:t}=e;return(0,N.jsx)(o.x,{components:ce,children:t})}},5435:(e,t,n)=>{"use strict";n.d(t,{i:()=>o});var s=n(1059);function o(e){void 0===e&&(e={});const{i18n:{currentLocale:t}}=(0,s.A)(),n=function(){const{i18n:{currentLocale:e,localeConfigs:t}}=(0,s.A)();return t[e].calendar}();return new Intl.DateTimeFormat(t,{calendar:n,...e})}},8426:(e,t)=>{function n(e){let t,n=[];for(let s of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(s))n.push(parseInt(s,10));else if(t=s.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,s,o,a]=t;if(s&&a){s=parseInt(s),a=parseInt(a);const e=s{"use strict";n.d(t,{R:()=>c,x:()=>r});var s=n(6540);const o={},a=s.createContext(o);function c(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3720c009.54d355d0.js b/assets/js/3720c009.19aaf444.js similarity index 77% rename from assets/js/3720c009.54d355d0.js rename to assets/js/3720c009.19aaf444.js index b2721a4..7537f4e 100644 --- a/assets/js/3720c009.54d355d0.js +++ b/assets/js/3720c009.19aaf444.js @@ -1 +1 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[4787],{9929:(t,e,s)=>{s.r(e),s.d(e,{default:()=>h});s(6540);var a=s(4164),n=s(4714),r=s(8570),l=s(8961),c=s(5547),i=s(6758),o=s(2067),g=s(4848);function u(t){let{title:e}=t;return(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(n.be,{title:e}),(0,g.jsx)(i.A,{tag:"doc_tags_list"})]})}function d(t){let{tags:e,title:s}=t;return(0,g.jsx)(n.e3,{className:(0,a.A)(r.G.page.docsTagsListPage),children:(0,g.jsx)("div",{className:"container margin-vert--lg",children:(0,g.jsx)("div",{className:"row",children:(0,g.jsxs)("main",{className:"col col--8 col--offset-2",children:[(0,g.jsx)(o.A,{as:"h1",children:s}),(0,g.jsx)(c.A,{tags:e})]})})})})}function h(t){const e=(0,l.b)();return(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(u,{...t,title:e}),(0,g.jsx)(d,{...t,title:e})]})}},1665:(t,e,s)=>{s.d(e,{A:()=>c});s(6540);var a=s(4164),n=s(7083);const r={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=s(4848);function c(t){let{permalink:e,label:s,count:c,description:i}=t;return(0,l.jsxs)(n.A,{href:e,title:i,className:(0,a.A)(r.tag,c?r.tagWithCount:r.tagRegular),children:[s,c&&(0,l.jsx)("span",{children:c})]})}},5547:(t,e,s)=>{s.d(e,{A:()=>o});s(6540);var a=s(8961),n=s(1665),r=s(2067);const l={tag:"tag_Nnez"};var c=s(4848);function i(t){let{letterEntry:e}=t;return(0,c.jsxs)("article",{children:[(0,c.jsx)(r.A,{as:"h2",id:e.letter,children:e.letter}),(0,c.jsx)("ul",{className:"padding--none",children:e.tags.map((t=>(0,c.jsx)("li",{className:l.tag,children:(0,c.jsx)(n.A,{...t})},t.permalink)))}),(0,c.jsx)("hr",{})]})}function o(t){let{tags:e}=t;const s=(0,a.Q)(e);return(0,c.jsx)("section",{className:"margin-vert--lg",children:s.map((t=>(0,c.jsx)(i,{letterEntry:t},t.letter)))})}},8961:(t,e,s)=>{s.d(e,{Q:()=>r,b:()=>n});var a=s(6885);const n=()=>(0,a.T)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});function r(t){const e={};return Object.values(t).forEach((t=>{const s=function(t){return t[0].toUpperCase()}(t.label);e[s]??=[],e[s].push(t)})),Object.entries(e).sort(((t,e)=>{let[s]=t,[a]=e;return s.localeCompare(a)})).map((t=>{let[e,s]=t;return{letter:e,tags:s.sort(((t,e)=>t.label.localeCompare(e.label)))}}))}}}]); \ No newline at end of file +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[4787],{5429:(t,e,s)=>{s.r(e),s.d(e,{default:()=>h});s(6540);var a=s(4164),n=s(6644),r=s(8630),l=s(7045),c=s(5233),i=s(1210),o=s(5225),g=s(4848);function u(t){let{title:e}=t;return(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(n.be,{title:e}),(0,g.jsx)(i.A,{tag:"doc_tags_list"})]})}function d(t){let{tags:e,title:s}=t;return(0,g.jsx)(n.e3,{className:(0,a.A)(r.G.page.docsTagsListPage),children:(0,g.jsx)("div",{className:"container margin-vert--lg",children:(0,g.jsx)("div",{className:"row",children:(0,g.jsxs)("main",{className:"col col--8 col--offset-2",children:[(0,g.jsx)(o.A,{as:"h1",children:s}),(0,g.jsx)(c.A,{tags:e})]})})})})}function h(t){const e=(0,l.b)();return(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(u,{...t,title:e}),(0,g.jsx)(d,{...t,title:e})]})}},1883:(t,e,s)=>{s.d(e,{A:()=>c});s(6540);var a=s(4164),n=s(4783);const r={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=s(4848);function c(t){let{permalink:e,label:s,count:c,description:i}=t;return(0,l.jsxs)(n.A,{href:e,title:i,className:(0,a.A)(r.tag,c?r.tagWithCount:r.tagRegular),children:[s,c&&(0,l.jsx)("span",{children:c})]})}},5233:(t,e,s)=>{s.d(e,{A:()=>o});s(6540);var a=s(7045),n=s(1883),r=s(5225);const l={tag:"tag_Nnez"};var c=s(4848);function i(t){let{letterEntry:e}=t;return(0,c.jsxs)("article",{children:[(0,c.jsx)(r.A,{as:"h2",id:e.letter,children:e.letter}),(0,c.jsx)("ul",{className:"padding--none",children:e.tags.map((t=>(0,c.jsx)("li",{className:l.tag,children:(0,c.jsx)(n.A,{...t})},t.permalink)))}),(0,c.jsx)("hr",{})]})}function o(t){let{tags:e}=t;const s=(0,a.Q)(e);return(0,c.jsx)("section",{className:"margin-vert--lg",children:s.map((t=>(0,c.jsx)(i,{letterEntry:t},t.letter)))})}},7045:(t,e,s)=>{s.d(e,{Q:()=>r,b:()=>n});var a=s(3230);const n=()=>(0,a.T)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});function r(t){const e={};return Object.values(t).forEach((t=>{const s=function(t){return t[0].toUpperCase()}(t.label);e[s]??=[],e[s].push(t)})),Object.entries(e).sort(((t,e)=>{let[s]=t,[a]=e;return s.localeCompare(a)})).map((t=>{let[e,s]=t;return{letter:e,tags:s.sort(((t,e)=>t.label.localeCompare(e.label)))}}))}}}]); \ No newline at end of file diff --git a/assets/js/393be207.39f66b7c.js b/assets/js/393be207.39f66b7c.js deleted file mode 100644 index 60715a2..0000000 --- a/assets/js/393be207.39f66b7c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[4134],{8350:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>r,metadata:()=>p,toc:()=>d});var o=t(4848),a=t(8453);const r={title:"Markdown page example"},s="Markdown page example",p={type:"mdx",permalink:"/markdown-page",source:"@site/src/pages/markdown-page.md",title:"Markdown page example",description:"You don't need React to write simple standalone pages.",frontMatter:{title:"Markdown page example"},unlisted:!1},c={},d=[];function i(e){const n={h1:"h1",p:"p",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"markdown-page-example",children:"Markdown page example"}),"\n",(0,o.jsx)(n.p,{children:"You don't need React to write simple standalone pages."})]})}function l(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(i,{...e})}):i(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>p});var o=t(6540);const a={},r=o.createContext(a);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function p(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/393be207.9e61412b.js b/assets/js/393be207.9e61412b.js new file mode 100644 index 0000000..f6ca7ed --- /dev/null +++ b/assets/js/393be207.9e61412b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[4134],{6607:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>c,default:()=>l,frontMatter:()=>s,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"type":"mdx","permalink":"/markdown-page","source":"@site/src/pages/markdown-page.md","title":"Markdown page example","description":"You don\'t need React to write simple standalone pages.","frontMatter":{"title":"Markdown page example"},"unlisted":false}');var o=t(4848),r=t(8453);const s={title:"Markdown page example"},c="Markdown page example",p={},d=[];function i(e){const n={h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"markdown-page-example",children:"Markdown page example"})}),"\n",(0,o.jsx)(n.p,{children:"You don't need React to write simple standalone pages."})]})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(i,{...e})}):i(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>c});var a=t(6540);const o={},r=a.createContext(o);function s(e){const n=a.useContext(r);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/42ebd64a.226d876e.js b/assets/js/42ebd64a.226d876e.js new file mode 100644 index 0000000..05f658c --- /dev/null +++ b/assets/js/42ebd64a.226d876e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[3399],{4150:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","title":"Deploying a Demo App using a8s PostgreSQL","description":"What you will accomplish","source":"@site/versioned_docs/version-0.13.1/hands-on-tutorials/a9s-cli-a8s-postgresql.md","sourceDirName":"hands-on-tutorials","slug":"/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","permalink":"/docs/0.13.1/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","draft":false,"unlisted":false,"tags":[{"inline":true,"label":"a9s hub","permalink":"/docs/0.13.1/tags/a-9-s-hub"},{"inline":true,"label":"a9s cli","permalink":"/docs/0.13.1/tags/a-9-s-cli"},{"inline":true,"label":"a8s data services","permalink":"/docs/0.13.1/tags/a-8-s-data-services"},{"inline":true,"label":"a8s postgres","permalink":"/docs/0.13.1/tags/a-8-s-postgres"},{"inline":true,"label":"data service","permalink":"/docs/0.13.1/tags/data-service"},{"inline":true,"label":"tutorial","permalink":"/docs/0.13.1/tags/tutorial"},{"inline":true,"label":"kubernetes","permalink":"/docs/0.13.1/tags/kubernetes"},{"inline":true,"label":"minikube","permalink":"/docs/0.13.1/tags/minikube"},{"inline":true,"label":"kind","permalink":"/docs/0.13.1/tags/kind"}],"version":"0.13.1","frontMatter":{"id":"hands-on-tutorial-a8s-pg-a9s-cli","title":"Deploying a Demo App using a8s PostgreSQL","tags":["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind"],"keywords":["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind","postgresql","web app"]}}');var a=s(4848),i=s(8453);const r={id:"hands-on-tutorial-a8s-pg-a9s-cli",title:"Deploying a Demo App using a8s PostgreSQL",tags:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind"],keywords:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind","postgresql","web app"]},c="Overview",l={},o=[{value:"What you will accomplish",id:"what-you-will-accomplish",level:2},{value:"What you will learn",id:"what-you-will-learn",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Creating a Kubernetes Cluster with a8s PostgreSQL",id:"step-1-creating-a-kubernetes-cluster-with-a8s-postgresql",level:2},{value:"Step 1.1: Initial Configuration on the First a9s create cluster Execution",id:"step-11-initial-configuration-on-the-first-a9s-create-cluster-execution",level:3},{value:"What's Happening During the Installation",id:"whats-happening-during-the-installation",level:3},{value:"Cert-Manager",id:"cert-manager",level:4},{value:"a8s PostgreSQL",id:"a8s-postgresql",level:4},{value:"Step 2: Creating a PostgreSQL Cluster",id:"step-2-creating-a-postgresql-cluster",level:2},{value:"Inspecting the Service Instance",id:"inspecting-the-service-instance",level:3},{value:"Step 3: Creating a Service Binding",id:"step-3-creating-a-service-binding",level:2},{value:"Step 4: Deploying a Demo Application",id:"step-4-deploying-a-demo-application",level:2},{value:"Step 5: Interacting with PostgreSQL",id:"step-5-interacting-with-postgresql",level:2},{value:"Applying a Local SQL File",id:"applying-a-local-sql-file",level:3},{value:"Applying an SQL String",id:"applying-an-sql-string",level:3},{value:"Step 6: Creating and Restoring a Backup",id:"step-6-creating-and-restoring-a-backup",level:2},{value:"Creating a Backup",id:"creating-a-backup",level:3},{value:"Restoring a Backup",id:"restoring-a-backup",level:3},{value:"Congratulations",id:"congratulations",level:2},{value:"What to do next?",id:"what-to-do-next",level:2},{value:"Links",id:"links",level:2}];function d(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"overview",children:"Overview"})}),"\n",(0,a.jsx)(n.h2,{id:"what-you-will-accomplish",children:"What you will accomplish"}),"\n",(0,a.jsxs)(n.p,{children:["In this tutorial you will learn how to ",(0,a.jsx)(n.strong,{children:"create a local Kubernetes cluster"}),", fully equipped ",(0,a.jsx)(n.strong,{children:"with a PostgreSQL"})," operator, ready for you to deploy a PostgreSQL database instance for ",(0,a.jsx)(n.strong,{children:"developing your application"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"what-you-will-learn",children:"What you will learn"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Install the ",(0,a.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"a9s CLI"})]}),"\n",(0,a.jsx)(n.li,{children:"Create a local Kubernetes cluster"}),"\n",(0,a.jsxs)(n.li,{children:["Install ",(0,a.jsx)(n.a,{href:"https://cert-manager.io/docs/",children:"cert-manager"})]}),"\n",(0,a.jsx)(n.li,{children:"Install a8s PostgreSQL"}),"\n",(0,a.jsx)(n.li,{children:"Create a PostgreSQL database instance"}),"\n",(0,a.jsx)(n.li,{children:"Create a PostgreSQL user"}),"\n",(0,a.jsx)(n.li,{children:"Connect to the PostgreSQL database"}),"\n",(0,a.jsx)(n.li,{children:"Deploy a demo application"}),"\n",(0,a.jsx)(n.li,{children:"Connect the application to the PostgreSQL database"}),"\n",(0,a.jsx)(n.li,{children:"Create a backup"}),"\n",(0,a.jsx)(n.li,{children:"Restore a backup"}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["MacOS / Linux","\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Other platforms, including Windows, may work but are currently untested."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://www.docker.com/",children:"Docker"})}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://minikube.sigs.k8s.io/docs/start/",children:"Minikube"})," or ",(0,a.jsx)(n.a,{href:"https://kind.sigs.k8s.io/",children:"Kind"})]}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"a9s CLI"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://kubernetes.io/docs/reference/kubectl/",children:"Kubectl"})}),"\n",(0,a.jsx)(n.li,{children:"Optional for backup/restore: AWS S3 Bucket with credentials"}),"\n"]}),"\n",(0,a.jsx)(n.h1,{id:"implementation",children:"Implementation"}),"\n",(0,a.jsxs)(n.p,{children:["In this tutorial you will be using the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI to facilitate the creation of both a local Kubernetes cluster and a PostgreSQL database instance."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"a9s"})," CLI will guide you through the process while providing you with transparency and ability to set your own pace. Transparency means that you will see the exact commands to be executed. By default, the commands are executed only after you have confirmed the execution by pressing the ",(0,a.jsx)(n.code,{children:"ENTER"})," key. This allows you to have a closer look at the command and/or the YAML specifications to understand what the current step in the tutorial is about. If all you care about is the result, the ",(0,a.jsx)(n.code,{children:"--yes"})," option will answer all yes-no questions with yes. See ",(0,a.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"[1]"})," for documentation and source code of the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI."]}),"\n",(0,a.jsx)(n.h2,{id:"step-1-creating-a-kubernetes-cluster-with-a8s-postgresql",children:"Step 1: Creating a Kubernetes Cluster with a8s PostgreSQL"}),"\n",(0,a.jsx)(n.p,{children:"In this section you will create a Kubernetes cluster with a8s PostgreSQL and all its dependencies:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create cluster a8s\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Per default, ",(0,a.jsx)(n.code,{children:"minikube"})," will be used. In case you prefer ",(0,a.jsx)(n.code,{children:"kind"})," you can use the ",(0,a.jsx)(n.code,{children:"--provider"})," option:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create cluster a8s --provider kind\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The remainder of the tutorial works equally for both ",(0,a.jsx)(n.code,{children:"minikube"})," and ",(0,a.jsx)(n.code,{children:"kind"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"step-11-initial-configuration-on-the-first-a9s-create-cluster-execution",children:"Step 1.1: Initial Configuration on the First a9s create cluster Execution"}),"\n",(0,a.jsx)(n.p,{children:"When creating a cluster for the first time, a few setup steps will have to be taken which need to be performed only once:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Setting up a working directory for the use with the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI. ",(0,a.jsx)(n.strong,{children:"This step asks for your confirmation of the proposed directory."})]}),"\n",(0,a.jsx)(n.li,{children:"Configuring the access credentials for the S3 compatible object store which is needed to use the backup/restore feature of a8s Postgres. This step is performed automatically."}),"\n",(0,a.jsxs)(n.li,{children:["Cloning deployment resources required by the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI to create a cluster. This step is performed automatically."]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"whats-happening-during-the-installation",children:"What's Happening During the Installation"}),"\n",(0,a.jsx)(n.p,{children:"After the initial configuration, the Kubernetes cluster is being created."}),"\n",(0,a.jsx)(n.h4,{id:"cert-manager",children:"Cert-Manager"}),"\n",(0,a.jsxs)(n.p,{children:["Once the Kubernetes cluster is ready, the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI proceeds with the installation of the ",(0,a.jsx)(n.a,{href:"https://cert-manager.io/docs/",children:"cert-manager"}),". The cert-manager is a Kubernetes extension handling TLS certificates. Among others, in a8s PostgreSQL TSL certificates are used for securing the communication between Kubernetes and the operator."]}),"\n",(0,a.jsx)(n.h4,{id:"a8s-postgresql",children:"a8s PostgreSQL"}),"\n",(0,a.jsxs)(n.p,{children:["With the cert-manager being ready, the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI continues and installs the a8s PostgreSQL components. Namely, this is"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"The PostgreSQL operator"}),"\n",(0,a.jsx)(n.li,{children:"The Service Binding controller"}),"\n",(0,a.jsx)(n.li,{children:"The Backup Manager"}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.strong,{children:"PostgreSQL Operator"})," is responsible for creating and managing ",(0,a.jsx)(n.em,{children:"Service Instances"}),", that is dedicated PostgreSQL servers represented by a single or a cluster of Pods."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.strong,{children:"Service Binding Controller"}),", as the name suggests, is responsible for creating so-called ",(0,a.jsx)(n.em,{children:"Service Bindings"}),". A Service Binding represents ",(0,a.jsx)(n.strong,{children:"a unique set of credentials"})," connecting a database client, such as an application and a Service Instance, in this case a PostgreSQL instance. In the case of a8s PostgreSQL, a Service Binding contains a ",(0,a.jsx)(n.strong,{children:"username/password"})," combination as well as other information necessary to establish a connection such as the ",(0,a.jsx)(n.strong,{children:"hostname"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.strong,{children:"Backup Manager"})," is responsible for managing backup and restore requests and dispatching them to the ",(0,a.jsx)(n.em,{children:"Backup Agents"})," located alongside Postgres Service Instances. It is the Backup Agent of a Service Instance that actually triggers the execution, encryption, compression and streaming of backup and restore operations."]}),"\n",(0,a.jsxs)(n.p,{children:["After ",(0,a.jsx)(n.em,{children:"waiting for a8s Postgres Control Plane to become ready"})," the message ",(0,a.jsx)(n.code,{children:"\ud83c\udf89 The a8s Postgres Control Plane appears to be ready. All expected pods are running."})," indicates that ",(0,a.jsx)(n.strong,{children:"the installation of a8s PostgreSQL was successful"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"step-2-creating-a-postgresql-cluster",children:"Step 2: Creating a PostgreSQL Cluster"}),"\n",(0,a.jsxs)(n.p,{children:["In order to keep all tutorial resources in one place, create a Kubernetes ",(0,a.jsx)(n.code,{children:"tutorial"})," namespace:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl create namespace tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Now that the a8s PostgreSQL Operator and the ",(0,a.jsx)(n.code,{children:"tutorial"})," namespace is ready, it's time to create a database."]}),"\n",(0,a.jsxs)(n.p,{children:["Using the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI the process is as simple as:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create pg instance --name clustered-instance --replicas 3 -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["This creates a clustered PostgreSQL instance named ",(0,a.jsx)(n.code,{children:"clustered-instance"})," represented as a StatefulSet with ",(0,a.jsx)(n.code,{children:"3"})," Pods. Each Pod runs a PostgreSQL process."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Note"}),": The ",(0,a.jsx)(n.code,{children:"a9s CLI"})," does not shield you the YAML specs is generated. Quite the opposite, it is intended to provide you with meaningful templates to start with. ",(0,a.jsxs)(n.strong,{children:["You can find all YAML specs generated by the ",(0,a.jsx)(n.code,{children:"a9s CLI"})," in the ",(0,a.jsx)(n.code,{children:"usermanifests"})," folder in your a9s working directory"]}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"ls $(a9s cluster pwd)/usermanifests\n"})}),"\n",(0,a.jsx)(n.h3,{id:"inspecting-the-service-instance",children:"Inspecting the Service Instance"}),"\n",(0,a.jsx)(n.p,{children:"It's worth inspecting the PostgreSQL Service Instance to see what the a8s PostgreSQL Operator has created:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get postgresqls -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME AGE\nclustered-instance 131m\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"postgresql"})," object named ",(0,a.jsx)(n.code,{children:"clustered-instance"}),", as the name suggests, represents your PostgreSQL instance. It is implemented by a set of Kubernetes Services and a StatefulSet."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get statefulsets -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The operator has created a Kubernetes StatefulSet with the name ",(0,a.jsx)(n.code,{children:"clustered-instance"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME READY AGE\nclustered-instance 3/3 89m\n"})}),"\n",(0,a.jsx)(n.p,{children:"And the StatefulSet, in turn, manages three Pods, namely:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get pods -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"The following Pods:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME READY STATUS RESTARTS AGE\nclustered-instance-0 3/3 Running 0 70m\nclustered-instance-1 3/3 Running 0 68m\nclustered-instance-2 3/3 Running 0 66m\n"})}),"\n",(0,a.jsx)(n.p,{children:"Have a closer look at one of them:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl describe pod clustered-instance-0 -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Especially, look at the ",(0,a.jsx)(n.code,{children:"Labels"})," section in the output:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"Name: clustered-instance-0\nNamespace: tutorial\nPriority: 0\nService Account: clustered-instance\nNode: a8s-demo-m02/192.168.58.3\nStart Time: Tue, 12 Mar 2024 08:15:39 +0100\nLabels: a8s.a9s/dsi-group=postgresql.anynines.com\n a8s.a9s/dsi-kind=Postgresql\n a8s.a9s/dsi-name=clustered-instance\n a8s.a9s/replication-role=master\n apps.kubernetes.io/pod-index=0\n controller-revision-hash=clustered-instance-749699f5b9\n statefulset.kubernetes.io/pod-name=clustered-instance-0\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The label ",(0,a.jsx)(n.code,{children:"a8s.a9s/replication-role=master"})," indicates that the Pod ",(0,a.jsx)(n.code,{children:"clustered-instance-0"})," is the ",(0,a.jsx)(n.strong,{children:"primary"})," PostgreSQL server for the asynchronous streaming replication within the cluster. Don't worry if you are not familiar with this terminology. Just bare in mind that ",(0,a.jsx)(n.strong,{children:"all data altering SQL statements always need to go to the primary Pod"}),". There's a mechanism in place that will help with this."]}),"\n",(0,a.jsx)(n.p,{children:"By executing:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get services -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["You will see a ",(0,a.jsx)(n.code,{children:"clustered-instance-master"})," Kubernetes service:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nclustered-instance-config ClusterIP None 74m\nclustered-instance-master ClusterIP 10.105.7.211 5432/TCP,8008/TCP 75m\n"})}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsxs)(n.strong,{children:["The ",(0,a.jsx)(n.code,{children:"clustered-instance-master"})," service provides a reference to the primary PostgreSQL server within the clustered Service Instance"]}),". As the cluster comes with failure-detection and automatic failover capabilities, the primary role may be assigned to another Pod in the cluster during leading election. However, the ",(0,a.jsx)(n.code,{children:"clustered-instance-master"})," service will be updated so that any application connecting through the ",(0,a.jsx)(n.code,{children:"clustered-instance-master"})," service automatically connects to the ",(0,a.jsx)(n.strong,{children:"current"})," primary."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Congratulations \ud83c\udf89"}),", you've managed to create yourself a highly available PostgreSQL cluster using asynchronous streaming replication."]}),"\n",(0,a.jsx)(n.h2,{id:"step-3-creating-a-service-binding",children:"Step 3: Creating a Service Binding"}),"\n",(0,a.jsxs)(n.p,{children:["In order to prepare the deployment of an application, the database need to be configured to ",(0,a.jsx)(n.strong,{children:"grant the application access to the PostgreSQL service instance"}),". Granting an application running in Kubernetes access to a PostgreSQL database involves the following steps:"]}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Create a unique set of access credentials including a database role as well as a corresponding password."}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Creating a Kubernetes Secret containing the credentials."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"The credential set should be unique to the application and the data service instance. So if a second application, such as a worker process, needs access, a separate credential set and Kubernetes Secret is to be created."}),"\n",(0,a.jsxs)(n.p,{children:["With a8s PostgreSQL the process of creating access credentials on-demand is referred to as creating ",(0,a.jsx)(n.em,{children:"Service Bindings"}),". In other words, ",(0,a.jsx)(n.strong,{children:"a Service Binding in a8s PostgreSQL is a database role, password which is then stored in a Kubernetes Secret"})," to be used by exactly one application."]}),"\n",(0,a.jsxs)(n.p,{children:["Think about the implication of managing Service Bindings using the Kubernetes API. Instead of writing custom scripts connecting to the database, the creation of a database user is as simple as creating a Kubernetes object. Therefore, ",(0,a.jsx)(n.strong,{children:"Service Bindings facilitate deployments to multiple Kubernetes environments describing application systems entirely using Kubernetes objects"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"Creating a Service Binding is easy:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create pg servicebinding --name sb-sample -n tutorial -i clustered-instance\n"})}),"\n",(0,a.jsx)(n.p,{children:"Have a look at the resources that have been generated:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get servicebindings -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME AGE\nsb-sample 6s\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"servicebinding"})," object named ",(0,a.jsx)(n.code,{children:"sb-sample"})," is owned by the a8s PostgreSQL Operator or, more precisely, the ServiceBindingController. As part of the Service Binding, a Kubernetes Secret has been created:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get secrets -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME TYPE DATA AGE\npostgres.credentials.clustered-instance Opaque 2 9m16s\nsb-sample-service-binding Opaque 4 25s\nstandby.credentials.clustered-instance Opaque 2 9m16s\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Investigate the Secret ",(0,a.jsx)(n.code,{children:"sb-sample-service-binding"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get secret sb-sample-service-binding -n tutorial -o yaml\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:'apiVersion: v1\ndata:\n database: YTlzX2FwcHNfZGVmYXVsdF9kYg==\n instance_service: Y2x1c3RlcmVkLWluc3RhbmNlLW1hc3Rlci50dXRvcmlhbA==\n password: bk1wNGI2WHdMeXUwYVkzWmF4ekExS1VURTNzM2xham4=\n username: YThzLXNiLWN4cDZCMFRUQg==\nimmutable: true\nkind: Secret\nmetadata:\n creationTimestamp: "2024-03-12T14:50:33Z"\n finalizers:\n - a8s.anynines.com/servicebinding.controller\n labels:\n service-binding: "true"\n name: sb-sample-service-binding\n namespace: tutorial\n ownerReferences:\n - apiVersion: servicebindings.anynines.com/v1beta3\n blockOwnerDeletion: true\n controller: true\n kind: ServiceBinding\n name: sb-sample\n uid: e4636254-433a-4e82-a46b-e79fd7f25f58\n resourceVersion: "2648"\n uid: ebee4e29-4796-4e9a-8114-ec4d546644a9\ntype: Opaque\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Note that the values in the ",(0,a.jsx)(n.code,{children:"data"})," hash aren't readable right away as they are base64 encoded. Values can be decoded using the ",(0,a.jsx)(n.code,{children:"base64"})," command, for example:"]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.code,{children:"database:"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'echo "YTlzX2FwcHNfZGVmYXVsdF9kYg==" | base64 --decode\na9s_apps_default_db\n'})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.code,{children:"instance_service:"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'echo "Y2x1c3RlcmVkLWluc3RhbmNlLW1hc3Rlci50dXRvcmlhbA==" | base64 --decode\nclustered-instance-master.tutorial\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Given a Service name, the generic naming pattern in Kubernetes to derive its DNS entry is: ",(0,a.jsx)(n.code,{children:"{service-name}.{namespace}.svc.{cluster-domain:cluster.local}"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["Assuming that your Kubernetes' cluster domain is the default ",(0,a.jsx)(n.code,{children:"cluster.local"}),", this means that the primary (formerly master) node of your PostgreSQL cluster is reachable via the DNS entry: ",(0,a.jsx)(n.strong,{children:(0,a.jsx)(n.code,{children:"clustered-instance-master.tutorial.svc.cluster.local"})}),"."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.code,{children:"username:"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'echo "YThzLXNiLWN4cDZCMFRUQg==" | base64 --decode\na8s-sb-cxp6B0TTB\n'})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.code,{children:"password:"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'echo "bk1wNGI2WHdMeXUwYVkzWmF4ekExS1VURTNzM2xham4=" | base64 --decode\nnMp4b6XwLyu0aY3ZaxzA1KUTE3s3lajn\n'})}),"\n",(0,a.jsxs)(n.p,{children:["As you can see, the secret ",(0,a.jsx)(n.code,{children:"sb-sample-service-binding"})," contains all relevant information required by an application to connect to your PostgreSQL instance."]}),"\n",(0,a.jsx)(n.h2,{id:"step-4-deploying-a-demo-application",children:"Step 4: Deploying a Demo Application"}),"\n",(0,a.jsx)(n.p,{children:"With the PostgreSQL database at hand, an exemplary application can be deployed."}),"\n",(0,a.jsx)(n.p,{children:"The demo app has already been checked out for you. Hence, installing it just a single command away:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl apply -k $(a9s cluster pwd)/a8s-demo/demo-postgresql-app -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"service/demo-app created\ndeployment.apps/demo-app created\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The demo app consists of a Kubernetes Service and a Deployment both named ",(0,a.jsx)(n.code,{children:"demo-app"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"You can verify that the app is running by executing:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get pods -n tutorial -l app=demo-app\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME READY STATUS RESTARTS AGE\ndemo-app-65f6dd4445-glgc4 1/1 Running 0 81s\n"})}),"\n",(0,a.jsxs)(n.p,{children:["In order to access the app locally, create a port forward mapping the container port ",(0,a.jsx)(n.code,{children:"3000"})," your local machine's port ",(0,a.jsx)(n.code,{children:"8080"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl port-forward service/demo-app -n tutorial 8080:3000\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Then navigate your browser to: ",(0,a.jsx)(n.a,{href:"http://localhost:8080",children:"http://localhost:8080"})]}),"\n",(0,a.jsx)(n.h2,{id:"step-5-interacting-with-postgresql",children:"Step 5: Interacting with PostgreSQL"}),"\n",(0,a.jsxs)(n.p,{children:["Once you've created a PostgreSQL Service Instance, you can use the ",(0,a.jsx)(n.code,{children:"a9s CLI"})," to interact with it."]}),"\n",(0,a.jsx)(n.h3,{id:"applying-a-local-sql-file",children:"Applying a Local SQL File"}),"\n",(0,a.jsx)(n.p,{children:"Although not the preferred way to load seed data into a production database, during development it might be handy to execute a SQL file to a PostgreSQL instance. This allows executing one or multiple SQL statements conveniently."}),"\n",(0,a.jsx)(n.p,{children:"Download an exemplary SQL file:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"curl https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/demo_data.sql -o demo_data.sql\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Executing an SQL file is as simple as using the ",(0,a.jsx)(n.code,{children:"--file"})," option:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s pg apply --file demo_data.sql -i clustered-instance -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"a9s CLI"})," will determine the replication leader, upload, execute and delete the SQL file."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"--no-delete"})," option can be used during debugging of erroneous SQL statements\nas the SQL file remains in the PostgreSQL Leader's Pod."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s pg apply --file demo_data.sql -i clustered-instance -n tutorial --no-delete\n"})}),"\n",(0,a.jsx)(n.p,{children:"With the SQL file still available in the Pod, statements can be quickly altered and re-tested."}),"\n",(0,a.jsx)(n.h3,{id:"applying-an-sql-string",children:"Applying an SQL String"}),"\n",(0,a.jsxs)(n.p,{children:["It is also possible to execute a SQL string containing one or several SQL statements by using the ",(0,a.jsx)(n.code,{children:"--sql"})," option:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,a.jsx)(n.p,{children:"The output of the command will be printed on the screen, for example:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"Output from the Pod:\n \ncount \n-------\n 10 \n(1 row)\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Again, the ",(0,a.jsx)(n.code,{children:"pg apply"})," commands are not meant to interact with production databases but may become handy during debugging and local development."]}),"\n",(0,a.jsxs)(n.p,{children:["Be aware that these commands are executed by the privileged ",(0,a.jsx)(n.code,{children:"postgres"})," user. Schemas (tables) created by the ",(0,a.jsx)(n.code,{children:"postgres"})," user may not be accessible by roles (users) created in conjunction with Service Bindings. You will then have to grant access privileges to the Service Binding role."]}),"\n",(0,a.jsx)(n.h2,{id:"step-6-creating-and-restoring-a-backup",children:"Step 6: Creating and Restoring a Backup"}),"\n",(0,a.jsx)(n.p,{children:"Assuming you have configured the backup store and provided access credentials to an AWS S3 compatible object store, try creating and restoring a backup for your application."}),"\n",(0,a.jsx)(n.h3,{id:"creating-a-backup",children:"Creating a Backup"}),"\n",(0,a.jsx)(n.p,{children:"Creating a backup can be achieved with a single command:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create pg backup --name clustered-backup-1 -i clustered-instance -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"With a closer look at the output you will notice that a backup is also specified by a YAML specification and thus is done in a declarative way. You express that you want a backup to be created:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-YAML",children:"apiVersion: backups.anynines.com/v1beta3\nkind: Backup\nmetadata:\n name: clustered-backup-1\n namespace: tutorial\nspec:\n serviceInstance:\n apiGroup: postgresql.anynines.com\n kind: Postgresql\n name: clustered-instance\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The a8s Backup Manager is the responsible for making the backup happen. It does that by locating the Service Instance ",(0,a.jsx)(n.code,{children:"clustered-instance"})," which also runs the ",(0,a.jsx)(n.code,{children:"a8s Backup Agent"}),". This agent is then executing the PostgreSQL backup command and, depending on its configuration, compressing, encrypting and streaming the backup to the backup object store (S3)."]}),"\n",(0,a.jsx)(n.h3,{id:"restoring-a-backup",children:"Restoring a Backup"}),"\n",(0,a.jsxs)(n.p,{children:["In order to experience the value of a backup, simulate a data loss by issueing the following ",(0,a.jsx)(n.code,{children:"DELETE"})," statement:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "DELETE FROM posts"\n'})}),"\n",(0,a.jsx)(n.p,{children:"Verify the destructive effect on your data by counting the number of posts:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,a.jsx)(n.p,{children:"And/or reloading the demo-app."}),"\n",(0,a.jsx)(n.p,{children:"Once you've confirmed that all blog posts are gone, it's time to recover the data from the backup."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create pg restore --name clustered-restore-1 -b clustered-backup-1 -i clustered-instance -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Again, apply the ",(0,a.jsx)(n.code,{children:"COUNT"})," or reload the website to see that the restore has brought back all blog posts."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,a.jsx)(n.p,{children:"Some engineers say that a convenient backup/restore functionality at your disposal improves the quality of sleep by 37% \ud83d\ude09."}),"\n",(0,a.jsx)(n.h2,{id:"congratulations",children:"Congratulations"}),"\n",(0,a.jsx)(n.p,{children:"With just a few commands, you have created a local Kubernetes cluster, installed the a8s PostgreSQL Control Plane including all its dependencies. Furthermore, you have provisioned an PostgreSQL cluster consisting of three Pods providing you with an asynchronous streaming cluster supporting automatic failure detection, lead-election and failover. Deploying the demo application you've also experienced the convenience of Service Bindings and their automatic creation of Kubernetes Secrets. The backup and restore experiment then illustrated how effortless handling a production database can be."}),"\n",(0,a.jsx)(n.p,{children:"Did you every think that running a production database as an application developer with full self-service could be so easy?"}),"\n",(0,a.jsx)(n.h2,{id:"what-to-do-next",children:"What to do next?"}),"\n",(0,a.jsxs)(n.p,{children:["Wait, there's more to it! This hands-on tutorial merely scratched the surface. Did you see that the ",(0,a.jsx)(n.code,{children:"a9s CLI"})," has created many YAML manifests stored in the ",(0,a.jsx)(n.code,{children:"usermanifests"})," folder of your working directory? This is a good place to start tweaking your manifests and start your own experiments."]}),"\n",(0,a.jsx)(n.p,{children:"If you want to learn more about a8s PostgreSQL feel free to have a look at the documentation at TODO."}),"\n",(0,a.jsxs)(n.p,{children:["For more about the ",(0,a.jsx)(n.code,{children:"a9s CLI"})," have a look at ",(0,a.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"https://github.com/anynines/a9s-cli-v2"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"links",children:"Links"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["a9s CLI documentation and source, ",(0,a.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"https://github.com/anynines/a9s-cli-v2"})]}),"\n",(0,a.jsxs)(n.li,{children:["PostgreSQL documentation, Log-Shipping Standby Servers, ",(0,a.jsx)(n.a,{href:"https://www.postgresql.org/docs/current/warm-standby.html",children:"https://www.postgresql.org/docs/current/warm-standby.html"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>c});var t=s(6540);const a={},i=t.createContext(a);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/42ebd64a.76563b23.js b/assets/js/42ebd64a.76563b23.js deleted file mode 100644 index f5b4331..0000000 --- a/assets/js/42ebd64a.76563b23.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[3399],{5592:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>o});var t=s(4848),a=s(8453);const i={id:"hands-on-tutorial-a8s-pg-a9s-cli",title:"Deploying a Demo App using a8s PostgreSQL",tags:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind"],keywords:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind","postgresql","web app"]},r="Overview",c={id:"hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli",title:"Deploying a Demo App using a8s PostgreSQL",description:"What you will accomplish",source:"@site/versioned_docs/version-0.13.1/hands-on-tutorials/a9s-cli-a8s-postgresql.md",sourceDirName:"hands-on-tutorials",slug:"/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli",permalink:"/docs/0.13.1/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli",draft:!1,unlisted:!1,tags:[{inline:!0,label:"a9s hub",permalink:"/docs/0.13.1/tags/a-9-s-hub"},{inline:!0,label:"a9s cli",permalink:"/docs/0.13.1/tags/a-9-s-cli"},{inline:!0,label:"a8s data services",permalink:"/docs/0.13.1/tags/a-8-s-data-services"},{inline:!0,label:"a8s postgres",permalink:"/docs/0.13.1/tags/a-8-s-postgres"},{inline:!0,label:"data service",permalink:"/docs/0.13.1/tags/data-service"},{inline:!0,label:"tutorial",permalink:"/docs/0.13.1/tags/tutorial"},{inline:!0,label:"kubernetes",permalink:"/docs/0.13.1/tags/kubernetes"},{inline:!0,label:"minikube",permalink:"/docs/0.13.1/tags/minikube"},{inline:!0,label:"kind",permalink:"/docs/0.13.1/tags/kind"}],version:"0.13.1",frontMatter:{id:"hands-on-tutorial-a8s-pg-a9s-cli",title:"Deploying a Demo App using a8s PostgreSQL",tags:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind"],keywords:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind","postgresql","web app"]}},l={},o=[{value:"What you will accomplish",id:"what-you-will-accomplish",level:2},{value:"What you will learn",id:"what-you-will-learn",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Creating a Kubernetes Cluster with a8s PostgreSQL",id:"step-1-creating-a-kubernetes-cluster-with-a8s-postgresql",level:2},{value:"Step 1.1: Initial Configuration on the First a9s create cluster Execution",id:"step-11-initial-configuration-on-the-first-a9s-create-cluster-execution",level:3},{value:"What's Happening During the Installation",id:"whats-happening-during-the-installation",level:3},{value:"Cert-Manager",id:"cert-manager",level:4},{value:"a8s PostgreSQL",id:"a8s-postgresql",level:4},{value:"Step 2: Creating a PostgreSQL Cluster",id:"step-2-creating-a-postgresql-cluster",level:2},{value:"Inspecting the Service Instance",id:"inspecting-the-service-instance",level:3},{value:"Step 3: Creating a Service Binding",id:"step-3-creating-a-service-binding",level:2},{value:"Step 4: Deploying a Demo Application",id:"step-4-deploying-a-demo-application",level:2},{value:"Step 5: Interacting with PostgreSQL",id:"step-5-interacting-with-postgresql",level:2},{value:"Applying a Local SQL File",id:"applying-a-local-sql-file",level:3},{value:"Applying an SQL String",id:"applying-an-sql-string",level:3},{value:"Step 6: Creating and Restoring a Backup",id:"step-6-creating-and-restoring-a-backup",level:2},{value:"Creating a Backup",id:"creating-a-backup",level:3},{value:"Restoring a Backup",id:"restoring-a-backup",level:3},{value:"Congratulations",id:"congratulations",level:2},{value:"What to do next?",id:"what-to-do-next",level:2},{value:"Links",id:"links",level:2}];function d(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,t.jsx)(n.h2,{id:"what-you-will-accomplish",children:"What you will accomplish"}),"\n",(0,t.jsxs)(n.p,{children:["In this tutorial you will learn how to ",(0,t.jsx)(n.strong,{children:"create a local Kubernetes cluster"}),", fully equipped ",(0,t.jsx)(n.strong,{children:"with a PostgreSQL"})," operator, ready for you to deploy a PostgreSQL database instance for ",(0,t.jsx)(n.strong,{children:"developing your application"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"what-you-will-learn",children:"What you will learn"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Install the ",(0,t.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"a9s CLI"})]}),"\n",(0,t.jsx)(n.li,{children:"Create a local Kubernetes cluster"}),"\n",(0,t.jsxs)(n.li,{children:["Install ",(0,t.jsx)(n.a,{href:"https://cert-manager.io/docs/",children:"cert-manager"})]}),"\n",(0,t.jsx)(n.li,{children:"Install a8s PostgreSQL"}),"\n",(0,t.jsx)(n.li,{children:"Create a PostgreSQL database instance"}),"\n",(0,t.jsx)(n.li,{children:"Create a PostgreSQL user"}),"\n",(0,t.jsx)(n.li,{children:"Connect to the PostgreSQL database"}),"\n",(0,t.jsx)(n.li,{children:"Deploy a demo application"}),"\n",(0,t.jsx)(n.li,{children:"Connect the application to the PostgreSQL database"}),"\n",(0,t.jsx)(n.li,{children:"Create a backup"}),"\n",(0,t.jsx)(n.li,{children:"Restore a backup"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["MacOS / Linux","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Other platforms, including Windows, may work but are currently untested."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://www.docker.com/",children:"Docker"})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://minikube.sigs.k8s.io/docs/start/",children:"Minikube"})," or ",(0,t.jsx)(n.a,{href:"https://kind.sigs.k8s.io/",children:"Kind"})]}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"a9s CLI"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://kubernetes.io/docs/reference/kubectl/",children:"Kubectl"})}),"\n",(0,t.jsx)(n.li,{children:"Optional for backup/restore: AWS S3 Bucket with credentials"}),"\n"]}),"\n",(0,t.jsx)(n.h1,{id:"implementation",children:"Implementation"}),"\n",(0,t.jsxs)(n.p,{children:["In this tutorial you will be using the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI to facilitate the creation of both a local Kubernetes cluster and a PostgreSQL database instance."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"a9s"})," CLI will guide you through the process while providing you with transparency and ability to set your own pace. Transparency means that you will see the exact commands to be executed. By default, the commands are executed only after you have confirmed the execution by pressing the ",(0,t.jsx)(n.code,{children:"ENTER"})," key. This allows you to have a closer look at the command and/or the YAML specifications to understand what the current step in the tutorial is about. If all you care about is the result, the ",(0,t.jsx)(n.code,{children:"--yes"})," option will answer all yes-no questions with yes. See ",(0,t.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"[1]"})," for documentation and source code of the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI."]}),"\n",(0,t.jsx)(n.h2,{id:"step-1-creating-a-kubernetes-cluster-with-a8s-postgresql",children:"Step 1: Creating a Kubernetes Cluster with a8s PostgreSQL"}),"\n",(0,t.jsx)(n.p,{children:"In this section you will create a Kubernetes cluster with a8s PostgreSQL and all its dependencies:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create cluster a8s\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Per default, ",(0,t.jsx)(n.code,{children:"minikube"})," will be used. In case you prefer ",(0,t.jsx)(n.code,{children:"kind"})," you can use the ",(0,t.jsx)(n.code,{children:"--provider"})," option:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create cluster a8s --provider kind\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The remainder of the tutorial works equally for both ",(0,t.jsx)(n.code,{children:"minikube"})," and ",(0,t.jsx)(n.code,{children:"kind"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"step-11-initial-configuration-on-the-first-a9s-create-cluster-execution",children:"Step 1.1: Initial Configuration on the First a9s create cluster Execution"}),"\n",(0,t.jsx)(n.p,{children:"When creating a cluster for the first time, a few setup steps will have to be taken which need to be performed only once:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Setting up a working directory for the use with the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI. ",(0,t.jsx)(n.strong,{children:"This step asks for your confirmation of the proposed directory."})]}),"\n",(0,t.jsx)(n.li,{children:"Configuring the access credentials for the S3 compatible object store which is needed to use the backup/restore feature of a8s Postgres. This step is performed automatically."}),"\n",(0,t.jsxs)(n.li,{children:["Cloning deployment resources required by the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI to create a cluster. This step is performed automatically."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"whats-happening-during-the-installation",children:"What's Happening During the Installation"}),"\n",(0,t.jsx)(n.p,{children:"After the initial configuration, the Kubernetes cluster is being created."}),"\n",(0,t.jsx)(n.h4,{id:"cert-manager",children:"Cert-Manager"}),"\n",(0,t.jsxs)(n.p,{children:["Once the Kubernetes cluster is ready, the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI proceeds with the installation of the ",(0,t.jsx)(n.a,{href:"https://cert-manager.io/docs/",children:"cert-manager"}),". The cert-manager is a Kubernetes extension handling TLS certificates. Among others, in a8s PostgreSQL TSL certificates are used for securing the communication between Kubernetes and the operator."]}),"\n",(0,t.jsx)(n.h4,{id:"a8s-postgresql",children:"a8s PostgreSQL"}),"\n",(0,t.jsxs)(n.p,{children:["With the cert-manager being ready, the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI continues and installs the a8s PostgreSQL components. Namely, this is"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"The PostgreSQL operator"}),"\n",(0,t.jsx)(n.li,{children:"The Service Binding controller"}),"\n",(0,t.jsx)(n.li,{children:"The Backup Manager"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.strong,{children:"PostgreSQL Operator"})," is responsible for creating and managing ",(0,t.jsx)(n.em,{children:"Service Instances"}),", that is dedicated PostgreSQL servers represented by a single or a cluster of Pods."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.strong,{children:"Service Binding Controller"}),", as the name suggests, is responsible for creating so-called ",(0,t.jsx)(n.em,{children:"Service Bindings"}),". A Service Binding represents ",(0,t.jsx)(n.strong,{children:"a unique set of credentials"})," connecting a database client, such as an application and a Service Instance, in this case a PostgreSQL instance. In the case of a8s PostgreSQL, a Service Binding contains a ",(0,t.jsx)(n.strong,{children:"username/password"})," combination as well as other information necessary to establish a connection such as the ",(0,t.jsx)(n.strong,{children:"hostname"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.strong,{children:"Backup Manager"})," is responsible for managing backup and restore requests and dispatching them to the ",(0,t.jsx)(n.em,{children:"Backup Agents"})," located alongside Postgres Service Instances. It is the Backup Agent of a Service Instance that actually triggers the execution, encryption, compression and streaming of backup and restore operations."]}),"\n",(0,t.jsxs)(n.p,{children:["After ",(0,t.jsx)(n.em,{children:"waiting for a8s Postgres Control Plane to become ready"})," the message ",(0,t.jsx)(n.code,{children:"\ud83c\udf89 The a8s Postgres Control Plane appears to be ready. All expected pods are running."})," indicates that ",(0,t.jsx)(n.strong,{children:"the installation of a8s PostgreSQL was successful"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"step-2-creating-a-postgresql-cluster",children:"Step 2: Creating a PostgreSQL Cluster"}),"\n",(0,t.jsxs)(n.p,{children:["In order to keep all tutorial resources in one place, create a Kubernetes ",(0,t.jsx)(n.code,{children:"tutorial"})," namespace:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl create namespace tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Now that the a8s PostgreSQL Operator and the ",(0,t.jsx)(n.code,{children:"tutorial"})," namespace is ready, it's time to create a database."]}),"\n",(0,t.jsxs)(n.p,{children:["Using the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI the process is as simple as:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create pg instance --name clustered-instance --replicas 3 -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This creates a clustered PostgreSQL instance named ",(0,t.jsx)(n.code,{children:"clustered-instance"})," represented as a StatefulSet with ",(0,t.jsx)(n.code,{children:"3"})," Pods. Each Pod runs a PostgreSQL process."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Note"}),": The ",(0,t.jsx)(n.code,{children:"a9s CLI"})," does not shield you the YAML specs is generated. Quite the opposite, it is intended to provide you with meaningful templates to start with. ",(0,t.jsxs)(n.strong,{children:["You can find all YAML specs generated by the ",(0,t.jsx)(n.code,{children:"a9s CLI"})," in the ",(0,t.jsx)(n.code,{children:"usermanifests"})," folder in your a9s working directory"]}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"ls $(a9s cluster pwd)/usermanifests\n"})}),"\n",(0,t.jsx)(n.h3,{id:"inspecting-the-service-instance",children:"Inspecting the Service Instance"}),"\n",(0,t.jsx)(n.p,{children:"It's worth inspecting the PostgreSQL Service Instance to see what the a8s PostgreSQL Operator has created:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get postgresqls -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME AGE\nclustered-instance 131m\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"postgresql"})," object named ",(0,t.jsx)(n.code,{children:"clustered-instance"}),", as the name suggests, represents your PostgreSQL instance. It is implemented by a set of Kubernetes Services and a StatefulSet."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get statefulsets -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The operator has created a Kubernetes StatefulSet with the name ",(0,t.jsx)(n.code,{children:"clustered-instance"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME READY AGE\nclustered-instance 3/3 89m\n"})}),"\n",(0,t.jsx)(n.p,{children:"And the StatefulSet, in turn, manages three Pods, namely:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get pods -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"The following Pods:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME READY STATUS RESTARTS AGE\nclustered-instance-0 3/3 Running 0 70m\nclustered-instance-1 3/3 Running 0 68m\nclustered-instance-2 3/3 Running 0 66m\n"})}),"\n",(0,t.jsx)(n.p,{children:"Have a closer look at one of them:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl describe pod clustered-instance-0 -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Especially, look at the ",(0,t.jsx)(n.code,{children:"Labels"})," section in the output:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"Name: clustered-instance-0\nNamespace: tutorial\nPriority: 0\nService Account: clustered-instance\nNode: a8s-demo-m02/192.168.58.3\nStart Time: Tue, 12 Mar 2024 08:15:39 +0100\nLabels: a8s.a9s/dsi-group=postgresql.anynines.com\n a8s.a9s/dsi-kind=Postgresql\n a8s.a9s/dsi-name=clustered-instance\n a8s.a9s/replication-role=master\n apps.kubernetes.io/pod-index=0\n controller-revision-hash=clustered-instance-749699f5b9\n statefulset.kubernetes.io/pod-name=clustered-instance-0\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The label ",(0,t.jsx)(n.code,{children:"a8s.a9s/replication-role=master"})," indicates that the Pod ",(0,t.jsx)(n.code,{children:"clustered-instance-0"})," is the ",(0,t.jsx)(n.strong,{children:"primary"})," PostgreSQL server for the asynchronous streaming replication within the cluster. Don't worry if you are not familiar with this terminology. Just bare in mind that ",(0,t.jsx)(n.strong,{children:"all data altering SQL statements always need to go to the primary Pod"}),". There's a mechanism in place that will help with this."]}),"\n",(0,t.jsx)(n.p,{children:"By executing:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get services -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You will see a ",(0,t.jsx)(n.code,{children:"clustered-instance-master"})," Kubernetes service:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nclustered-instance-config ClusterIP None 74m\nclustered-instance-master ClusterIP 10.105.7.211 5432/TCP,8008/TCP 75m\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsxs)(n.strong,{children:["The ",(0,t.jsx)(n.code,{children:"clustered-instance-master"})," service provides a reference to the primary PostgreSQL server within the clustered Service Instance"]}),". As the cluster comes with failure-detection and automatic failover capabilities, the primary role may be assigned to another Pod in the cluster during leading election. However, the ",(0,t.jsx)(n.code,{children:"clustered-instance-master"})," service will be updated so that any application connecting through the ",(0,t.jsx)(n.code,{children:"clustered-instance-master"})," service automatically connects to the ",(0,t.jsx)(n.strong,{children:"current"})," primary."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Congratulations \ud83c\udf89"}),", you've managed to create yourself a highly available PostgreSQL cluster using asynchronous streaming replication."]}),"\n",(0,t.jsx)(n.h2,{id:"step-3-creating-a-service-binding",children:"Step 3: Creating a Service Binding"}),"\n",(0,t.jsxs)(n.p,{children:["In order to prepare the deployment of an application, the database need to be configured to ",(0,t.jsx)(n.strong,{children:"grant the application access to the PostgreSQL service instance"}),". Granting an application running in Kubernetes access to a PostgreSQL database involves the following steps:"]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Create a unique set of access credentials including a database role as well as a corresponding password."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Creating a Kubernetes Secret containing the credentials."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The credential set should be unique to the application and the data service instance. So if a second application, such as a worker process, needs access, a separate credential set and Kubernetes Secret is to be created."}),"\n",(0,t.jsxs)(n.p,{children:["With a8s PostgreSQL the process of creating access credentials on-demand is referred to as creating ",(0,t.jsx)(n.em,{children:"Service Bindings"}),". In other words, ",(0,t.jsx)(n.strong,{children:"a Service Binding in a8s PostgreSQL is a database role, password which is then stored in a Kubernetes Secret"})," to be used by exactly one application."]}),"\n",(0,t.jsxs)(n.p,{children:["Think about the implication of managing Service Bindings using the Kubernetes API. Instead of writing custom scripts connecting to the database, the creation of a database user is as simple as creating a Kubernetes object. Therefore, ",(0,t.jsx)(n.strong,{children:"Service Bindings facilitate deployments to multiple Kubernetes environments describing application systems entirely using Kubernetes objects"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Creating a Service Binding is easy:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create pg servicebinding --name sb-sample -n tutorial -i clustered-instance\n"})}),"\n",(0,t.jsx)(n.p,{children:"Have a look at the resources that have been generated:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get servicebindings -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME AGE\nsb-sample 6s\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"servicebinding"})," object named ",(0,t.jsx)(n.code,{children:"sb-sample"})," is owned by the a8s PostgreSQL Operator or, more precisely, the ServiceBindingController. As part of the Service Binding, a Kubernetes Secret has been created:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get secrets -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME TYPE DATA AGE\npostgres.credentials.clustered-instance Opaque 2 9m16s\nsb-sample-service-binding Opaque 4 25s\nstandby.credentials.clustered-instance Opaque 2 9m16s\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Investigate the Secret ",(0,t.jsx)(n.code,{children:"sb-sample-service-binding"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get secret sb-sample-service-binding -n tutorial -o yaml\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'apiVersion: v1\ndata:\n database: YTlzX2FwcHNfZGVmYXVsdF9kYg==\n instance_service: Y2x1c3RlcmVkLWluc3RhbmNlLW1hc3Rlci50dXRvcmlhbA==\n password: bk1wNGI2WHdMeXUwYVkzWmF4ekExS1VURTNzM2xham4=\n username: YThzLXNiLWN4cDZCMFRUQg==\nimmutable: true\nkind: Secret\nmetadata:\n creationTimestamp: "2024-03-12T14:50:33Z"\n finalizers:\n - a8s.anynines.com/servicebinding.controller\n labels:\n service-binding: "true"\n name: sb-sample-service-binding\n namespace: tutorial\n ownerReferences:\n - apiVersion: servicebindings.anynines.com/v1beta3\n blockOwnerDeletion: true\n controller: true\n kind: ServiceBinding\n name: sb-sample\n uid: e4636254-433a-4e82-a46b-e79fd7f25f58\n resourceVersion: "2648"\n uid: ebee4e29-4796-4e9a-8114-ec4d546644a9\ntype: Opaque\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Note that the values in the ",(0,t.jsx)(n.code,{children:"data"})," hash aren't readable right away as they are base64 encoded. Values can be decoded using the ",(0,t.jsx)(n.code,{children:"base64"})," command, for example:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"database:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'echo "YTlzX2FwcHNfZGVmYXVsdF9kYg==" | base64 --decode\na9s_apps_default_db\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"instance_service:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'echo "Y2x1c3RlcmVkLWluc3RhbmNlLW1hc3Rlci50dXRvcmlhbA==" | base64 --decode\nclustered-instance-master.tutorial\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Given a Service name, the generic naming pattern in Kubernetes to derive its DNS entry is: ",(0,t.jsx)(n.code,{children:"{service-name}.{namespace}.svc.{cluster-domain:cluster.local}"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Assuming that your Kubernetes' cluster domain is the default ",(0,t.jsx)(n.code,{children:"cluster.local"}),", this means that the primary (formerly master) node of your PostgreSQL cluster is reachable via the DNS entry: ",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"clustered-instance-master.tutorial.svc.cluster.local"})}),"."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"username:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'echo "YThzLXNiLWN4cDZCMFRUQg==" | base64 --decode\na8s-sb-cxp6B0TTB\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"password:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'echo "bk1wNGI2WHdMeXUwYVkzWmF4ekExS1VURTNzM2xham4=" | base64 --decode\nnMp4b6XwLyu0aY3ZaxzA1KUTE3s3lajn\n'})}),"\n",(0,t.jsxs)(n.p,{children:["As you can see, the secret ",(0,t.jsx)(n.code,{children:"sb-sample-service-binding"})," contains all relevant information required by an application to connect to your PostgreSQL instance."]}),"\n",(0,t.jsx)(n.h2,{id:"step-4-deploying-a-demo-application",children:"Step 4: Deploying a Demo Application"}),"\n",(0,t.jsx)(n.p,{children:"With the PostgreSQL database at hand, an exemplary application can be deployed."}),"\n",(0,t.jsx)(n.p,{children:"The demo app has already been checked out for you. Hence, installing it just a single command away:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl apply -k $(a9s cluster pwd)/a8s-demo/demo-postgresql-app -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"service/demo-app created\ndeployment.apps/demo-app created\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The demo app consists of a Kubernetes Service and a Deployment both named ",(0,t.jsx)(n.code,{children:"demo-app"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"You can verify that the app is running by executing:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get pods -n tutorial -l app=demo-app\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME READY STATUS RESTARTS AGE\ndemo-app-65f6dd4445-glgc4 1/1 Running 0 81s\n"})}),"\n",(0,t.jsxs)(n.p,{children:["In order to access the app locally, create a port forward mapping the container port ",(0,t.jsx)(n.code,{children:"3000"})," your local machine's port ",(0,t.jsx)(n.code,{children:"8080"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl port-forward service/demo-app -n tutorial 8080:3000\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Then navigate your browser to: ",(0,t.jsx)(n.a,{href:"http://localhost:8080",children:"http://localhost:8080"})]}),"\n",(0,t.jsx)(n.h2,{id:"step-5-interacting-with-postgresql",children:"Step 5: Interacting with PostgreSQL"}),"\n",(0,t.jsxs)(n.p,{children:["Once you've created a PostgreSQL Service Instance, you can use the ",(0,t.jsx)(n.code,{children:"a9s CLI"})," to interact with it."]}),"\n",(0,t.jsx)(n.h3,{id:"applying-a-local-sql-file",children:"Applying a Local SQL File"}),"\n",(0,t.jsx)(n.p,{children:"Although not the preferred way to load seed data into a production database, during development it might be handy to execute a SQL file to a PostgreSQL instance. This allows executing one or multiple SQL statements conveniently."}),"\n",(0,t.jsx)(n.p,{children:"Download an exemplary SQL file:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"curl https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/demo_data.sql -o demo_data.sql\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Executing an SQL file is as simple as using the ",(0,t.jsx)(n.code,{children:"--file"})," option:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s pg apply --file demo_data.sql -i clustered-instance -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"a9s CLI"})," will determine the replication leader, upload, execute and delete the SQL file."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"--no-delete"})," option can be used during debugging of erroneous SQL statements\nas the SQL file remains in the PostgreSQL Leader's Pod."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s pg apply --file demo_data.sql -i clustered-instance -n tutorial --no-delete\n"})}),"\n",(0,t.jsx)(n.p,{children:"With the SQL file still available in the Pod, statements can be quickly altered and re-tested."}),"\n",(0,t.jsx)(n.h3,{id:"applying-an-sql-string",children:"Applying an SQL String"}),"\n",(0,t.jsxs)(n.p,{children:["It is also possible to execute a SQL string containing one or several SQL statements by using the ",(0,t.jsx)(n.code,{children:"--sql"})," option:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,t.jsx)(n.p,{children:"The output of the command will be printed on the screen, for example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"Output from the Pod:\n \ncount \n-------\n 10 \n(1 row)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Again, the ",(0,t.jsx)(n.code,{children:"pg apply"})," commands are not meant to interact with production databases but may become handy during debugging and local development."]}),"\n",(0,t.jsxs)(n.p,{children:["Be aware that these commands are executed by the privileged ",(0,t.jsx)(n.code,{children:"postgres"})," user. Schemas (tables) created by the ",(0,t.jsx)(n.code,{children:"postgres"})," user may not be accessible by roles (users) created in conjunction with Service Bindings. You will then have to grant access privileges to the Service Binding role."]}),"\n",(0,t.jsx)(n.h2,{id:"step-6-creating-and-restoring-a-backup",children:"Step 6: Creating and Restoring a Backup"}),"\n",(0,t.jsx)(n.p,{children:"Assuming you have configured the backup store and provided access credentials to an AWS S3 compatible object store, try creating and restoring a backup for your application."}),"\n",(0,t.jsx)(n.h3,{id:"creating-a-backup",children:"Creating a Backup"}),"\n",(0,t.jsx)(n.p,{children:"Creating a backup can be achieved with a single command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create pg backup --name clustered-backup-1 -i clustered-instance -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"With a closer look at the output you will notice that a backup is also specified by a YAML specification and thus is done in a declarative way. You express that you want a backup to be created:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-YAML",children:"apiVersion: backups.anynines.com/v1beta3\nkind: Backup\nmetadata:\n name: clustered-backup-1\n namespace: tutorial\nspec:\n serviceInstance:\n apiGroup: postgresql.anynines.com\n kind: Postgresql\n name: clustered-instance\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The a8s Backup Manager is the responsible for making the backup happen. It does that by locating the Service Instance ",(0,t.jsx)(n.code,{children:"clustered-instance"})," which also runs the ",(0,t.jsx)(n.code,{children:"a8s Backup Agent"}),". This agent is then executing the PostgreSQL backup command and, depending on its configuration, compressing, encrypting and streaming the backup to the backup object store (S3)."]}),"\n",(0,t.jsx)(n.h3,{id:"restoring-a-backup",children:"Restoring a Backup"}),"\n",(0,t.jsxs)(n.p,{children:["In order to experience the value of a backup, simulate a data loss by issueing the following ",(0,t.jsx)(n.code,{children:"DELETE"})," statement:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "DELETE FROM posts"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Verify the destructive effect on your data by counting the number of posts:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,t.jsx)(n.p,{children:"And/or reloading the demo-app."}),"\n",(0,t.jsx)(n.p,{children:"Once you've confirmed that all blog posts are gone, it's time to recover the data from the backup."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create pg restore --name clustered-restore-1 -b clustered-backup-1 -i clustered-instance -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Again, apply the ",(0,t.jsx)(n.code,{children:"COUNT"})," or reload the website to see that the restore has brought back all blog posts."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Some engineers say that a convenient backup/restore functionality at your disposal improves the quality of sleep by 37% \ud83d\ude09."}),"\n",(0,t.jsx)(n.h2,{id:"congratulations",children:"Congratulations"}),"\n",(0,t.jsx)(n.p,{children:"With just a few commands, you have created a local Kubernetes cluster, installed the a8s PostgreSQL Control Plane including all its dependencies. Furthermore, you have provisioned an PostgreSQL cluster consisting of three Pods providing you with an asynchronous streaming cluster supporting automatic failure detection, lead-election and failover. Deploying the demo application you've also experienced the convenience of Service Bindings and their automatic creation of Kubernetes Secrets. The backup and restore experiment then illustrated how effortless handling a production database can be."}),"\n",(0,t.jsx)(n.p,{children:"Did you every think that running a production database as an application developer with full self-service could be so easy?"}),"\n",(0,t.jsx)(n.h2,{id:"what-to-do-next",children:"What to do next?"}),"\n",(0,t.jsxs)(n.p,{children:["Wait, there's more to it! This hands-on tutorial merely scratched the surface. Did you see that the ",(0,t.jsx)(n.code,{children:"a9s CLI"})," has created many YAML manifests stored in the ",(0,t.jsx)(n.code,{children:"usermanifests"})," folder of your working directory? This is a good place to start tweaking your manifests and start your own experiments."]}),"\n",(0,t.jsx)(n.p,{children:"If you want to learn more about a8s PostgreSQL feel free to have a look at the documentation at TODO."}),"\n",(0,t.jsxs)(n.p,{children:["For more about the ",(0,t.jsx)(n.code,{children:"a9s CLI"})," have a look at ",(0,t.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"https://github.com/anynines/a9s-cli-v2"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"links",children:"Links"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["a9s CLI documentation and source, ",(0,t.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"https://github.com/anynines/a9s-cli-v2"})]}),"\n",(0,t.jsxs)(n.li,{children:["PostgreSQL documentation, Log-Shipping Standby Servers, ",(0,t.jsx)(n.a,{href:"https://www.postgresql.org/docs/current/warm-standby.html",children:"https://www.postgresql.org/docs/current/warm-standby.html"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>c});var t=s(6540);const a={},i=t.createContext(a);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5280.45ea6ce1.js b/assets/js/5280.45ea6ce1.js new file mode 100644 index 0000000..7da0263 --- /dev/null +++ b/assets/js/5280.45ea6ce1.js @@ -0,0 +1 @@ +(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[5280],{4182:(e,t,n)=>{"use strict";n.d(t,{A:()=>S});var s=n(6540),o=n(4848);function a(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=s.Children.toArray(e),n=t.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),a=t.filter((e=>e!==n)),c=n?.props.children;return{mdxAdmonitionTitle:c,rest:a.length>0?(0,o.jsx)(o.Fragment,{children:a}):null}}(e.children),a=e.title??t;return{...e,...a&&{title:a},children:n}}var c=n(4164),r=n(3230),i=n(8630);const l="admonition_xJq3",d="admonitionHeading_Gvgb",u="admonitionIcon_Rf37",m="admonitionContent_BuS1";function h(e){let{type:t,className:n,children:s}=e;return(0,o.jsx)("div",{className:(0,c.A)(i.G.common.admonition,i.G.common.admonitionType(t),l,n),children:s})}function p(e){let{icon:t,title:n}=e;return(0,o.jsxs)("div",{className:d,children:[(0,o.jsx)("span",{className:u,children:t}),n]})}function f(e){let{children:t}=e;return t?(0,o.jsx)("div",{className:m,children:t}):null}function x(e){const{type:t,icon:n,title:s,children:a,className:c}=e;return(0,o.jsxs)(h,{type:t,className:c,children:[s||n?(0,o.jsx)(p,{title:s,icon:n}):null,(0,o.jsx)(f,{children:a})]})}function j(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const b={icon:(0,o.jsx)(j,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,o.jsx)(x,{...b,...e,className:(0,c.A)("alert alert--secondary",e.className),children:e.children})}function v(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const y={icon:(0,o.jsx)(v,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function N(e){return(0,o.jsx)(x,{...y,...e,className:(0,c.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,o.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const k={icon:(0,o.jsx)(A,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function B(e){return(0,o.jsx)(x,{...k,...e,className:(0,c.A)("alert alert--info",e.className),children:e.children})}function w(e){return(0,o.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const C={icon:(0,o.jsx)(w,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function E(e){return(0,o.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,o.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const T={icon:(0,o.jsx)(E,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const L={icon:(0,o.jsx)(w,{}),title:(0,o.jsx)(r.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const _={...{note:g,tip:N,info:B,warning:function(e){return(0,o.jsx)(x,{...C,...e,className:(0,c.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,o.jsx)(x,{...T,...e,className:(0,c.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,o.jsx)(g,{title:"secondary",...e}),important:e=>(0,o.jsx)(B,{title:"important",...e}),success:e=>(0,o.jsx)(N,{title:"success",...e}),caution:function(e){return(0,o.jsx)(x,{...L,...e,className:(0,c.A)("alert alert--warning",e.className),children:e.children})}}};function S(e){const t=a(e),n=(s=t.type,_[s]||(console.warn(`No admonition component found for admonition type "${s}". Using Info as fallback.`),_.info));var s;return(0,o.jsx)(n,{...t})}},5659:(e,t,n)=>{"use strict";n.d(t,{A:()=>x});n(6540);var s=n(4164),o=n(3230),a=n(8630),c=n(4783);const r={iconEdit:"iconEdit_Z9Sw"};var i=n(4848);function l(e){let{className:t,...n}=e;return(0,i.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,s.A)(r.iconEdit,t),"aria-hidden":"true",...n,children:(0,i.jsx)("g",{children:(0,i.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function d(e){let{editUrl:t}=e;return(0,i.jsxs)(c.A,{to:t,className:a.G.common.editThisPage,children:[(0,i.jsx)(l,{}),(0,i.jsx)(o.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var u=n(9191);function m(e){let{lastUpdatedAt:t}=e;const n=new Date(t),s=(0,u.i)({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(n);return(0,i.jsx)(o.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,i.jsx)("b",{children:(0,i.jsx)("time",{dateTime:n.toISOString(),itemProp:"dateModified",children:s})})},children:" on {date}"})}function h(e){let{lastUpdatedBy:t}=e;return(0,i.jsx)(o.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,i.jsx)("b",{children:t})},children:" by {user}"})}function p(e){let{lastUpdatedAt:t,lastUpdatedBy:n}=e;return(0,i.jsxs)("span",{className:a.G.common.lastUpdated,children:[(0,i.jsx)(o.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t?(0,i.jsx)(m,{lastUpdatedAt:t}):"",byUser:n?(0,i.jsx)(h,{lastUpdatedBy:n}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const f={lastUpdated:"lastUpdated_JAkA"};function x(e){let{className:t,editUrl:n,lastUpdatedAt:o,lastUpdatedBy:a}=e;return(0,i.jsxs)("div",{className:(0,s.A)("row",t),children:[(0,i.jsx)("div",{className:"col",children:n&&(0,i.jsx)(d,{editUrl:n})}),(0,i.jsx)("div",{className:(0,s.A)("col",f.lastUpdated),children:(o||a)&&(0,i.jsx)(p,{lastUpdatedAt:o,lastUpdatedBy:a})})]})}},5930:(e,t,n)=>{"use strict";n.d(t,{A:()=>ue});var s=n(6540),o=n(8453),a=n(1141),c=n(1062),r=n(4164),i=n(7710),l=n(6957);function d(){const{prism:e}=(0,l.p)(),{colorMode:t}=(0,i.G)(),n=e.theme,s=e.darkTheme||n;return"dark"===t?s:n}var u=n(8630),m=n(8426),h=n.n(m);const p=/title=(? ["'])(?.*?)\1/,f=/\{(? [\d,-]+)\}/,x={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},j={...x,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},b=Object.keys(x);function g(e,t){const n=e.map((e=>{const{start:n,end:s}=j[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${s})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function v(e,t){let n=e.replace(/\n$/,"");const{language:s,magicComments:o,metastring:a}=t;if(a&&f.test(a)){const e=a.match(f).groups.range;if(0===o.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${a}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=o[0].className,s=h()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(s),code:n}}if(void 0===s)return{lineClassNames:{},code:n};const c=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return g(["js","jsBlock"],t);case"jsx":case"tsx":return g(["js","jsBlock","jsx"],t);case"html":return g(["js","jsBlock","html"],t);case"python":case"py":case"bash":return g(["bash"],t);case"markdown":case"md":return g(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return g(["tex"],t);case"lua":case"haskell":case"sql":return g(["lua"],t);case"wasm":return g(["wasm"],t);case"vb":case"vba":case"visual-basic":return g(["vb","rem"],t);case"vbnet":return g(["vbnet","rem"],t);case"batch":return g(["rem"],t);case"basic":return g(["rem","f90"],t);case"fsharp":return g(["js","ml"],t);case"ocaml":case"sml":return g(["ml"],t);case"fortran":return g(["f90"],t);case"cobol":return g(["cobol"],t);default:return g(b,t)}}(s,o),r=n.split("\n"),i=Object.fromEntries(o.map((e=>[e.className,{start:0,range:""}]))),l=Object.fromEntries(o.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),u=Object.fromEntries(o.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let h=0;h void 0!==e));l[t]?i[l[t]].range+=`${h},`:d[t]?i[d[t]].start=h:u[t]&&(i[u[t]].range+=`${i[u[t]].start}-${h-1},`),r.splice(h,1)}n=r.join("\n");const m={};return Object.entries(i).forEach((e=>{let[t,{range:n}]=e;h()(n).forEach((e=>{m[e]??=[],m[e].push(t)}))})),{lineClassNames:m,code:n}}const y="codeBlockContainer_Ckt0";var N=n(4848);function A(e){let{as:t,...n}=e;const s=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[s,o]=e;const a=t[s];a&&"string"==typeof o&&(n[a]=o)})),n}(d());return(0,N.jsx)(t,{...n,style:s,className:(0,r.A)(n.className,y,u.G.common.codeBlock)})}const k={codeBlockContent:"codeBlockContent_biex",codeBlockTitle:"codeBlockTitle_Ktv7",codeBlock:"codeBlock_bY9V",codeBlockStandalone:"codeBlockStandalone_MEMb",codeBlockLines:"codeBlockLines_e6Vv",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_o6Pm",buttonGroup:"buttonGroup__atx"};function B(e){let{children:t,className:n}=e;return(0,N.jsx)(A,{as:"pre",tabIndex:0,className:(0,r.A)(k.codeBlockStandalone,"thin-scrollbar",n),children:(0,N.jsx)("code",{className:k.codeBlockLines,children:t})})}var w=n(4799);const C={attributes:!0,characterData:!0,childList:!0,subtree:!0};function E(e,t){const[n,o]=(0,s.useState)(),a=(0,s.useCallback)((()=>{o(e.current?.closest("[role=tabpanel][hidden]"))}),[e,o]);(0,s.useEffect)((()=>{a()}),[a]),function(e,t,n){void 0===n&&(n=C);const o=(0,w._q)(t),a=(0,w.Be)(n);(0,s.useEffect)((()=>{const t=new MutationObserver(o);return e&&t.observe(e,a),()=>t.disconnect()}),[e,o,a])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),a())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var T=n(1765);const L="codeLine_lJS_",_="codeLineNumber_Tfdd",S="codeLineContent_feaV";function U(e){let{line:t,classNames:n,showLineNumbers:s,getLineProps:o,getTokenProps:a}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const c=o({line:t,className:(0,r.A)(n,s&&L)}),i=t.map(((e,t)=>(0,N.jsx)("span",{...a({token:e})},t)));return(0,N.jsxs)("span",{...c,children:[s?(0,N.jsxs)(N.Fragment,{children:[(0,N.jsx)("span",{className:_}),(0,N.jsx)("span",{className:S,children:i})]}):i,(0,N.jsx)("br",{})]})}var M=n(3230);function z(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function H(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const I={copyButtonCopied:"copyButtonCopied_obH4",copyButtonIcons:"copyButtonIcons_eSgA",copyButtonIcon:"copyButtonIcon_y97N",copyButtonSuccessIcon:"copyButtonSuccessIcon_LjdS"};function R(e){let{code:t,className:n}=e;const[o,a]=(0,s.useState)(!1),c=(0,s.useRef)(void 0),i=(0,s.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const s=document.createElement("textarea"),o=document.activeElement;s.value=e,s.setAttribute("readonly",""),s.style.contain="strict",s.style.position="absolute",s.style.left="-9999px",s.style.fontSize="12pt";const a=document.getSelection(),c=a.rangeCount>0&&a.getRangeAt(0);n.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;let r=!1;try{r=document.execCommand("copy")}catch{}s.remove(),c&&(a.removeAllRanges(),a.addRange(c)),o&&o.focus()}(t),a(!0),c.current=window.setTimeout((()=>{a(!1)}),1e3)}),[t]);return(0,s.useEffect)((()=>()=>window.clearTimeout(c.current)),[]),(0,N.jsx)("button",{type:"button","aria-label":o?(0,M.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,M.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,M.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,r.A)("clean-btn",n,I.copyButton,o&&I.copyButtonCopied),onClick:i,children:(0,N.jsxs)("span",{className:I.copyButtonIcons,"aria-hidden":"true",children:[(0,N.jsx)(z,{className:I.copyButtonIcon}),(0,N.jsx)(H,{className:I.copyButtonSuccessIcon})]})})}function V(e){return(0,N.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,N.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const $="wordWrapButtonIcon_Bwma",D="wordWrapButtonEnabled_EoeP";function P(e){let{className:t,onClick:n,isEnabled:s}=e;const o=(0,M.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,N.jsx)("button",{type:"button",onClick:n,className:(0,r.A)("clean-btn",t,s&&D),"aria-label":o,title:o,children:(0,N.jsx)(V,{className:$,"aria-hidden":"true"})})}function W(e){let{children:t,className:n="",metastring:o,title:a,showLineNumbers:c,language:i}=e;const{prism:{defaultLanguage:u,magicComments:m}}=(0,l.p)(),h=function(e){return e?.toLowerCase()}(i??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??u),f=d(),x=function(){const[e,t]=(0,s.useState)(!1),[n,o]=(0,s.useState)(!1),a=(0,s.useRef)(null),c=(0,s.useCallback)((()=>{const n=a.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[a,e]),r=(0,s.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=a.current,n=e>t||a.current.querySelector("code").hasAttribute("style");o(n)}),[a]);return E(a,r),(0,s.useEffect)((()=>{r()}),[e,r]),(0,s.useEffect)((()=>(window.addEventListener("resize",r,{passive:!0}),()=>{window.removeEventListener("resize",r)})),[r]),{codeBlockRef:a,isEnabled:e,isCodeScrollable:n,toggle:c}}(),j=function(e){return e?.match(p)?.groups.title??""}(o)||a,{lineClassNames:b,code:g}=v(t,{metastring:o,language:h,magicComments:m}),y=c??function(e){return Boolean(e?.includes("showLineNumbers"))}(o);return(0,N.jsxs)(A,{as:"div",className:(0,r.A)(n,h&&!n.includes(`language-${h}`)&&`language-${h}`),children:[j&&(0,N.jsx)("div",{className:k.codeBlockTitle,children:j}),(0,N.jsxs)("div",{className:k.codeBlockContent,children:[(0,N.jsx)(T.f4,{theme:f,code:g,language:h??"text",children:e=>{let{className:t,style:n,tokens:s,getLineProps:o,getTokenProps:a}=e;return(0,N.jsx)("pre",{tabIndex:0,ref:x.codeBlockRef,className:(0,r.A)(t,k.codeBlock,"thin-scrollbar"),style:n,children:(0,N.jsx)("code",{className:(0,r.A)(k.codeBlockLines,y&&k.codeBlockLinesWithNumbering),children:s.map(((e,t)=>(0,N.jsx)(U,{line:e,getLineProps:o,getTokenProps:a,classNames:b[t],showLineNumbers:y},t)))})})}}),(0,N.jsxs)("div",{className:k.buttonGroup,children:[(x.isEnabled||x.isCodeScrollable)&&(0,N.jsx)(P,{className:k.codeButton,onClick:()=>x.toggle(),isEnabled:x.isEnabled}),(0,N.jsx)(R,{className:k.codeButton,code:g})]})]})]})}function q(e){let{children:t,...n}=e;const o=(0,c.A)(),a=function(e){return s.Children.toArray(e).some((e=>(0,s.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),r="string"==typeof a?W:B;return(0,N.jsx)(r,{...n,children:a},String(o))}function G(e){return(0,N.jsx)("code",{...e})}var O=n(4783);var F=n(7344),Z=n(4549);const J="details_lb9f",Y="isBrowser_bmU9",K="collapsibleContent_i85q";function Q(e){return!!e&&("SUMMARY"===e.tagName||Q(e.parentElement))}function X(e,t){return!!e&&(e===t||X(e.parentElement,t))}function ee(e){let{summary:t,children:n,...o}=e;(0,F.A)().collectAnchor(o.id);const a=(0,c.A)(),i=(0,s.useRef)(null),{collapsed:l,setCollapsed:d}=(0,Z.u)({initialState:!o.open}),[u,m]=(0,s.useState)(o.open),h=s.isValidElement(t)?t:(0,N.jsx)("summary",{children:t??"Details"});return(0,N.jsxs)("details",{...o,ref:i,open:u,"data-collapsed":l,className:(0,r.A)(J,a&&Y,o.className),onMouseDown:e=>{Q(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;Q(t)&&X(t,i.current)&&(e.preventDefault(),l?(d(!1),m(!0)):d(!0))},children:[h,(0,N.jsx)(Z.N,{lazy:!1,collapsed:l,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{d(e),m(!e)},children:(0,N.jsx)("div",{className:K,children:n})})]})}const te="details_b_Ee";function ne(e){let{...t}=e;return(0,N.jsx)(ee,{...t,className:(0,r.A)("alert alert--info",te,t.className)})}function se(e){const t=s.Children.toArray(e.children),n=t.find((e=>s.isValidElement(e)&&"summary"===e.type)),o=(0,N.jsx)(N.Fragment,{children:t.filter((e=>e!==n))});return(0,N.jsx)(ne,{...e,summary:n,children:o})}var oe=n(5225);function ae(e){return(0,N.jsx)(oe.A,{...e})}const ce="containsTaskList_mC6p";function re(e){if(void 0!==e)return(0,r.A)(e,e?.includes("contains-task-list")&&ce)}const ie="img_ev3q";var le=n(4182);const de={Head:a.A,details:se,Details:se,code:function(e){return function(e){return void 0!==e.children&&s.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))}(e)?(0,N.jsx)(G,{...e}):(0,N.jsx)(q,{...e})},a:function(e){return(0,N.jsx)(O.A,{...e})},pre:function(e){return(0,N.jsx)(N.Fragment,{children:e.children})},ul:function(e){return(0,N.jsx)("ul",{...e,className:re(e.className)})},li:function(e){return(0,F.A)().collectAnchor(e.id),(0,N.jsx)("li",{...e})},img:function(e){return(0,N.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,r.A)(t,ie))});var t},h1:e=>(0,N.jsx)(ae,{as:"h1",...e}),h2:e=>(0,N.jsx)(ae,{as:"h2",...e}),h3:e=>(0,N.jsx)(ae,{as:"h3",...e}),h4:e=>(0,N.jsx)(ae,{as:"h4",...e}),h5:e=>(0,N.jsx)(ae,{as:"h5",...e}),h6:e=>(0,N.jsx)(ae,{as:"h6",...e}),admonition:le.A,mermaid:()=>null};function ue(e){let{children:t}=e;return(0,N.jsx)(o.x,{components:de,children:t})}},9191:(e,t,n)=>{"use strict";n.d(t,{i:()=>o});var s=n(7639);function o(e){void 0===e&&(e={});const{i18n:{currentLocale:t}}=(0,s.A)(),n=function(){const{i18n:{currentLocale:e,localeConfigs:t}}=(0,s.A)();return t[e].calendar}();return new Intl.DateTimeFormat(t,{calendar:n,...e})}},8426:(e,t)=>{function n(e){let t,n=[];for(let s of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(s))n.push(parseInt(s,10));else if(t=s.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,s,o,a]=t;if(s&&a){s=parseInt(s),a=parseInt(a);const e=s{"use strict";n.d(t,{R:()=>c,x:()=>r});var s=n(6540);const o={},a=s.createContext(o);function c(e){const t=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),s.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5676.719cc1ac.js b/assets/js/5676.719cc1ac.js deleted file mode 100644 index 3758757..0000000 --- a/assets/js/5676.719cc1ac.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[5676],{666:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var i=n(4164),s=n(6885),o=n(2067),a=n(4848);function r(e){let{className:t}=e;return(0,a.jsx)("main",{className:(0,i.A)("container margin-vert--xl",t),children:(0,a.jsx)("div",{className:"row",children:(0,a.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,a.jsx)(o.A,{as:"h1",className:"hero__title",children:(0,a.jsx)(s.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,a.jsx)("p",{children:(0,a.jsx)(s.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,a.jsx)("p",{children:(0,a.jsx)(s.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}},5676:(e,t,n)=>{n.r(t),n.d(t,{default:()=>d});n(6540);var i=n(6885),s=n(4714),o=n(1777),a=n(666),r=n(4848);function d(){const e=(0,i.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.be,{title:e}),(0,r.jsx)(o.A,{children:(0,r.jsx)(a.A,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/587d9a20.44a89815.js b/assets/js/587d9a20.44a89815.js deleted file mode 100644 index 647b3b3..0000000 --- a/assets/js/587d9a20.44a89815.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[4829],{9739:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>o});var t=s(4848),a=s(8453);const i={id:"hands-on-tutorial-a8s-pg-a9s-cli",title:"Deploying a Demo App using a8s PostgreSQL",tags:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind"],keywords:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind","postgresql","web app"]},r="Overview",c={id:"hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli",title:"Deploying a Demo App using a8s PostgreSQL",description:"What you will accomplish",source:"@site/docs/hands-on-tutorials/a9s-cli-a8s-postgresql.md",sourceDirName:"hands-on-tutorials",slug:"/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli",permalink:"/docs/develop/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli",draft:!1,unlisted:!1,tags:[{inline:!0,label:"a9s hub",permalink:"/docs/develop/tags/a-9-s-hub"},{inline:!0,label:"a9s cli",permalink:"/docs/develop/tags/a-9-s-cli"},{inline:!0,label:"a8s data services",permalink:"/docs/develop/tags/a-8-s-data-services"},{inline:!0,label:"a8s postgres",permalink:"/docs/develop/tags/a-8-s-postgres"},{inline:!0,label:"data service",permalink:"/docs/develop/tags/data-service"},{inline:!0,label:"tutorial",permalink:"/docs/develop/tags/tutorial"},{inline:!0,label:"kubernetes",permalink:"/docs/develop/tags/kubernetes"},{inline:!0,label:"minikube",permalink:"/docs/develop/tags/minikube"},{inline:!0,label:"kind",permalink:"/docs/develop/tags/kind"}],version:"current",frontMatter:{id:"hands-on-tutorial-a8s-pg-a9s-cli",title:"Deploying a Demo App using a8s PostgreSQL",tags:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind"],keywords:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind","postgresql","web app"]},sidebar:"tutorialSidebar",previous:{title:"Hands-On Tutorials",permalink:"/docs/develop/hands-on-tutorials/"}},l={},o=[{value:"What you will accomplish",id:"what-you-will-accomplish",level:2},{value:"What you will learn",id:"what-you-will-learn",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Creating a Kubernetes Cluster with a8s PostgreSQL",id:"step-1-creating-a-kubernetes-cluster-with-a8s-postgresql",level:2},{value:"Step 1.1: Initial Configuration on the First a9s create cluster Execution",id:"step-11-initial-configuration-on-the-first-a9s-create-cluster-execution",level:3},{value:"What's Happening During the Installation",id:"whats-happening-during-the-installation",level:3},{value:"Cert-Manager",id:"cert-manager",level:4},{value:"a8s PostgreSQL",id:"a8s-postgresql",level:4},{value:"Step 2: Creating a PostgreSQL Cluster",id:"step-2-creating-a-postgresql-cluster",level:2},{value:"Inspecting the Service Instance",id:"inspecting-the-service-instance",level:3},{value:"Step 3: Creating a Service Binding",id:"step-3-creating-a-service-binding",level:2},{value:"Step 4: Deploying a Demo Application",id:"step-4-deploying-a-demo-application",level:2},{value:"Step 5: Interacting with PostgreSQL",id:"step-5-interacting-with-postgresql",level:2},{value:"Applying a Local SQL File",id:"applying-a-local-sql-file",level:3},{value:"Applying an SQL String",id:"applying-an-sql-string",level:3},{value:"Step 6: Creating and Restoring a Backup",id:"step-6-creating-and-restoring-a-backup",level:2},{value:"Creating a Backup",id:"creating-a-backup",level:3},{value:"Restoring a Backup",id:"restoring-a-backup",level:3},{value:"Congratulations",id:"congratulations",level:2},{value:"What to do next?",id:"what-to-do-next",level:2},{value:"Links",id:"links",level:2}];function d(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,t.jsx)(n.h2,{id:"what-you-will-accomplish",children:"What you will accomplish"}),"\n",(0,t.jsxs)(n.p,{children:["In this tutorial you will learn how to ",(0,t.jsx)(n.strong,{children:"create a local Kubernetes cluster"}),", fully equipped ",(0,t.jsx)(n.strong,{children:"with a PostgreSQL"})," operator, ready for you to deploy a PostgreSQL database instance for ",(0,t.jsx)(n.strong,{children:"developing your application"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"what-you-will-learn",children:"What you will learn"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Install the ",(0,t.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"a9s CLI"})]}),"\n",(0,t.jsx)(n.li,{children:"Create a local Kubernetes cluster"}),"\n",(0,t.jsxs)(n.li,{children:["Install ",(0,t.jsx)(n.a,{href:"https://cert-manager.io/docs/",children:"cert-manager"})]}),"\n",(0,t.jsx)(n.li,{children:"Install a8s PostgreSQL"}),"\n",(0,t.jsx)(n.li,{children:"Create a PostgreSQL database instance"}),"\n",(0,t.jsx)(n.li,{children:"Create a PostgreSQL user"}),"\n",(0,t.jsx)(n.li,{children:"Connect to the PostgreSQL database"}),"\n",(0,t.jsx)(n.li,{children:"Deploy a demo application"}),"\n",(0,t.jsx)(n.li,{children:"Connect the application to the PostgreSQL database"}),"\n",(0,t.jsx)(n.li,{children:"Create a backup"}),"\n",(0,t.jsx)(n.li,{children:"Restore a backup"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["MacOS / Linux","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Other platforms, including Windows, may work but are currently untested."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://www.docker.com/",children:"Docker"})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://minikube.sigs.k8s.io/docs/start/",children:"Minikube"})," or ",(0,t.jsx)(n.a,{href:"https://kind.sigs.k8s.io/",children:"Kind"})]}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"a9s CLI"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://kubernetes.io/docs/reference/kubectl/",children:"Kubectl"})}),"\n",(0,t.jsx)(n.li,{children:"Optional for backup/restore: AWS S3 Bucket with credentials"}),"\n"]}),"\n",(0,t.jsx)(n.h1,{id:"implementation",children:"Implementation"}),"\n",(0,t.jsxs)(n.p,{children:["In this tutorial you will be using the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI to facilitate the creation of both a local Kubernetes cluster and a PostgreSQL database instance."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"a9s"})," CLI will guide you through the process while providing you with transparency and ability to set your own pace. Transparency means that you will see the exact commands to be executed. By default, the commands are executed only after you have confirmed the execution by pressing the ",(0,t.jsx)(n.code,{children:"ENTER"})," key. This allows you to have a closer look at the command and/or the YAML specifications to understand what the current step in the tutorial is about. If all you care about is the result, the ",(0,t.jsx)(n.code,{children:"--yes"})," option will answer all yes-no questions with yes. See ",(0,t.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"[1]"})," for documentation and source code of the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI."]}),"\n",(0,t.jsx)(n.h2,{id:"step-1-creating-a-kubernetes-cluster-with-a8s-postgresql",children:"Step 1: Creating a Kubernetes Cluster with a8s PostgreSQL"}),"\n",(0,t.jsx)(n.p,{children:"In this section you will create a Kubernetes cluster with a8s PostgreSQL and all its dependencies:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create cluster a8s\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Per default, ",(0,t.jsx)(n.code,{children:"minikube"})," will be used. In case you prefer ",(0,t.jsx)(n.code,{children:"kind"})," you can use the ",(0,t.jsx)(n.code,{children:"--provider"})," option:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create cluster a8s --provider kind\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The remainder of the tutorial works equally for both ",(0,t.jsx)(n.code,{children:"minikube"})," and ",(0,t.jsx)(n.code,{children:"kind"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"step-11-initial-configuration-on-the-first-a9s-create-cluster-execution",children:"Step 1.1: Initial Configuration on the First a9s create cluster Execution"}),"\n",(0,t.jsx)(n.p,{children:"When creating a cluster for the first time, a few setup steps will have to be taken which need to be performed only once:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Setting up a working directory for the use with the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI. ",(0,t.jsx)(n.strong,{children:"This step asks for your confirmation of the proposed directory."})]}),"\n",(0,t.jsx)(n.li,{children:"Configuring the access credentials for the S3 compatible object store which is needed to use the backup/restore feature of a8s Postgres. This step is performed automatically."}),"\n",(0,t.jsxs)(n.li,{children:["Cloning deployment resources required by the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI to create a cluster. This step is performed automatically."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"whats-happening-during-the-installation",children:"What's Happening During the Installation"}),"\n",(0,t.jsx)(n.p,{children:"After the initial configuration, the Kubernetes cluster is being created."}),"\n",(0,t.jsx)(n.h4,{id:"cert-manager",children:"Cert-Manager"}),"\n",(0,t.jsxs)(n.p,{children:["Once the Kubernetes cluster is ready, the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI proceeds with the installation of the ",(0,t.jsx)(n.a,{href:"https://cert-manager.io/docs/",children:"cert-manager"}),". The cert-manager is a Kubernetes extension handling TLS certificates. Among others, in a8s PostgreSQL TSL certificates are used for securing the communication between Kubernetes and the operator."]}),"\n",(0,t.jsx)(n.h4,{id:"a8s-postgresql",children:"a8s PostgreSQL"}),"\n",(0,t.jsxs)(n.p,{children:["With the cert-manager being ready, the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI continues and installs the a8s PostgreSQL components. Namely, this is"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"The PostgreSQL operator"}),"\n",(0,t.jsx)(n.li,{children:"The Service Binding controller"}),"\n",(0,t.jsx)(n.li,{children:"The Backup Manager"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.strong,{children:"PostgreSQL Operator"})," is responsible for creating and managing ",(0,t.jsx)(n.em,{children:"Service Instances"}),", that is dedicated PostgreSQL servers represented by a single or a cluster of Pods."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.strong,{children:"Service Binding Controller"}),", as the name suggests, is responsible for creating so-called ",(0,t.jsx)(n.em,{children:"Service Bindings"}),". A Service Binding represents ",(0,t.jsx)(n.strong,{children:"a unique set of credentials"})," connecting a database client, such as an application and a Service Instance, in this case a PostgreSQL instance. In the case of a8s PostgreSQL, a Service Binding contains a ",(0,t.jsx)(n.strong,{children:"username/password"})," combination as well as other information necessary to establish a connection such as the ",(0,t.jsx)(n.strong,{children:"hostname"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.strong,{children:"Backup Manager"})," is responsible for managing backup and restore requests and dispatching them to the ",(0,t.jsx)(n.em,{children:"Backup Agents"})," located alongside Postgres Service Instances. It is the Backup Agent of a Service Instance that actually triggers the execution, encryption, compression and streaming of backup and restore operations."]}),"\n",(0,t.jsxs)(n.p,{children:["After ",(0,t.jsx)(n.em,{children:"waiting for a8s Postgres Control Plane to become ready"})," the message ",(0,t.jsx)(n.code,{children:"\ud83c\udf89 The a8s Postgres Control Plane appears to be ready. All expected pods are running."})," indicates that ",(0,t.jsx)(n.strong,{children:"the installation of a8s PostgreSQL was successful"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"step-2-creating-a-postgresql-cluster",children:"Step 2: Creating a PostgreSQL Cluster"}),"\n",(0,t.jsxs)(n.p,{children:["In order to keep all tutorial resources in one place, create a Kubernetes ",(0,t.jsx)(n.code,{children:"tutorial"})," namespace:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl create namespace tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Now that the a8s PostgreSQL Operator and the ",(0,t.jsx)(n.code,{children:"tutorial"})," namespace is ready, it's time to create a database."]}),"\n",(0,t.jsxs)(n.p,{children:["Using the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI the process is as simple as:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create pg instance --name clustered-instance --replicas 3 -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This creates a clustered PostgreSQL instance named ",(0,t.jsx)(n.code,{children:"clustered-instance"})," represented as a StatefulSet with ",(0,t.jsx)(n.code,{children:"3"})," Pods. Each Pod runs a PostgreSQL process."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Note"}),": The ",(0,t.jsx)(n.code,{children:"a9s CLI"})," does not shield you the YAML specs is generated. Quite the opposite, it is intended to provide you with meaningful templates to start with. ",(0,t.jsxs)(n.strong,{children:["You can find all YAML specs generated by the ",(0,t.jsx)(n.code,{children:"a9s CLI"})," in the ",(0,t.jsx)(n.code,{children:"usermanifests"})," folder in your a9s working directory"]}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"ls $(a9s cluster pwd)/usermanifests\n"})}),"\n",(0,t.jsx)(n.h3,{id:"inspecting-the-service-instance",children:"Inspecting the Service Instance"}),"\n",(0,t.jsx)(n.p,{children:"It's worth inspecting the PostgreSQL Service Instance to see what the a8s PostgreSQL Operator has created:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get postgresqls -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME AGE\nclustered-instance 131m\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"postgresql"})," object named ",(0,t.jsx)(n.code,{children:"clustered-instance"}),", as the name suggests, represents your PostgreSQL instance. It is implemented by a set of Kubernetes Services and a StatefulSet."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get statefulsets -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The operator has created a Kubernetes StatefulSet with the name ",(0,t.jsx)(n.code,{children:"clustered-instance"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME READY AGE\nclustered-instance 3/3 89m\n"})}),"\n",(0,t.jsx)(n.p,{children:"And the StatefulSet, in turn, manages three Pods, namely:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get pods -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"The following Pods:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME READY STATUS RESTARTS AGE\nclustered-instance-0 3/3 Running 0 70m\nclustered-instance-1 3/3 Running 0 68m\nclustered-instance-2 3/3 Running 0 66m\n"})}),"\n",(0,t.jsx)(n.p,{children:"Have a closer look at one of them:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl describe pod clustered-instance-0 -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Especially, look at the ",(0,t.jsx)(n.code,{children:"Labels"})," section in the output:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"Name: clustered-instance-0\nNamespace: tutorial\nPriority: 0\nService Account: clustered-instance\nNode: a8s-demo-m02/192.168.58.3\nStart Time: Tue, 12 Mar 2024 08:15:39 +0100\nLabels: a8s.a9s/dsi-group=postgresql.anynines.com\n a8s.a9s/dsi-kind=Postgresql\n a8s.a9s/dsi-name=clustered-instance\n a8s.a9s/replication-role=master\n apps.kubernetes.io/pod-index=0\n controller-revision-hash=clustered-instance-749699f5b9\n statefulset.kubernetes.io/pod-name=clustered-instance-0\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The label ",(0,t.jsx)(n.code,{children:"a8s.a9s/replication-role=master"})," indicates that the Pod ",(0,t.jsx)(n.code,{children:"clustered-instance-0"})," is the ",(0,t.jsx)(n.strong,{children:"primary"})," PostgreSQL server for the asynchronous streaming replication within the cluster. Don't worry if you are not familiar with this terminology. Just bare in mind that ",(0,t.jsx)(n.strong,{children:"all data altering SQL statements always need to go to the primary Pod"}),". There's a mechanism in place that will help with this."]}),"\n",(0,t.jsx)(n.p,{children:"By executing:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get services -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You will see a ",(0,t.jsx)(n.code,{children:"clustered-instance-master"})," Kubernetes service:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nclustered-instance-config ClusterIP None 74m\nclustered-instance-master ClusterIP 10.105.7.211 5432/TCP,8008/TCP 75m\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsxs)(n.strong,{children:["The ",(0,t.jsx)(n.code,{children:"clustered-instance-master"})," service provides a reference to the primary PostgreSQL server within the clustered Service Instance"]}),". As the cluster comes with failure-detection and automatic failover capabilities, the primary role may be assigned to another Pod in the cluster during leading election. However, the ",(0,t.jsx)(n.code,{children:"clustered-instance-master"})," service will be updated so that any application connecting through the ",(0,t.jsx)(n.code,{children:"clustered-instance-master"})," service automatically connects to the ",(0,t.jsx)(n.strong,{children:"current"})," primary."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Congratulations \ud83c\udf89"}),", you've managed to create yourself a highly available PostgreSQL cluster using asynchronous streaming replication."]}),"\n",(0,t.jsx)(n.h2,{id:"step-3-creating-a-service-binding",children:"Step 3: Creating a Service Binding"}),"\n",(0,t.jsxs)(n.p,{children:["In order to prepare the deployment of an application, the database need to be configured to ",(0,t.jsx)(n.strong,{children:"grant the application access to the PostgreSQL service instance"}),". Granting an application running in Kubernetes access to a PostgreSQL database involves the following steps:"]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Create a unique set of access credentials including a database role as well as a corresponding password."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Creating a Kubernetes Secret containing the credentials."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The credential set should be unique to the application and the data service instance. So if a second application, such as a worker process, needs access, a separate credential set and Kubernetes Secret is to be created."}),"\n",(0,t.jsxs)(n.p,{children:["With a8s PostgreSQL the process of creating access credentials on-demand is referred to as creating ",(0,t.jsx)(n.em,{children:"Service Bindings"}),". In other words, ",(0,t.jsx)(n.strong,{children:"a Service Binding in a8s PostgreSQL is a database role, password which is then stored in a Kubernetes Secret"})," to be used by exactly one application."]}),"\n",(0,t.jsxs)(n.p,{children:["Think about the implication of managing Service Bindings using the Kubernetes API. Instead of writing custom scripts connecting to the database, the creation of a database user is as simple as creating a Kubernetes object. Therefore, ",(0,t.jsx)(n.strong,{children:"Service Bindings facilitate deployments to multiple Kubernetes environments describing application systems entirely using Kubernetes objects"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Creating a Service Binding is easy:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create pg servicebinding --name sb-sample -n tutorial -i clustered-instance\n"})}),"\n",(0,t.jsx)(n.p,{children:"Have a look at the resources that have been generated:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get servicebindings -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME AGE\nsb-sample 6s\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"servicebinding"})," object named ",(0,t.jsx)(n.code,{children:"sb-sample"})," is owned by the a8s PostgreSQL Operator or, more precisely, the ServiceBindingController. As part of the Service Binding, a Kubernetes Secret has been created:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get secrets -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME TYPE DATA AGE\npostgres.credentials.clustered-instance Opaque 2 9m16s\nsb-sample-service-binding Opaque 4 25s\nstandby.credentials.clustered-instance Opaque 2 9m16s\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Investigate the Secret ",(0,t.jsx)(n.code,{children:"sb-sample-service-binding"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get secret sb-sample-service-binding -n tutorial -o yaml\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'apiVersion: v1\ndata:\n database: YTlzX2FwcHNfZGVmYXVsdF9kYg==\n instance_service: Y2x1c3RlcmVkLWluc3RhbmNlLW1hc3Rlci50dXRvcmlhbA==\n password: bk1wNGI2WHdMeXUwYVkzWmF4ekExS1VURTNzM2xham4=\n username: YThzLXNiLWN4cDZCMFRUQg==\nimmutable: true\nkind: Secret\nmetadata:\n creationTimestamp: "2024-03-12T14:50:33Z"\n finalizers:\n - a8s.anynines.com/servicebinding.controller\n labels:\n service-binding: "true"\n name: sb-sample-service-binding\n namespace: tutorial\n ownerReferences:\n - apiVersion: servicebindings.anynines.com/v1beta3\n blockOwnerDeletion: true\n controller: true\n kind: ServiceBinding\n name: sb-sample\n uid: e4636254-433a-4e82-a46b-e79fd7f25f58\n resourceVersion: "2648"\n uid: ebee4e29-4796-4e9a-8114-ec4d546644a9\ntype: Opaque\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Note that the values in the ",(0,t.jsx)(n.code,{children:"data"})," hash aren't readable right away as they are base64 encoded. Values can be decoded using the ",(0,t.jsx)(n.code,{children:"base64"})," command, for example:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"database:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'echo "YTlzX2FwcHNfZGVmYXVsdF9kYg==" | base64 --decode\na9s_apps_default_db\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"instance_service:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'echo "Y2x1c3RlcmVkLWluc3RhbmNlLW1hc3Rlci50dXRvcmlhbA==" | base64 --decode\nclustered-instance-master.tutorial\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Given a Service name, the generic naming pattern in Kubernetes to derive its DNS entry is: ",(0,t.jsx)(n.code,{children:"{service-name}.{namespace}.svc.{cluster-domain:cluster.local}"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Assuming that your Kubernetes' cluster domain is the default ",(0,t.jsx)(n.code,{children:"cluster.local"}),", this means that the primary (formerly master) node of your PostgreSQL cluster is reachable via the DNS entry: ",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"clustered-instance-master.tutorial.svc.cluster.local"})}),"."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"username:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'echo "YThzLXNiLWN4cDZCMFRUQg==" | base64 --decode\na8s-sb-cxp6B0TTB\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"password:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'echo "bk1wNGI2WHdMeXUwYVkzWmF4ekExS1VURTNzM2xham4=" | base64 --decode\nnMp4b6XwLyu0aY3ZaxzA1KUTE3s3lajn\n'})}),"\n",(0,t.jsxs)(n.p,{children:["As you can see, the secret ",(0,t.jsx)(n.code,{children:"sb-sample-service-binding"})," contains all relevant information required by an application to connect to your PostgreSQL instance."]}),"\n",(0,t.jsx)(n.h2,{id:"step-4-deploying-a-demo-application",children:"Step 4: Deploying a Demo Application"}),"\n",(0,t.jsx)(n.p,{children:"With the PostgreSQL database at hand, an exemplary application can be deployed."}),"\n",(0,t.jsx)(n.p,{children:"The demo app has already been checked out for you. Hence, installing it just a single command away:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl apply -k $(a9s cluster pwd)/a8s-demo/demo-postgresql-app -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"service/demo-app created\ndeployment.apps/demo-app created\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The demo app consists of a Kubernetes Service and a Deployment both named ",(0,t.jsx)(n.code,{children:"demo-app"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"You can verify that the app is running by executing:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get pods -n tutorial -l app=demo-app\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME READY STATUS RESTARTS AGE\ndemo-app-65f6dd4445-glgc4 1/1 Running 0 81s\n"})}),"\n",(0,t.jsxs)(n.p,{children:["In order to access the app locally, create a port forward mapping the container port ",(0,t.jsx)(n.code,{children:"3000"})," your local machine's port ",(0,t.jsx)(n.code,{children:"8080"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl port-forward service/demo-app -n tutorial 8080:3000\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Then navigate your browser to: ",(0,t.jsx)(n.a,{href:"http://localhost:8080",children:"http://localhost:8080"})]}),"\n",(0,t.jsx)(n.h2,{id:"step-5-interacting-with-postgresql",children:"Step 5: Interacting with PostgreSQL"}),"\n",(0,t.jsxs)(n.p,{children:["Once you've created a PostgreSQL Service Instance, you can use the ",(0,t.jsx)(n.code,{children:"a9s CLI"})," to interact with it."]}),"\n",(0,t.jsx)(n.h3,{id:"applying-a-local-sql-file",children:"Applying a Local SQL File"}),"\n",(0,t.jsx)(n.p,{children:"Although not the preferred way to load seed data into a production database, during development it might be handy to execute a SQL file to a PostgreSQL instance. This allows executing one or multiple SQL statements conveniently."}),"\n",(0,t.jsx)(n.p,{children:"Download an exemplary SQL file:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"curl https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/demo_data.sql -o demo_data.sql\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Executing an SQL file is as simple as using the ",(0,t.jsx)(n.code,{children:"--file"})," option:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s pg apply --file demo_data.sql -i clustered-instance -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"a9s CLI"})," will determine the replication leader, upload, execute and delete the SQL file."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"--no-delete"})," option can be used during debugging of erroneous SQL statements\nas the SQL file remains in the PostgreSQL Leader's Pod."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s pg apply --file demo_data.sql -i clustered-instance -n tutorial --no-delete\n"})}),"\n",(0,t.jsx)(n.p,{children:"With the SQL file still available in the Pod, statements can be quickly altered and re-tested."}),"\n",(0,t.jsx)(n.h3,{id:"applying-an-sql-string",children:"Applying an SQL String"}),"\n",(0,t.jsxs)(n.p,{children:["It is also possible to execute a SQL string containing one or several SQL statements by using the ",(0,t.jsx)(n.code,{children:"--sql"})," option:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,t.jsx)(n.p,{children:"The output of the command will be printed on the screen, for example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"Output from the Pod:\n \ncount \n-------\n 10 \n(1 row)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Again, the ",(0,t.jsx)(n.code,{children:"pg apply"})," commands are not meant to interact with production databases but may become handy during debugging and local development."]}),"\n",(0,t.jsxs)(n.p,{children:["Be aware that these commands are executed by the privileged ",(0,t.jsx)(n.code,{children:"postgres"})," user. Schemas (tables) created by the ",(0,t.jsx)(n.code,{children:"postgres"})," user may not be accessible by roles (users) created in conjunction with Service Bindings. You will then have to grant access privileges to the Service Binding role."]}),"\n",(0,t.jsx)(n.h2,{id:"step-6-creating-and-restoring-a-backup",children:"Step 6: Creating and Restoring a Backup"}),"\n",(0,t.jsx)(n.p,{children:"Assuming you have configured the backup store and provided access credentials to an AWS S3 compatible object store, try creating and restoring a backup for your application."}),"\n",(0,t.jsx)(n.h3,{id:"creating-a-backup",children:"Creating a Backup"}),"\n",(0,t.jsx)(n.p,{children:"Creating a backup can be achieved with a single command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create pg backup --name clustered-backup-1 -i clustered-instance -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"With a closer look at the output you will notice that a backup is also specified by a YAML specification and thus is done in a declarative way. You express that you want a backup to be created:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-YAML",children:"apiVersion: backups.anynines.com/v1beta3\nkind: Backup\nmetadata:\n name: clustered-backup-1\n namespace: tutorial\nspec:\n serviceInstance:\n apiGroup: postgresql.anynines.com\n kind: Postgresql\n name: clustered-instance\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The a8s Backup Manager is the responsible for making the backup happen. It does that by locating the Service Instance ",(0,t.jsx)(n.code,{children:"clustered-instance"})," which also runs the ",(0,t.jsx)(n.code,{children:"a8s Backup Agent"}),". This agent is then executing the PostgreSQL backup command and, depending on its configuration, compressing, encrypting and streaming the backup to the backup object store (S3)."]}),"\n",(0,t.jsx)(n.h3,{id:"restoring-a-backup",children:"Restoring a Backup"}),"\n",(0,t.jsxs)(n.p,{children:["In order to experience the value of a backup, simulate a data loss by issueing the following ",(0,t.jsx)(n.code,{children:"DELETE"})," statement:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "DELETE FROM posts"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Verify the destructive effect on your data by counting the number of posts:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,t.jsx)(n.p,{children:"And/or reloading the demo-app."}),"\n",(0,t.jsx)(n.p,{children:"Once you've confirmed that all blog posts are gone, it's time to recover the data from the backup."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create pg restore --name clustered-restore-1 -b clustered-backup-1 -i clustered-instance -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Again, apply the ",(0,t.jsx)(n.code,{children:"COUNT"})," or reload the website to see that the restore has brought back all blog posts."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Some engineers say that a convenient backup/restore functionality at your disposal improves the quality of sleep by 37% \ud83d\ude09."}),"\n",(0,t.jsx)(n.h2,{id:"congratulations",children:"Congratulations"}),"\n",(0,t.jsx)(n.p,{children:"With just a few commands, you have created a local Kubernetes cluster, installed the a8s PostgreSQL Control Plane including all its dependencies. Furthermore, you have provisioned an PostgreSQL cluster consisting of three Pods providing you with an asynchronous streaming cluster supporting automatic failure detection, lead-election and failover. Deploying the demo application you've also experienced the convenience of Service Bindings and their automatic creation of Kubernetes Secrets. The backup and restore experiment then illustrated how effortless handling a production database can be."}),"\n",(0,t.jsx)(n.p,{children:"Did you every think that running a production database as an application developer with full self-service could be so easy?"}),"\n",(0,t.jsx)(n.h2,{id:"what-to-do-next",children:"What to do next?"}),"\n",(0,t.jsxs)(n.p,{children:["Wait, there's more to it! This hands-on tutorial merely scratched the surface. Did you see that the ",(0,t.jsx)(n.code,{children:"a9s CLI"})," has created many YAML manifests stored in the ",(0,t.jsx)(n.code,{children:"usermanifests"})," folder of your working directory? This is a good place to start tweaking your manifests and start your own experiments."]}),"\n",(0,t.jsx)(n.p,{children:"If you want to learn more about a8s PostgreSQL feel free to have a look at the documentation at TODO."}),"\n",(0,t.jsxs)(n.p,{children:["For more about the ",(0,t.jsx)(n.code,{children:"a9s CLI"})," have a look at ",(0,t.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"https://github.com/anynines/a9s-cli-v2"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"links",children:"Links"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["a9s CLI documentation and source, ",(0,t.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"https://github.com/anynines/a9s-cli-v2"})]}),"\n",(0,t.jsxs)(n.li,{children:["PostgreSQL documentation, Log-Shipping Standby Servers, ",(0,t.jsx)(n.a,{href:"https://www.postgresql.org/docs/current/warm-standby.html",children:"https://www.postgresql.org/docs/current/warm-standby.html"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>c});var t=s(6540);const a={},i=t.createContext(a);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/587d9a20.a41704fe.js b/assets/js/587d9a20.a41704fe.js new file mode 100644 index 0000000..4f5ef68 --- /dev/null +++ b/assets/js/587d9a20.a41704fe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[4829],{657:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","title":"Deploying a Demo App using a8s PostgreSQL","description":"What you will accomplish","source":"@site/docs/hands-on-tutorials/a9s-cli-a8s-postgresql.md","sourceDirName":"hands-on-tutorials","slug":"/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","permalink":"/docs/develop/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","draft":false,"unlisted":false,"tags":[{"inline":true,"label":"a9s hub","permalink":"/docs/develop/tags/a-9-s-hub"},{"inline":true,"label":"a9s cli","permalink":"/docs/develop/tags/a-9-s-cli"},{"inline":true,"label":"a8s data services","permalink":"/docs/develop/tags/a-8-s-data-services"},{"inline":true,"label":"a8s postgres","permalink":"/docs/develop/tags/a-8-s-postgres"},{"inline":true,"label":"data service","permalink":"/docs/develop/tags/data-service"},{"inline":true,"label":"tutorial","permalink":"/docs/develop/tags/tutorial"},{"inline":true,"label":"kubernetes","permalink":"/docs/develop/tags/kubernetes"},{"inline":true,"label":"minikube","permalink":"/docs/develop/tags/minikube"},{"inline":true,"label":"kind","permalink":"/docs/develop/tags/kind"}],"version":"current","frontMatter":{"id":"hands-on-tutorial-a8s-pg-a9s-cli","title":"Deploying a Demo App using a8s PostgreSQL","tags":["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind"],"keywords":["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind","postgresql","web app"]},"sidebar":"tutorialSidebar","previous":{"title":"Hands-On Tutorials","permalink":"/docs/develop/hands-on-tutorials/"}}');var a=s(4848),i=s(8453);const r={id:"hands-on-tutorial-a8s-pg-a9s-cli",title:"Deploying a Demo App using a8s PostgreSQL",tags:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind"],keywords:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind","postgresql","web app"]},c="Overview",l={},o=[{value:"What you will accomplish",id:"what-you-will-accomplish",level:2},{value:"What you will learn",id:"what-you-will-learn",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Creating a Kubernetes Cluster with a8s PostgreSQL",id:"step-1-creating-a-kubernetes-cluster-with-a8s-postgresql",level:2},{value:"Step 1.1: Initial Configuration on the First a9s create cluster Execution",id:"step-11-initial-configuration-on-the-first-a9s-create-cluster-execution",level:3},{value:"What's Happening During the Installation",id:"whats-happening-during-the-installation",level:3},{value:"Cert-Manager",id:"cert-manager",level:4},{value:"a8s PostgreSQL",id:"a8s-postgresql",level:4},{value:"Step 2: Creating a PostgreSQL Cluster",id:"step-2-creating-a-postgresql-cluster",level:2},{value:"Inspecting the Service Instance",id:"inspecting-the-service-instance",level:3},{value:"Step 3: Creating a Service Binding",id:"step-3-creating-a-service-binding",level:2},{value:"Step 4: Deploying a Demo Application",id:"step-4-deploying-a-demo-application",level:2},{value:"Step 5: Interacting with PostgreSQL",id:"step-5-interacting-with-postgresql",level:2},{value:"Applying a Local SQL File",id:"applying-a-local-sql-file",level:3},{value:"Applying an SQL String",id:"applying-an-sql-string",level:3},{value:"Step 6: Creating and Restoring a Backup",id:"step-6-creating-and-restoring-a-backup",level:2},{value:"Creating a Backup",id:"creating-a-backup",level:3},{value:"Restoring a Backup",id:"restoring-a-backup",level:3},{value:"Congratulations",id:"congratulations",level:2},{value:"What to do next?",id:"what-to-do-next",level:2},{value:"Links",id:"links",level:2}];function d(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"overview",children:"Overview"})}),"\n",(0,a.jsx)(n.h2,{id:"what-you-will-accomplish",children:"What you will accomplish"}),"\n",(0,a.jsxs)(n.p,{children:["In this tutorial you will learn how to ",(0,a.jsx)(n.strong,{children:"create a local Kubernetes cluster"}),", fully equipped ",(0,a.jsx)(n.strong,{children:"with a PostgreSQL"})," operator, ready for you to deploy a PostgreSQL database instance for ",(0,a.jsx)(n.strong,{children:"developing your application"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"what-you-will-learn",children:"What you will learn"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Install the ",(0,a.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"a9s CLI"})]}),"\n",(0,a.jsx)(n.li,{children:"Create a local Kubernetes cluster"}),"\n",(0,a.jsxs)(n.li,{children:["Install ",(0,a.jsx)(n.a,{href:"https://cert-manager.io/docs/",children:"cert-manager"})]}),"\n",(0,a.jsx)(n.li,{children:"Install a8s PostgreSQL"}),"\n",(0,a.jsx)(n.li,{children:"Create a PostgreSQL database instance"}),"\n",(0,a.jsx)(n.li,{children:"Create a PostgreSQL user"}),"\n",(0,a.jsx)(n.li,{children:"Connect to the PostgreSQL database"}),"\n",(0,a.jsx)(n.li,{children:"Deploy a demo application"}),"\n",(0,a.jsx)(n.li,{children:"Connect the application to the PostgreSQL database"}),"\n",(0,a.jsx)(n.li,{children:"Create a backup"}),"\n",(0,a.jsx)(n.li,{children:"Restore a backup"}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["MacOS / Linux","\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Other platforms, including Windows, may work but are currently untested."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://www.docker.com/",children:"Docker"})}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://minikube.sigs.k8s.io/docs/start/",children:"Minikube"})," or ",(0,a.jsx)(n.a,{href:"https://kind.sigs.k8s.io/",children:"Kind"})]}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"a9s CLI"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://kubernetes.io/docs/reference/kubectl/",children:"Kubectl"})}),"\n",(0,a.jsx)(n.li,{children:"Optional for backup/restore: AWS S3 Bucket with credentials"}),"\n"]}),"\n",(0,a.jsx)(n.h1,{id:"implementation",children:"Implementation"}),"\n",(0,a.jsxs)(n.p,{children:["In this tutorial you will be using the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI to facilitate the creation of both a local Kubernetes cluster and a PostgreSQL database instance."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"a9s"})," CLI will guide you through the process while providing you with transparency and ability to set your own pace. Transparency means that you will see the exact commands to be executed. By default, the commands are executed only after you have confirmed the execution by pressing the ",(0,a.jsx)(n.code,{children:"ENTER"})," key. This allows you to have a closer look at the command and/or the YAML specifications to understand what the current step in the tutorial is about. If all you care about is the result, the ",(0,a.jsx)(n.code,{children:"--yes"})," option will answer all yes-no questions with yes. See ",(0,a.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"[1]"})," for documentation and source code of the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI."]}),"\n",(0,a.jsx)(n.h2,{id:"step-1-creating-a-kubernetes-cluster-with-a8s-postgresql",children:"Step 1: Creating a Kubernetes Cluster with a8s PostgreSQL"}),"\n",(0,a.jsx)(n.p,{children:"In this section you will create a Kubernetes cluster with a8s PostgreSQL and all its dependencies:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create cluster a8s\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Per default, ",(0,a.jsx)(n.code,{children:"minikube"})," will be used. In case you prefer ",(0,a.jsx)(n.code,{children:"kind"})," you can use the ",(0,a.jsx)(n.code,{children:"--provider"})," option:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create cluster a8s --provider kind\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The remainder of the tutorial works equally for both ",(0,a.jsx)(n.code,{children:"minikube"})," and ",(0,a.jsx)(n.code,{children:"kind"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"step-11-initial-configuration-on-the-first-a9s-create-cluster-execution",children:"Step 1.1: Initial Configuration on the First a9s create cluster Execution"}),"\n",(0,a.jsx)(n.p,{children:"When creating a cluster for the first time, a few setup steps will have to be taken which need to be performed only once:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Setting up a working directory for the use with the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI. ",(0,a.jsx)(n.strong,{children:"This step asks for your confirmation of the proposed directory."})]}),"\n",(0,a.jsx)(n.li,{children:"Configuring the access credentials for the S3 compatible object store which is needed to use the backup/restore feature of a8s Postgres. This step is performed automatically."}),"\n",(0,a.jsxs)(n.li,{children:["Cloning deployment resources required by the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI to create a cluster. This step is performed automatically."]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"whats-happening-during-the-installation",children:"What's Happening During the Installation"}),"\n",(0,a.jsx)(n.p,{children:"After the initial configuration, the Kubernetes cluster is being created."}),"\n",(0,a.jsx)(n.h4,{id:"cert-manager",children:"Cert-Manager"}),"\n",(0,a.jsxs)(n.p,{children:["Once the Kubernetes cluster is ready, the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI proceeds with the installation of the ",(0,a.jsx)(n.a,{href:"https://cert-manager.io/docs/",children:"cert-manager"}),". The cert-manager is a Kubernetes extension handling TLS certificates. Among others, in a8s PostgreSQL TSL certificates are used for securing the communication between Kubernetes and the operator."]}),"\n",(0,a.jsx)(n.h4,{id:"a8s-postgresql",children:"a8s PostgreSQL"}),"\n",(0,a.jsxs)(n.p,{children:["With the cert-manager being ready, the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI continues and installs the a8s PostgreSQL components. Namely, this is"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"The PostgreSQL operator"}),"\n",(0,a.jsx)(n.li,{children:"The Service Binding controller"}),"\n",(0,a.jsx)(n.li,{children:"The Backup Manager"}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.strong,{children:"PostgreSQL Operator"})," is responsible for creating and managing ",(0,a.jsx)(n.em,{children:"Service Instances"}),", that is dedicated PostgreSQL servers represented by a single or a cluster of Pods."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.strong,{children:"Service Binding Controller"}),", as the name suggests, is responsible for creating so-called ",(0,a.jsx)(n.em,{children:"Service Bindings"}),". A Service Binding represents ",(0,a.jsx)(n.strong,{children:"a unique set of credentials"})," connecting a database client, such as an application and a Service Instance, in this case a PostgreSQL instance. In the case of a8s PostgreSQL, a Service Binding contains a ",(0,a.jsx)(n.strong,{children:"username/password"})," combination as well as other information necessary to establish a connection such as the ",(0,a.jsx)(n.strong,{children:"hostname"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.strong,{children:"Backup Manager"})," is responsible for managing backup and restore requests and dispatching them to the ",(0,a.jsx)(n.em,{children:"Backup Agents"})," located alongside Postgres Service Instances. It is the Backup Agent of a Service Instance that actually triggers the execution, encryption, compression and streaming of backup and restore operations."]}),"\n",(0,a.jsxs)(n.p,{children:["After ",(0,a.jsx)(n.em,{children:"waiting for a8s Postgres Control Plane to become ready"})," the message ",(0,a.jsx)(n.code,{children:"\ud83c\udf89 The a8s Postgres Control Plane appears to be ready. All expected pods are running."})," indicates that ",(0,a.jsx)(n.strong,{children:"the installation of a8s PostgreSQL was successful"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"step-2-creating-a-postgresql-cluster",children:"Step 2: Creating a PostgreSQL Cluster"}),"\n",(0,a.jsxs)(n.p,{children:["In order to keep all tutorial resources in one place, create a Kubernetes ",(0,a.jsx)(n.code,{children:"tutorial"})," namespace:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl create namespace tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Now that the a8s PostgreSQL Operator and the ",(0,a.jsx)(n.code,{children:"tutorial"})," namespace is ready, it's time to create a database."]}),"\n",(0,a.jsxs)(n.p,{children:["Using the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI the process is as simple as:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create pg instance --name clustered-instance --replicas 3 -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["This creates a clustered PostgreSQL instance named ",(0,a.jsx)(n.code,{children:"clustered-instance"})," represented as a StatefulSet with ",(0,a.jsx)(n.code,{children:"3"})," Pods. Each Pod runs a PostgreSQL process."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Note"}),": The ",(0,a.jsx)(n.code,{children:"a9s CLI"})," does not shield you the YAML specs is generated. Quite the opposite, it is intended to provide you with meaningful templates to start with. ",(0,a.jsxs)(n.strong,{children:["You can find all YAML specs generated by the ",(0,a.jsx)(n.code,{children:"a9s CLI"})," in the ",(0,a.jsx)(n.code,{children:"usermanifests"})," folder in your a9s working directory"]}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"ls $(a9s cluster pwd)/usermanifests\n"})}),"\n",(0,a.jsx)(n.h3,{id:"inspecting-the-service-instance",children:"Inspecting the Service Instance"}),"\n",(0,a.jsx)(n.p,{children:"It's worth inspecting the PostgreSQL Service Instance to see what the a8s PostgreSQL Operator has created:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get postgresqls -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME AGE\nclustered-instance 131m\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"postgresql"})," object named ",(0,a.jsx)(n.code,{children:"clustered-instance"}),", as the name suggests, represents your PostgreSQL instance. It is implemented by a set of Kubernetes Services and a StatefulSet."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get statefulsets -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The operator has created a Kubernetes StatefulSet with the name ",(0,a.jsx)(n.code,{children:"clustered-instance"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME READY AGE\nclustered-instance 3/3 89m\n"})}),"\n",(0,a.jsx)(n.p,{children:"And the StatefulSet, in turn, manages three Pods, namely:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get pods -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"The following Pods:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME READY STATUS RESTARTS AGE\nclustered-instance-0 3/3 Running 0 70m\nclustered-instance-1 3/3 Running 0 68m\nclustered-instance-2 3/3 Running 0 66m\n"})}),"\n",(0,a.jsx)(n.p,{children:"Have a closer look at one of them:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl describe pod clustered-instance-0 -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Especially, look at the ",(0,a.jsx)(n.code,{children:"Labels"})," section in the output:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"Name: clustered-instance-0\nNamespace: tutorial\nPriority: 0\nService Account: clustered-instance\nNode: a8s-demo-m02/192.168.58.3\nStart Time: Tue, 12 Mar 2024 08:15:39 +0100\nLabels: a8s.a9s/dsi-group=postgresql.anynines.com\n a8s.a9s/dsi-kind=Postgresql\n a8s.a9s/dsi-name=clustered-instance\n a8s.a9s/replication-role=master\n apps.kubernetes.io/pod-index=0\n controller-revision-hash=clustered-instance-749699f5b9\n statefulset.kubernetes.io/pod-name=clustered-instance-0\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The label ",(0,a.jsx)(n.code,{children:"a8s.a9s/replication-role=master"})," indicates that the Pod ",(0,a.jsx)(n.code,{children:"clustered-instance-0"})," is the ",(0,a.jsx)(n.strong,{children:"primary"})," PostgreSQL server for the asynchronous streaming replication within the cluster. Don't worry if you are not familiar with this terminology. Just bare in mind that ",(0,a.jsx)(n.strong,{children:"all data altering SQL statements always need to go to the primary Pod"}),". There's a mechanism in place that will help with this."]}),"\n",(0,a.jsx)(n.p,{children:"By executing:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get services -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["You will see a ",(0,a.jsx)(n.code,{children:"clustered-instance-master"})," Kubernetes service:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nclustered-instance-config ClusterIP None 74m\nclustered-instance-master ClusterIP 10.105.7.211 5432/TCP,8008/TCP 75m\n"})}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsxs)(n.strong,{children:["The ",(0,a.jsx)(n.code,{children:"clustered-instance-master"})," service provides a reference to the primary PostgreSQL server within the clustered Service Instance"]}),". As the cluster comes with failure-detection and automatic failover capabilities, the primary role may be assigned to another Pod in the cluster during leading election. However, the ",(0,a.jsx)(n.code,{children:"clustered-instance-master"})," service will be updated so that any application connecting through the ",(0,a.jsx)(n.code,{children:"clustered-instance-master"})," service automatically connects to the ",(0,a.jsx)(n.strong,{children:"current"})," primary."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Congratulations \ud83c\udf89"}),", you've managed to create yourself a highly available PostgreSQL cluster using asynchronous streaming replication."]}),"\n",(0,a.jsx)(n.h2,{id:"step-3-creating-a-service-binding",children:"Step 3: Creating a Service Binding"}),"\n",(0,a.jsxs)(n.p,{children:["In order to prepare the deployment of an application, the database need to be configured to ",(0,a.jsx)(n.strong,{children:"grant the application access to the PostgreSQL service instance"}),". Granting an application running in Kubernetes access to a PostgreSQL database involves the following steps:"]}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Create a unique set of access credentials including a database role as well as a corresponding password."}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Creating a Kubernetes Secret containing the credentials."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"The credential set should be unique to the application and the data service instance. So if a second application, such as a worker process, needs access, a separate credential set and Kubernetes Secret is to be created."}),"\n",(0,a.jsxs)(n.p,{children:["With a8s PostgreSQL the process of creating access credentials on-demand is referred to as creating ",(0,a.jsx)(n.em,{children:"Service Bindings"}),". In other words, ",(0,a.jsx)(n.strong,{children:"a Service Binding in a8s PostgreSQL is a database role, password which is then stored in a Kubernetes Secret"})," to be used by exactly one application."]}),"\n",(0,a.jsxs)(n.p,{children:["Think about the implication of managing Service Bindings using the Kubernetes API. Instead of writing custom scripts connecting to the database, the creation of a database user is as simple as creating a Kubernetes object. Therefore, ",(0,a.jsx)(n.strong,{children:"Service Bindings facilitate deployments to multiple Kubernetes environments describing application systems entirely using Kubernetes objects"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"Creating a Service Binding is easy:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create pg servicebinding --name sb-sample -n tutorial -i clustered-instance\n"})}),"\n",(0,a.jsx)(n.p,{children:"Have a look at the resources that have been generated:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get servicebindings -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME AGE\nsb-sample 6s\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"servicebinding"})," object named ",(0,a.jsx)(n.code,{children:"sb-sample"})," is owned by the a8s PostgreSQL Operator or, more precisely, the ServiceBindingController. As part of the Service Binding, a Kubernetes Secret has been created:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get secrets -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME TYPE DATA AGE\npostgres.credentials.clustered-instance Opaque 2 9m16s\nsb-sample-service-binding Opaque 4 25s\nstandby.credentials.clustered-instance Opaque 2 9m16s\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Investigate the Secret ",(0,a.jsx)(n.code,{children:"sb-sample-service-binding"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get secret sb-sample-service-binding -n tutorial -o yaml\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:'apiVersion: v1\ndata:\n database: YTlzX2FwcHNfZGVmYXVsdF9kYg==\n instance_service: Y2x1c3RlcmVkLWluc3RhbmNlLW1hc3Rlci50dXRvcmlhbA==\n password: bk1wNGI2WHdMeXUwYVkzWmF4ekExS1VURTNzM2xham4=\n username: YThzLXNiLWN4cDZCMFRUQg==\nimmutable: true\nkind: Secret\nmetadata:\n creationTimestamp: "2024-03-12T14:50:33Z"\n finalizers:\n - a8s.anynines.com/servicebinding.controller\n labels:\n service-binding: "true"\n name: sb-sample-service-binding\n namespace: tutorial\n ownerReferences:\n - apiVersion: servicebindings.anynines.com/v1beta3\n blockOwnerDeletion: true\n controller: true\n kind: ServiceBinding\n name: sb-sample\n uid: e4636254-433a-4e82-a46b-e79fd7f25f58\n resourceVersion: "2648"\n uid: ebee4e29-4796-4e9a-8114-ec4d546644a9\ntype: Opaque\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Note that the values in the ",(0,a.jsx)(n.code,{children:"data"})," hash aren't readable right away as they are base64 encoded. Values can be decoded using the ",(0,a.jsx)(n.code,{children:"base64"})," command, for example:"]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.code,{children:"database:"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'echo "YTlzX2FwcHNfZGVmYXVsdF9kYg==" | base64 --decode\na9s_apps_default_db\n'})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.code,{children:"instance_service:"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'echo "Y2x1c3RlcmVkLWluc3RhbmNlLW1hc3Rlci50dXRvcmlhbA==" | base64 --decode\nclustered-instance-master.tutorial\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Given a Service name, the generic naming pattern in Kubernetes to derive its DNS entry is: ",(0,a.jsx)(n.code,{children:"{service-name}.{namespace}.svc.{cluster-domain:cluster.local}"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["Assuming that your Kubernetes' cluster domain is the default ",(0,a.jsx)(n.code,{children:"cluster.local"}),", this means that the primary (formerly master) node of your PostgreSQL cluster is reachable via the DNS entry: ",(0,a.jsx)(n.strong,{children:(0,a.jsx)(n.code,{children:"clustered-instance-master.tutorial.svc.cluster.local"})}),"."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.code,{children:"username:"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'echo "YThzLXNiLWN4cDZCMFRUQg==" | base64 --decode\na8s-sb-cxp6B0TTB\n'})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.code,{children:"password:"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'echo "bk1wNGI2WHdMeXUwYVkzWmF4ekExS1VURTNzM2xham4=" | base64 --decode\nnMp4b6XwLyu0aY3ZaxzA1KUTE3s3lajn\n'})}),"\n",(0,a.jsxs)(n.p,{children:["As you can see, the secret ",(0,a.jsx)(n.code,{children:"sb-sample-service-binding"})," contains all relevant information required by an application to connect to your PostgreSQL instance."]}),"\n",(0,a.jsx)(n.h2,{id:"step-4-deploying-a-demo-application",children:"Step 4: Deploying a Demo Application"}),"\n",(0,a.jsx)(n.p,{children:"With the PostgreSQL database at hand, an exemplary application can be deployed."}),"\n",(0,a.jsx)(n.p,{children:"The demo app has already been checked out for you. Hence, installing it just a single command away:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl apply -k $(a9s cluster pwd)/a8s-demo/demo-postgresql-app -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"service/demo-app created\ndeployment.apps/demo-app created\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The demo app consists of a Kubernetes Service and a Deployment both named ",(0,a.jsx)(n.code,{children:"demo-app"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"You can verify that the app is running by executing:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get pods -n tutorial -l app=demo-app\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME READY STATUS RESTARTS AGE\ndemo-app-65f6dd4445-glgc4 1/1 Running 0 81s\n"})}),"\n",(0,a.jsxs)(n.p,{children:["In order to access the app locally, create a port forward mapping the container port ",(0,a.jsx)(n.code,{children:"3000"})," your local machine's port ",(0,a.jsx)(n.code,{children:"8080"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl port-forward service/demo-app -n tutorial 8080:3000\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Then navigate your browser to: ",(0,a.jsx)(n.a,{href:"http://localhost:8080",children:"http://localhost:8080"})]}),"\n",(0,a.jsx)(n.h2,{id:"step-5-interacting-with-postgresql",children:"Step 5: Interacting with PostgreSQL"}),"\n",(0,a.jsxs)(n.p,{children:["Once you've created a PostgreSQL Service Instance, you can use the ",(0,a.jsx)(n.code,{children:"a9s CLI"})," to interact with it."]}),"\n",(0,a.jsx)(n.h3,{id:"applying-a-local-sql-file",children:"Applying a Local SQL File"}),"\n",(0,a.jsx)(n.p,{children:"Although not the preferred way to load seed data into a production database, during development it might be handy to execute a SQL file to a PostgreSQL instance. This allows executing one or multiple SQL statements conveniently."}),"\n",(0,a.jsx)(n.p,{children:"Download an exemplary SQL file:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"curl https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/demo_data.sql -o demo_data.sql\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Executing an SQL file is as simple as using the ",(0,a.jsx)(n.code,{children:"--file"})," option:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s pg apply --file demo_data.sql -i clustered-instance -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"a9s CLI"})," will determine the replication leader, upload, execute and delete the SQL file."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"--no-delete"})," option can be used during debugging of erroneous SQL statements\nas the SQL file remains in the PostgreSQL Leader's Pod."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s pg apply --file demo_data.sql -i clustered-instance -n tutorial --no-delete\n"})}),"\n",(0,a.jsx)(n.p,{children:"With the SQL file still available in the Pod, statements can be quickly altered and re-tested."}),"\n",(0,a.jsx)(n.h3,{id:"applying-an-sql-string",children:"Applying an SQL String"}),"\n",(0,a.jsxs)(n.p,{children:["It is also possible to execute a SQL string containing one or several SQL statements by using the ",(0,a.jsx)(n.code,{children:"--sql"})," option:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,a.jsx)(n.p,{children:"The output of the command will be printed on the screen, for example:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"Output from the Pod:\n \ncount \n-------\n 10 \n(1 row)\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Again, the ",(0,a.jsx)(n.code,{children:"pg apply"})," commands are not meant to interact with production databases but may become handy during debugging and local development."]}),"\n",(0,a.jsxs)(n.p,{children:["Be aware that these commands are executed by the privileged ",(0,a.jsx)(n.code,{children:"postgres"})," user. Schemas (tables) created by the ",(0,a.jsx)(n.code,{children:"postgres"})," user may not be accessible by roles (users) created in conjunction with Service Bindings. You will then have to grant access privileges to the Service Binding role."]}),"\n",(0,a.jsx)(n.h2,{id:"step-6-creating-and-restoring-a-backup",children:"Step 6: Creating and Restoring a Backup"}),"\n",(0,a.jsx)(n.p,{children:"Assuming you have configured the backup store and provided access credentials to an AWS S3 compatible object store, try creating and restoring a backup for your application."}),"\n",(0,a.jsx)(n.h3,{id:"creating-a-backup",children:"Creating a Backup"}),"\n",(0,a.jsx)(n.p,{children:"Creating a backup can be achieved with a single command:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create pg backup --name clustered-backup-1 -i clustered-instance -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"With a closer look at the output you will notice that a backup is also specified by a YAML specification and thus is done in a declarative way. You express that you want a backup to be created:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-YAML",children:"apiVersion: backups.anynines.com/v1beta3\nkind: Backup\nmetadata:\n name: clustered-backup-1\n namespace: tutorial\nspec:\n serviceInstance:\n apiGroup: postgresql.anynines.com\n kind: Postgresql\n name: clustered-instance\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The a8s Backup Manager is the responsible for making the backup happen. It does that by locating the Service Instance ",(0,a.jsx)(n.code,{children:"clustered-instance"})," which also runs the ",(0,a.jsx)(n.code,{children:"a8s Backup Agent"}),". This agent is then executing the PostgreSQL backup command and, depending on its configuration, compressing, encrypting and streaming the backup to the backup object store (S3)."]}),"\n",(0,a.jsx)(n.h3,{id:"restoring-a-backup",children:"Restoring a Backup"}),"\n",(0,a.jsxs)(n.p,{children:["In order to experience the value of a backup, simulate a data loss by issueing the following ",(0,a.jsx)(n.code,{children:"DELETE"})," statement:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "DELETE FROM posts"\n'})}),"\n",(0,a.jsx)(n.p,{children:"Verify the destructive effect on your data by counting the number of posts:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,a.jsx)(n.p,{children:"And/or reloading the demo-app."}),"\n",(0,a.jsx)(n.p,{children:"Once you've confirmed that all blog posts are gone, it's time to recover the data from the backup."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create pg restore --name clustered-restore-1 -b clustered-backup-1 -i clustered-instance -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Again, apply the ",(0,a.jsx)(n.code,{children:"COUNT"})," or reload the website to see that the restore has brought back all blog posts."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,a.jsx)(n.p,{children:"Some engineers say that a convenient backup/restore functionality at your disposal improves the quality of sleep by 37% \ud83d\ude09."}),"\n",(0,a.jsx)(n.h2,{id:"congratulations",children:"Congratulations"}),"\n",(0,a.jsx)(n.p,{children:"With just a few commands, you have created a local Kubernetes cluster, installed the a8s PostgreSQL Control Plane including all its dependencies. Furthermore, you have provisioned an PostgreSQL cluster consisting of three Pods providing you with an asynchronous streaming cluster supporting automatic failure detection, lead-election and failover. Deploying the demo application you've also experienced the convenience of Service Bindings and their automatic creation of Kubernetes Secrets. The backup and restore experiment then illustrated how effortless handling a production database can be."}),"\n",(0,a.jsx)(n.p,{children:"Did you every think that running a production database as an application developer with full self-service could be so easy?"}),"\n",(0,a.jsx)(n.h2,{id:"what-to-do-next",children:"What to do next?"}),"\n",(0,a.jsxs)(n.p,{children:["Wait, there's more to it! This hands-on tutorial merely scratched the surface. Did you see that the ",(0,a.jsx)(n.code,{children:"a9s CLI"})," has created many YAML manifests stored in the ",(0,a.jsx)(n.code,{children:"usermanifests"})," folder of your working directory? This is a good place to start tweaking your manifests and start your own experiments."]}),"\n",(0,a.jsx)(n.p,{children:"If you want to learn more about a8s PostgreSQL feel free to have a look at the documentation at TODO."}),"\n",(0,a.jsxs)(n.p,{children:["For more about the ",(0,a.jsx)(n.code,{children:"a9s CLI"})," have a look at ",(0,a.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"https://github.com/anynines/a9s-cli-v2"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"links",children:"Links"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["a9s CLI documentation and source, ",(0,a.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"https://github.com/anynines/a9s-cli-v2"})]}),"\n",(0,a.jsxs)(n.li,{children:["PostgreSQL documentation, Log-Shipping Standby Servers, ",(0,a.jsx)(n.a,{href:"https://www.postgresql.org/docs/current/warm-standby.html",children:"https://www.postgresql.org/docs/current/warm-standby.html"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>c});var t=s(6540);const a={},i=t.createContext(a);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5e95c892.23aa22ce.js b/assets/js/5e95c892.23aa22ce.js new file mode 100644 index 0000000..6204ddb --- /dev/null +++ b/assets/js/5e95c892.23aa22ce.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[9647],{3124:(e,s,n)=>{n.r(s),n.d(s,{default:()=>i});n(6540);var r=n(4164),a=n(6644),c=n(8630),u=n(2831),d=n(1297),t=n(4848);function i(e){return(0,t.jsx)(a.e3,{className:(0,r.A)(c.G.wrapper.docsPages),children:(0,t.jsx)(d.A,{children:(0,u.v)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/assets/js/5e95c892.e95da192.js b/assets/js/5e95c892.e95da192.js deleted file mode 100644 index c6fef34..0000000 --- a/assets/js/5e95c892.e95da192.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[9647],{440:(e,s,n)=>{n.r(s),n.d(s,{default:()=>i});n(6540);var r=n(4164),a=n(4714),c=n(8570),u=n(2831),d=n(1777),t=n(4848);function i(e){return(0,t.jsx)(a.e3,{className:(0,r.A)(c.G.wrapper.docsPages),children:(0,t.jsx)(d.A,{children:(0,u.v)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/assets/js/6875c492.4fde6be0.js b/assets/js/6875c492.4fde6be0.js new file mode 100644 index 0000000..492db2f --- /dev/null +++ b/assets/js/6875c492.4fde6be0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[4813],{4934:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var s=n(3230),i=n(3555),a=n(4848);function r(e){const{metadata:t}=e,{previousPage:n,nextPage:r}=t;return(0,a.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,a.jsx)(i.A,{permalink:n,title:(0,a.jsx)(s.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer entries"})}),r&&(0,a.jsx)(i.A,{permalink:r,title:(0,a.jsx)(s.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older entries"}),isNext:!0})]})}},4331:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var s=n(9101),i=n(8406),a=n(4848);function r(e){let{items:t,component:n=i.A}=e;return(0,a.jsx)(a.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,a.jsx)(s.in,{content:t,children:(0,a.jsx)(n,{children:(0,a.jsx)(t,{})})},t.metadata.permalink)}))})}},6942:(e,t,n)=>{n.r(t),n.d(t,{default:()=>A});n(6540);var s=n(4164),i=n(3230),a=n(6644),r=n(8630),l=n(7824),o=n(4848);function c(){const{selectMessage:e}=(0,l.W)();return t=>e(t,(0,i.T)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}function d(e){const t=c();return(0,i.T)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}var g=n(4783),u=n(6953),h=n(4934),p=n(1210),m=n(4331),x=n(8811),b=n(5225);function j(e){let{tag:t}=e;const n=d(t);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.be,{title:n,description:t.description}),(0,o.jsx)(p.A,{tag:"blog_tags_posts"})]})}function f(e){let{tag:t,items:n,sidebar:s,listMetadata:a}=e;const r=d(t);return(0,o.jsxs)(u.A,{sidebar:s,children:[t.unlisted&&(0,o.jsx)(x.A,{}),(0,o.jsxs)("header",{className:"margin-bottom--xl",children:[(0,o.jsx)(b.A,{as:"h1",children:r}),t.description&&(0,o.jsx)("p",{children:t.description}),(0,o.jsx)(g.A,{href:t.allTagsPath,children:(0,o.jsx)(i.A,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,o.jsx)(m.A,{items:n}),(0,o.jsx)(h.A,{metadata:a})]})}function A(e){return(0,o.jsxs)(a.e3,{className:(0,s.A)(r.G.wrapper.blogPages,r.G.page.blogTagPostListPage),children:[(0,o.jsx)(j,{...e}),(0,o.jsx)(f,{...e})]})}},8811:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var s=n(4164),i=n(6907),a=n(8630),r=n(4182),l=n(4848);function o(e){let{className:t}=e;return(0,l.jsx)(r.A,{type:"caution",title:(0,l.jsx)(i.Rc,{}),className:(0,s.A)(t,a.G.common.unlistedBanner),children:(0,l.jsx)(i.Uh,{})})}function c(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(i.AE,{}),(0,l.jsx)(o,{...e})]})}},6907:(e,t,n)=>{n.d(t,{AE:()=>o,Rc:()=>r,TT:()=>d,Uh:()=>l,Yh:()=>c});n(6540);var s=n(3230),i=n(1141),a=n(4848);function r(){return(0,a.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,a.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function o(){return(0,a.jsx)(i.A,{children:(0,a.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,a.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,a.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/assets/js/6875c492.60ad33e6.js b/assets/js/6875c492.60ad33e6.js deleted file mode 100644 index f091bee..0000000 --- a/assets/js/6875c492.60ad33e6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[4813],{7954:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var s=n(6885),a=n(9215),i=n(4848);function r(e){const{metadata:t}=e,{previousPage:n,nextPage:r}=t;return(0,i.jsxs)("nav",{className:"pagination-nav","aria-label":(0,s.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,i.jsx)(a.A,{permalink:n,title:(0,i.jsx)(s.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),r&&(0,i.jsx)(a.A,{permalink:r,title:(0,i.jsx)(s.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},943:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var s=n(542),a=n(4247),i=n(4848);function r(e){let{items:t,component:n=a.A}=e;return(0,i.jsx)(i.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,i.jsx)(s.i,{content:t,children:(0,i.jsx)(n,{children:(0,i.jsx)(t,{})})},t.metadata.permalink)}))})}},8314:(e,t,n)=>{n.r(t),n.d(t,{default:()=>A});n(6540);var s=n(4164),a=n(6885),i=n(5540),r=n(4714),l=n(8570),o=n(7083),c=n(1510),d=n(7954),g=n(6758),u=n(943),p=n(8105),h=n(2067),m=n(4848);function x(e){const t=function(){const{selectMessage:e}=(0,i.W)();return t=>e(t,(0,a.T)({id:"theme.blog.post.plurals",description:'Pluralized label for "{count} posts". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One post|{count} posts"},{count:t}))}();return(0,a.T)({id:"theme.blog.tagTitle",description:"The title of the page for a blog tag",message:'{nPosts} tagged with "{tagName}"'},{nPosts:t(e.count),tagName:e.label})}function j(e){let{tag:t}=e;const n=x(t);return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(r.be,{title:n,description:t.description}),(0,m.jsx)(g.A,{tag:"blog_tags_posts"})]})}function b(e){let{tag:t,items:n,sidebar:s,listMetadata:i}=e;const r=x(t);return(0,m.jsxs)(c.A,{sidebar:s,children:[t.unlisted&&(0,m.jsx)(p.A,{}),(0,m.jsxs)("header",{className:"margin-bottom--xl",children:[(0,m.jsx)(h.A,{as:"h1",children:r}),t.description&&(0,m.jsx)("p",{children:t.description}),(0,m.jsx)(o.A,{href:t.allTagsPath,children:(0,m.jsx)(a.A,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,m.jsx)(u.A,{items:n}),(0,m.jsx)(d.A,{metadata:i})]})}function A(e){return(0,m.jsxs)(r.e3,{className:(0,s.A)(l.G.wrapper.blogPages,l.G.page.blogTagPostListPage),children:[(0,m.jsx)(j,{...e}),(0,m.jsx)(b,{...e})]})}},8105:(e,t,n)=>{n.d(t,{A:()=>p});n(6540);var s=n(4164),a=n(6885),i=n(4993),r=n(4848);function l(){return(0,r.jsx)(a.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,r.jsx)(a.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,r.jsx)(i.A,{children:(0,r.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=n(8570),g=n(7570);function u(e){let{className:t}=e;return(0,r.jsx)(g.A,{type:"caution",title:(0,r.jsx)(l,{}),className:(0,s.A)(t,d.G.common.unlistedBanner),children:(0,r.jsx)(o,{})})}function p(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(c,{}),(0,r.jsx)(u,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/814f3328.10833991.js b/assets/js/814f3328.fb5cafc0.js similarity index 69% rename from assets/js/814f3328.10833991.js rename to assets/js/814f3328.fb5cafc0.js index 5644864..60284c4 100644 --- a/assets/js/814f3328.10833991.js +++ b/assets/js/814f3328.fb5cafc0.js @@ -1 +1 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[7472],{5513:e=>{e.exports=JSON.parse('{"title":"Versions","items":[{"title":"0.11.1","permalink":"/changelog/changelog-0.11.1","unlisted":false}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[7472],{5513:e=>{e.exports=JSON.parse('{"title":"Versions","items":[{"title":"0.11.1","permalink":"/changelog/changelog-0.11.1","unlisted":false,"date":"2024-02-29T00:00:00.000Z"}]}')}}]); \ No newline at end of file diff --git a/assets/js/920.89182d6e.js b/assets/js/920.89182d6e.js deleted file mode 100644 index 5f4a47a..0000000 --- a/assets/js/920.89182d6e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[920],{1510:(e,t,a)=>{a.d(t,{A:()=>b});var s=a(6540),n=a(4164),r=a(1777),l=a(4756),i=a(7083),o=a(6885),c=a(6347),d=a(5728);function m(e){const{pathname:t}=(0,c.zy)();return(0,s.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,d.ys)(e.permalink,t))}(e,t)))),[e,t])}const u={sidebar:"sidebar_re4s",sidebarItemTitle:"sidebarItemTitle_pO2u",sidebarItemList:"sidebarItemList_Yudw",sidebarItem:"sidebarItem__DBe",sidebarItemLink:"sidebarItemLink_mo7H",sidebarItemLinkActive:"sidebarItemLinkActive_I1ZP"};var h=a(4848);function g(e){let{sidebar:t}=e;const a=m(t.items);return(0,h.jsx)("aside",{className:"col col--3",children:(0,h.jsxs)("nav",{className:(0,n.A)(u.sidebar,"thin-scrollbar"),"aria-label":(0,o.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,h.jsx)("div",{className:(0,n.A)(u.sidebarItemTitle,"margin-bottom--md"),children:t.title}),(0,h.jsx)("ul",{className:(0,n.A)(u.sidebarItemList,"clean-list"),children:a.map((e=>(0,h.jsx)("li",{className:u.sidebarItem,children:(0,h.jsx)(i.A,{isNavLink:!0,to:e.permalink,className:u.sidebarItemLink,activeClassName:u.sidebarItemLinkActive,children:e.title})},e.permalink)))})]})})}var x=a(6703);function j(e){let{sidebar:t}=e;const a=m(t.items);return(0,h.jsx)("ul",{className:"menu__list",children:a.map((e=>(0,h.jsx)("li",{className:"menu__list-item",children:(0,h.jsx)(i.A,{isNavLink:!0,to:e.permalink,className:"menu__link",activeClassName:"menu__link--active",children:e.title})},e.permalink)))})}function p(e){return(0,h.jsx)(x.GX,{component:j,props:e})}function f(e){let{sidebar:t}=e;const a=(0,l.l)();return t?.items.length?"mobile"===a?(0,h.jsx)(p,{sidebar:t}):(0,h.jsx)(g,{sidebar:t}):null}function b(e){const{sidebar:t,toc:a,children:s,...l}=e,i=t&&t.items.length>0;return(0,h.jsx)(r.A,{...l,children:(0,h.jsx)("div",{className:"container margin-vert--lg",children:(0,h.jsxs)("div",{className:"row",children:[(0,h.jsx)(f,{sidebar:t}),(0,h.jsx)("main",{className:(0,n.A)("col",{"col--7":i,"col--9 col--offset-1":!i}),children:s}),a&&(0,h.jsx)("div",{className:"col col--2",children:a})]})})})}},4247:(e,t,a)=>{a.d(t,{A:()=>R});a(6540);var s=a(4164),n=a(542),r=a(4848);function l(e){let{children:t,className:a}=e;return(0,r.jsx)("article",{className:a,children:t})}var i=a(7083);const o={title:"title_f1Hy"};function c(e){let{className:t}=e;const{metadata:a,isBlogPostPage:l}=(0,n.e)(),{permalink:c,title:d}=a,m=l?"h1":"h2";return(0,r.jsx)(m,{className:(0,s.A)(o.title,t),children:l?d:(0,r.jsx)(i.A,{to:c,children:d})})}var d=a(6885),m=a(5540),u=a(5435);const h={container:"container_mt6G"};function g(e){let{readingTime:t}=e;const a=function(){const{selectMessage:e}=(0,m.W)();return t=>{const a=Math.ceil(t);return e(a,(0,d.T)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:a}))}}();return(0,r.jsx)(r.Fragment,{children:a(t)})}function x(e){let{date:t,formattedDate:a}=e;return(0,r.jsx)("time",{dateTime:t,children:a})}function j(){return(0,r.jsx)(r.Fragment,{children:" \xb7 "})}function p(e){let{className:t}=e;const{metadata:a}=(0,n.e)(),{date:l,readingTime:i}=a,o=(0,u.i)({day:"numeric",month:"long",year:"numeric",timeZone:"UTC"});return(0,r.jsxs)("div",{className:(0,s.A)(h.container,"margin-vert--md",t),children:[(0,r.jsx)(x,{date:l,formattedDate:(c=l,o.format(new Date(c)))}),void 0!==i&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(j,{}),(0,r.jsx)(g,{readingTime:i})]})]});var c}function f(e){return e.href?(0,r.jsx)(i.A,{...e}):(0,r.jsx)(r.Fragment,{children:e.children})}function b(e){let{author:t,className:a}=e;const{name:n,title:l,url:i,imageURL:o,email:c}=t,d=i||c&&`mailto:${c}`||void 0;return(0,r.jsxs)("div",{className:(0,s.A)("avatar margin-bottom--sm",a),children:[o&&(0,r.jsx)(f,{href:d,className:"avatar__photo-link",children:(0,r.jsx)("img",{className:"avatar__photo",src:o,alt:n})}),n&&(0,r.jsxs)("div",{className:"avatar__intro",children:[(0,r.jsx)("div",{className:"avatar__name",children:(0,r.jsx)(f,{href:d,children:(0,r.jsx)("span",{children:n})})}),l&&(0,r.jsx)("small",{className:"avatar__subtitle",children:l})]})]})}const v={authorCol:"authorCol_Hf19",imageOnlyAuthorRow:"imageOnlyAuthorRow_pa_O",imageOnlyAuthorCol:"imageOnlyAuthorCol_G86a"};function A(e){let{className:t}=e;const{metadata:{authors:a},assets:l}=(0,n.e)();if(0===a.length)return null;const i=a.every((e=>{let{name:t}=e;return!t}));return(0,r.jsx)("div",{className:(0,s.A)("margin-top--md margin-bottom--sm",i?v.imageOnlyAuthorRow:"row",t),children:a.map(((e,t)=>(0,r.jsx)("div",{className:(0,s.A)(!i&&"col col--6",i?v.imageOnlyAuthorCol:v.authorCol),children:(0,r.jsx)(b,{author:{...e,imageURL:l.authorsImageUrls[t]??e.imageURL}})},t)))})}function N(){return(0,r.jsxs)("header",{children:[(0,r.jsx)(c,{}),(0,r.jsx)(p,{}),(0,r.jsx)(A,{})]})}var _=a(2709),k=a(9863);function P(e){let{children:t,className:a}=e;const{isBlogPostPage:l}=(0,n.e)();return(0,r.jsx)("div",{id:l?_.blogPostContainerID:void 0,className:(0,s.A)("markdown",a),children:(0,r.jsx)(k.A,{children:t})})}var w=a(8570),T=a(8284),I=a(9419);function y(){return(0,r.jsx)("b",{children:(0,r.jsx)(d.A,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts",children:"Read More"})})}function L(e){const{blogPostTitle:t,...a}=e;return(0,r.jsx)(i.A,{"aria-label":(0,d.T)({message:"Read more about {title}",id:"theme.blog.post.readMoreLabel",description:"The ARIA label for the link to full blog posts from excerpts"},{title:t}),...a,children:(0,r.jsx)(y,{})})}function C(){const{metadata:e,isBlogPostPage:t}=(0,n.e)(),{tags:a,title:l,editUrl:i,hasTruncateMarker:o,lastUpdatedBy:c,lastUpdatedAt:d}=e,m=!t&&o,u=a.length>0;if(!(u||m||i))return null;if(t){const e=!!(i||d||c);return(0,r.jsxs)("footer",{className:"docusaurus-mt-lg",children:[u&&(0,r.jsx)("div",{className:(0,s.A)("row","margin-top--sm",w.G.blog.blogFooterEditMetaRow),children:(0,r.jsx)("div",{className:"col",children:(0,r.jsx)(I.A,{tags:a})})}),e&&(0,r.jsx)(T.A,{className:(0,s.A)("margin-top--sm",w.G.blog.blogFooterEditMetaRow),editUrl:i,lastUpdatedAt:d,lastUpdatedBy:c})]})}return(0,r.jsxs)("footer",{className:"row docusaurus-mt-lg",children:[u&&(0,r.jsx)("div",{className:(0,s.A)("col",{"col--9":m}),children:(0,r.jsx)(I.A,{tags:a})}),m&&(0,r.jsx)("div",{className:(0,s.A)("col text--right",{"col--3":u}),children:(0,r.jsx)(L,{blogPostTitle:l,to:e.permalink})})]})}function R(e){let{children:t,className:a}=e;const i=function(){const{isBlogPostPage:e}=(0,n.e)();return e?void 0:"margin-bottom--xl"}();return(0,r.jsxs)(l,{className:(0,s.A)(i,a),children:[(0,r.jsx)(N,{}),(0,r.jsx)(P,{children:t}),(0,r.jsx)(C,{})]})}},9215:(e,t,a)=>{a.d(t,{A:()=>l});a(6540);var s=a(4164),n=a(7083),r=a(4848);function l(e){const{permalink:t,title:a,subLabel:l,isNext:i}=e;return(0,r.jsxs)(n.A,{className:(0,s.A)("pagination-nav__link",i?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[l&&(0,r.jsx)("div",{className:"pagination-nav__sublabel",children:l}),(0,r.jsx)("div",{className:"pagination-nav__label",children:a})]})}},1665:(e,t,a)=>{a.d(t,{A:()=>i});a(6540);var s=a(4164),n=a(7083);const r={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var l=a(4848);function i(e){let{permalink:t,label:a,count:i,description:o}=e;return(0,l.jsxs)(n.A,{href:t,title:o,className:(0,s.A)(r.tag,i?r.tagWithCount:r.tagRegular),children:[a,i&&(0,l.jsx)("span",{children:i})]})}},9419:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var s=a(4164),n=a(6885),r=a(1665);const l={tags:"tags_jXut",tag:"tag_QGVx"};var i=a(4848);function o(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(n.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,s.A)(l.tags,"padding--none","margin-left--sm"),children:t.map((e=>(0,i.jsx)("li",{className:l.tag,children:(0,i.jsx)(r.A,{...e})},e.permalink)))})]})}},542:(e,t,a)=>{a.d(t,{e:()=>o,i:()=>i});var s=a(6540),n=a(1971),r=a(4848);const l=s.createContext(null);function i(e){let{children:t,content:a,isBlogPostPage:n=!1}=e;const i=function(e){let{content:t,isBlogPostPage:a}=e;return(0,s.useMemo)((()=>({metadata:t.metadata,frontMatter:t.frontMatter,assets:t.assets,toc:t.toc,isBlogPostPage:a})),[t,a])}({content:a,isBlogPostPage:n});return(0,r.jsx)(l.Provider,{value:i,children:t})}function o(){const e=(0,s.useContext)(l);if(null===e)throw new n.dV("BlogPostProvider");return e}},5540:(e,t,a)=>{a.d(t,{W:()=>c});var s=a(6540),n=a(1059);const r=["zero","one","two","few","many","other"];function l(e){return r.filter((t=>e.includes(t)))}const i={locale:"en",pluralForms:l(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,n.A)();return(0,s.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:l(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),i}}),[e])}function c(){const e=o();return{selectMessage:(t,a)=>function(e,t,a){const s=e.split("|");if(1===s.length)return s[0];s.length>a.pluralForms.length&&console.error(`For locale=${a.locale}, a maximum of ${a.pluralForms.length} plural forms are expected (${a.pluralForms.join(",")}), but the message contains ${s.length}: ${e}`);const n=a.select(t),r=a.pluralForms.indexOf(n);return s[Math.min(r,s.length-1)]}(a,t,e)}}}}]); \ No newline at end of file diff --git a/assets/js/92f3bebb.418ea4f1.js b/assets/js/92f3bebb.418ea4f1.js deleted file mode 100644 index 5da4218..0000000 --- a/assets/js/92f3bebb.418ea4f1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[4684],{4004:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>r,contentTitle:()=>l,default:()=>h,frontMatter:()=>t,metadata:()=>c,toc:()=>o});var a=n(4848),i=n(8453);const t={id:"a9s-cli",title:"a9s CLI",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]},l="a9s CLI",c={id:"a9s-cli",title:"a9s CLI",description:"anynines provides a command line tool called a9s to facilitate application development, devops tasks and interact with selected anynines products.",source:"@site/versioned_docs/version-0.14.0/a9s-cli-index.md",sourceDirName:".",slug:"/a9s-cli",permalink:"/docs/a9s-cli",draft:!1,unlisted:!1,tags:[{inline:!0,label:"a9s cli",permalink:"/docs/tags/a-9-s-cli"},{inline:!0,label:"a9s hub",permalink:"/docs/tags/a-9-s-hub"},{inline:!0,label:"a9s data services",permalink:"/docs/tags/a-9-s-data-services"},{inline:!0,label:"a8s data services",permalink:"/docs/tags/a-8-s-data-services"},{inline:!0,label:"a9s postgres",permalink:"/docs/tags/a-9-s-postgres"},{inline:!0,label:"a8s postgres",permalink:"/docs/tags/a-8-s-postgres"},{inline:!0,label:"data service",permalink:"/docs/tags/data-service"},{inline:!0,label:"introduction",permalink:"/docs/tags/introduction"},{inline:!0,label:"kubernetes",permalink:"/docs/tags/kubernetes"},{inline:!0,label:"minikube",permalink:"/docs/tags/minikube"},{inline:!0,label:"kind",permalink:"/docs/tags/kind"},{inline:!0,label:"klutch",permalink:"/docs/tags/klutch"}],version:"0.14.0",frontMatter:{id:"a9s-cli",title:"a9s CLI",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]}},r={},o=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installing the CLI",id:"installing-the-cli",level:2},{value:"Using the CLI",id:"using-the-cli",level:2},{value:"Use Cases",id:"use-cases",level:2},{value:" a8s
Stack",id:"a8s-stack",level:3},{value:"Go to the a8s Stack documentation",id:"go-to-the-a8s-stack-documentation",level:3},{value:"klutch
Stack",id:"klutch-stack",level:3},{value:"Go to the klutch Stack documentation",id:"go-to-the-klutch-stack-documentation",level:3}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.h1,{id:"a9s-cli",children:"a9s CLI"}),"\n",(0,a.jsxs)(s.p,{children:["anynines provides a command line tool called ",(0,a.jsx)(s.code,{children:"a9s"})," to facilitate application development, devops tasks and interact with selected anynines products."]}),"\n",(0,a.jsx)(s.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsx)(s.li,{children:"MacOS / Linux."}),"\n",(0,a.jsx)(s.li,{children:"Using the backup/restore feature of a8s PostgreSQL requires an S3 compatible endpoint."}),"\n",(0,a.jsxs)(s.li,{children:["Install Go (if you want ",(0,a.jsx)(s.code,{children:"go env"})," to identify your OS and arch)."]}),"\n",(0,a.jsx)(s.li,{children:"Install Git."}),"\n",(0,a.jsx)(s.li,{children:"Install Docker."}),"\n",(0,a.jsx)(s.li,{children:"Install Kubectl."}),"\n",(0,a.jsx)(s.li,{children:"Install Kind and/or Minikube."}),"\n"]}),"\n",(0,a.jsx)(s.h2,{id:"installing-the-cli",children:"Installing the CLI"}),"\n",(0,a.jsxs)(s.p,{children:["In order to install the ",(0,a.jsx)(s.code,{children:"a9s"})," CLI execute the following shell script:"]}),"\n",(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-bash",children:"RELEASE=$(curl -L -s https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/stable.txt); OS=$(go env GOOS); ARCH=$(go env GOARCH); curl -fsSL -o a9s https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/releases/$RELEASE/a9s-$OS-$ARCH\n \nsudo chmod 755 a9s\nsudo mv a9s /usr/local/bin\n"})}),"\n",(0,a.jsxs)(s.p,{children:["This will download the ",(0,a.jsx)(s.code,{children:"a9s"})," binary suitable for your architecture and move it to ",(0,a.jsx)(s.code,{children:"/usr/local/bin"}),".\nDepending on your system you have to adjust the ",(0,a.jsx)(s.code,{children:"PATH"})," variable or move the binary to a folder that's already in the ",(0,a.jsx)(s.code,{children:"PATH"}),"."]}),"\n",(0,a.jsx)(s.h2,{id:"using-the-cli",children:"Using the CLI"}),"\n",(0,a.jsx)(s.pre,{children:(0,a.jsx)(s.code,{className:"language-bash",children:"a9s\n"})}),"\n",(0,a.jsx)(s.h2,{id:"use-cases",children:"Use Cases"}),"\n",(0,a.jsxs)(s.p,{children:["The ",(0,a.jsx)(s.code,{children:"a9s"})," CLI can be used to install and use the following stacks:"]}),"\n",(0,a.jsxs)(s.h3,{id:"a8s-stack",children:[(0,a.jsx)(s.code,{children:"a8s"})," Stack"]}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsxs)(s.li,{children:["Install a local Kubernetes cluster (",(0,a.jsx)(s.code,{children:"minikube"})," or ",(0,a.jsx)(s.code,{children:"kind"}),")."]}),"\n",(0,a.jsxs)(s.li,{children:["Install the ",(0,a.jsx)(s.a,{href:"https://cert-manager.io/",children:"cert-manager"}),"."]}),"\n",(0,a.jsx)(s.li,{children:"Install a local Minio object store for storing Backups."}),"\n",(0,a.jsxs)(s.li,{children:["Install the a8s PostgreSQL Operator PostgreSQL supporting","\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsxs)(s.li,{children:["creating dedicated PostgreSQL clusters with","\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsx)(s.li,{children:"synchronous and asynchronous streaming replication."}),"\n",(0,a.jsx)(s.li,{children:"automatic failure detection and automatic failover."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(s.li,{children:"backup and restore capabilities storing backups in an S3 compatible object store such as AWS S3 or Minio."}),"\n",(0,a.jsx)(s.li,{children:"ability to easily create database users and Kubernetes Secrets by using the Service Bindings abstraction"}),"\n"]}),"\n"]}),"\n",(0,a.jsxs)(s.li,{children:["Easily apply ",(0,a.jsx)(s.code,{children:".sql"})," files and SQL commands to PostgreSQL clusters."]}),"\n"]}),"\n",(0,a.jsx)(s.h3,{id:"go-to-the-a8s-stack-documentation",children:(0,a.jsx)(s.a,{href:"/docs/a9s-cli-a8s/",children:"Go to the a8s Stack documentation"})}),"\n",(0,a.jsxs)(s.h3,{id:"klutch-stack",children:[(0,a.jsx)(s.code,{children:"klutch"})," Stack"]}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsxs)(s.li,{children:["Install a local Klutch central management cluster using ",(0,a.jsx)(s.code,{children:"kind"})]}),"\n",(0,a.jsx)(s.li,{children:"Install Crossplane and the a8s stack on the central management cluster"}),"\n",(0,a.jsx)(s.li,{children:"Bind resources from a consumer cluster to the management cluster"}),"\n"]}),"\n",(0,a.jsx)(s.h3,{id:"go-to-the-klutch-stack-documentation",children:(0,a.jsx)(s.a,{href:"/docs/a9s-cli-klutch/",children:"Go to the klutch Stack documentation"})})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,a.jsx)(s,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>l,x:()=>c});var a=n(6540);const i={},t=a.createContext(i);function l(e){const s=a.useContext(t);return a.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),a.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/92f3bebb.e5489572.js b/assets/js/92f3bebb.e5489572.js new file mode 100644 index 0000000..f104881 --- /dev/null +++ b/assets/js/92f3bebb.e5489572.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[4684],{7669:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>r,contentTitle:()=>c,default:()=>u,frontMatter:()=>l,metadata:()=>a,toc:()=>o});const a=JSON.parse('{"id":"a9s-cli","title":"a9s CLI","description":"anynines provides a command line tool called a9s to facilitate application development, devops tasks and interact with selected anynines products.","source":"@site/versioned_docs/version-0.14.0/a9s-cli-index.md","sourceDirName":".","slug":"/a9s-cli","permalink":"/docs/a9s-cli","draft":false,"unlisted":false,"tags":[{"inline":true,"label":"a9s cli","permalink":"/docs/tags/a-9-s-cli"},{"inline":true,"label":"a9s hub","permalink":"/docs/tags/a-9-s-hub"},{"inline":true,"label":"a9s data services","permalink":"/docs/tags/a-9-s-data-services"},{"inline":true,"label":"a8s data services","permalink":"/docs/tags/a-8-s-data-services"},{"inline":true,"label":"a9s postgres","permalink":"/docs/tags/a-9-s-postgres"},{"inline":true,"label":"a8s postgres","permalink":"/docs/tags/a-8-s-postgres"},{"inline":true,"label":"data service","permalink":"/docs/tags/data-service"},{"inline":true,"label":"introduction","permalink":"/docs/tags/introduction"},{"inline":true,"label":"kubernetes","permalink":"/docs/tags/kubernetes"},{"inline":true,"label":"minikube","permalink":"/docs/tags/minikube"},{"inline":true,"label":"kind","permalink":"/docs/tags/kind"},{"inline":true,"label":"klutch","permalink":"/docs/tags/klutch"}],"version":"0.14.0","frontMatter":{"id":"a9s-cli","title":"a9s CLI","tags":["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],"keywords":["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]}}');var t=n(4848),i=n(8453);const l={id:"a9s-cli",title:"a9s CLI",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]},c="a9s CLI",r={},o=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installing the CLI",id:"installing-the-cli",level:2},{value:"Using the CLI",id:"using-the-cli",level:2},{value:"Use Cases",id:"use-cases",level:2},{value:"a8s
Stack",id:"a8s-stack",level:3},{value:"Go to the a8s Stack documentation",id:"go-to-the-a8s-stack-documentation",level:3},{value:"klutch
Stack",id:"klutch-stack",level:3},{value:"Go to the klutch Stack documentation",id:"go-to-the-klutch-stack-documentation",level:3}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"a9s-cli",children:"a9s CLI"})}),"\n",(0,t.jsxs)(s.p,{children:["anynines provides a command line tool called ",(0,t.jsx)(s.code,{children:"a9s"})," to facilitate application development, devops tasks and interact with selected anynines products."]}),"\n",(0,t.jsx)(s.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"MacOS / Linux."}),"\n",(0,t.jsx)(s.li,{children:"Using the backup/restore feature of a8s PostgreSQL requires an S3 compatible endpoint."}),"\n",(0,t.jsxs)(s.li,{children:["Install Go (if you want ",(0,t.jsx)(s.code,{children:"go env"})," to identify your OS and arch)."]}),"\n",(0,t.jsx)(s.li,{children:"Install Git."}),"\n",(0,t.jsx)(s.li,{children:"Install Docker."}),"\n",(0,t.jsx)(s.li,{children:"Install Kubectl."}),"\n",(0,t.jsx)(s.li,{children:"Install Kind and/or Minikube."}),"\n"]}),"\n",(0,t.jsx)(s.h2,{id:"installing-the-cli",children:"Installing the CLI"}),"\n",(0,t.jsxs)(s.p,{children:["In order to install the ",(0,t.jsx)(s.code,{children:"a9s"})," CLI execute the following shell script:"]}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"RELEASE=$(curl -L -s https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/stable.txt); OS=$(go env GOOS); ARCH=$(go env GOARCH); curl -fsSL -o a9s https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/releases/$RELEASE/a9s-$OS-$ARCH\n \nsudo chmod 755 a9s\nsudo mv a9s /usr/local/bin\n"})}),"\n",(0,t.jsxs)(s.p,{children:["This will download the ",(0,t.jsx)(s.code,{children:"a9s"})," binary suitable for your architecture and move it to ",(0,t.jsx)(s.code,{children:"/usr/local/bin"}),".\nDepending on your system you have to adjust the ",(0,t.jsx)(s.code,{children:"PATH"})," variable or move the binary to a folder that's already in the ",(0,t.jsx)(s.code,{children:"PATH"}),"."]}),"\n",(0,t.jsx)(s.h2,{id:"using-the-cli",children:"Using the CLI"}),"\n",(0,t.jsx)(s.pre,{children:(0,t.jsx)(s.code,{className:"language-bash",children:"a9s\n"})}),"\n",(0,t.jsx)(s.h2,{id:"use-cases",children:"Use Cases"}),"\n",(0,t.jsxs)(s.p,{children:["The ",(0,t.jsx)(s.code,{children:"a9s"})," CLI can be used to install and use the following stacks:"]}),"\n",(0,t.jsxs)(s.h3,{id:"a8s-stack",children:[(0,t.jsx)(s.code,{children:"a8s"})," Stack"]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["Install a local Kubernetes cluster (",(0,t.jsx)(s.code,{children:"minikube"})," or ",(0,t.jsx)(s.code,{children:"kind"}),")."]}),"\n",(0,t.jsxs)(s.li,{children:["Install the ",(0,t.jsx)(s.a,{href:"https://cert-manager.io/",children:"cert-manager"}),"."]}),"\n",(0,t.jsx)(s.li,{children:"Install a local Minio object store for storing Backups."}),"\n",(0,t.jsxs)(s.li,{children:["Install the a8s PostgreSQL Operator PostgreSQL supporting","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["creating dedicated PostgreSQL clusters with","\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsx)(s.li,{children:"synchronous and asynchronous streaming replication."}),"\n",(0,t.jsx)(s.li,{children:"automatic failure detection and automatic failover."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(s.li,{children:"backup and restore capabilities storing backups in an S3 compatible object store such as AWS S3 or Minio."}),"\n",(0,t.jsx)(s.li,{children:"ability to easily create database users and Kubernetes Secrets by using the Service Bindings abstraction"}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(s.li,{children:["Easily apply ",(0,t.jsx)(s.code,{children:".sql"})," files and SQL commands to PostgreSQL clusters."]}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"go-to-the-a8s-stack-documentation",children:(0,t.jsx)(s.a,{href:"/docs/a9s-cli-a8s/",children:"Go to the a8s Stack documentation"})}),"\n",(0,t.jsxs)(s.h3,{id:"klutch-stack",children:[(0,t.jsx)(s.code,{children:"klutch"})," Stack"]}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["Install a local Klutch central management cluster using ",(0,t.jsx)(s.code,{children:"kind"})]}),"\n",(0,t.jsx)(s.li,{children:"Install Crossplane and the a8s stack on the central management cluster"}),"\n",(0,t.jsx)(s.li,{children:"Bind resources from a consumer cluster to the management cluster"}),"\n"]}),"\n",(0,t.jsx)(s.h3,{id:"go-to-the-klutch-stack-documentation",children:(0,t.jsx)(s.a,{href:"/docs/a9s-cli-klutch/",children:"Go to the klutch Stack documentation"})})]})}function u(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>l,x:()=>c});var a=n(6540);const t={},i=a.createContext(t);function l(e){const s=a.useContext(i);return a.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),a.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9e4087bc.ec96cccc.js b/assets/js/9e4087bc.188afe5e.js similarity index 84% rename from assets/js/9e4087bc.ec96cccc.js rename to assets/js/9e4087bc.188afe5e.js index e9b48d3..9de66f7 100644 --- a/assets/js/9e4087bc.ec96cccc.js +++ b/assets/js/9e4087bc.188afe5e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[2711],{4548:(e,r,t)=>{t.r(r),t.d(r,{default:()=>m});t(6540);var a=t(7083),n=t(6885),s=t(4714),i=t(5435),c=t(1777),l=t(2067),o=t(4848);function d(e){let{year:r,posts:t}=e;const n=(0,i.i)({day:"numeric",month:"long",timeZone:"UTC"});return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(l.A,{as:"h3",id:r,children:r}),(0,o.jsx)("ul",{children:t.map((e=>{return(0,o.jsx)("li",{children:(0,o.jsxs)(a.A,{to:e.metadata.permalink,children:[(r=e.metadata.date,n.format(new Date(r)))," - ",e.metadata.title]})},e.metadata.date);var r}))})]})}function h(e){let{years:r}=e;return(0,o.jsx)("section",{className:"margin-vert--lg",children:(0,o.jsx)("div",{className:"container",children:(0,o.jsx)("div",{className:"row",children:r.map(((e,r)=>(0,o.jsx)("div",{className:"col col--4 margin-vert--lg",children:(0,o.jsx)(d,{...e})},r)))})})})}function m(e){let{archive:r}=e;const t=(0,n.T)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),a=(0,n.T)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),i=function(e){const r=e.reduce(((e,r)=>{const t=r.metadata.date.split("-")[0],a=e.get(t)??[];return e.set(t,[r,...a])}),new Map);return Array.from(r,(e=>{let[r,t]=e;return{year:r,posts:t}}))}(r.blogPosts);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.be,{title:t,description:a}),(0,o.jsxs)(c.A,{children:[(0,o.jsx)("header",{className:"hero hero--primary",children:(0,o.jsxs)("div",{className:"container",children:[(0,o.jsx)(l.A,{as:"h1",className:"hero__title",children:t}),(0,o.jsx)("p",{className:"hero__subtitle",children:a})]})}),(0,o.jsx)("main",{children:i.length>0&&(0,o.jsx)(h,{years:i})})]})]})}},5435:(e,r,t)=>{t.d(r,{i:()=>n});var a=t(1059);function n(e){void 0===e&&(e={});const{i18n:{currentLocale:r}}=(0,a.A)(),t=function(){const{i18n:{currentLocale:e,localeConfigs:r}}=(0,a.A)();return r[e].calendar}();return new Intl.DateTimeFormat(r,{calendar:t,...e})}}}]); \ No newline at end of file +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[2711],{5496:(e,r,t)=>{t.r(r),t.d(r,{default:()=>m});t(6540);var a=t(4783),n=t(3230),s=t(6644),i=t(9191),c=t(1297),l=t(5225),o=t(4848);function d(e){let{year:r,posts:t}=e;const n=(0,i.i)({day:"numeric",month:"long",timeZone:"UTC"});return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(l.A,{as:"h3",id:r,children:r}),(0,o.jsx)("ul",{children:t.map((e=>{return(0,o.jsx)("li",{children:(0,o.jsxs)(a.A,{to:e.metadata.permalink,children:[(r=e.metadata.date,n.format(new Date(r)))," - ",e.metadata.title]})},e.metadata.date);var r}))})]})}function h(e){let{years:r}=e;return(0,o.jsx)("section",{className:"margin-vert--lg",children:(0,o.jsx)("div",{className:"container",children:(0,o.jsx)("div",{className:"row",children:r.map(((e,r)=>(0,o.jsx)("div",{className:"col col--4 margin-vert--lg",children:(0,o.jsx)(d,{...e})},r)))})})})}function m(e){let{archive:r}=e;const t=(0,n.T)({id:"theme.blog.archive.title",message:"Archive",description:"The page & hero title of the blog archive page"}),a=(0,n.T)({id:"theme.blog.archive.description",message:"Archive",description:"The page & hero description of the blog archive page"}),i=function(e){const r=e.reduce(((e,r)=>{const t=r.metadata.date.split("-")[0],a=e.get(t)??[];return e.set(t,[r,...a])}),new Map);return Array.from(r,(e=>{let[r,t]=e;return{year:r,posts:t}}))}(r.blogPosts);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.be,{title:t,description:a}),(0,o.jsxs)(c.A,{children:[(0,o.jsx)("header",{className:"hero hero--primary",children:(0,o.jsxs)("div",{className:"container",children:[(0,o.jsx)(l.A,{as:"h1",className:"hero__title",children:t}),(0,o.jsx)("p",{className:"hero__subtitle",children:a})]})}),(0,o.jsx)("main",{children:i.length>0&&(0,o.jsx)(h,{years:i})})]})]})}},9191:(e,r,t)=>{t.d(r,{i:()=>n});var a=t(7639);function n(e){void 0===e&&(e={});const{i18n:{currentLocale:r}}=(0,a.A)(),t=function(){const{i18n:{currentLocale:e,localeConfigs:r}}=(0,a.A)();return r[e].calendar}();return new Intl.DateTimeFormat(r,{calendar:t,...e})}}}]); \ No newline at end of file diff --git a/assets/js/a6aa9e1f.274b4904.js b/assets/js/a6aa9e1f.274b4904.js new file mode 100644 index 0000000..0b2990e --- /dev/null +++ b/assets/js/a6aa9e1f.274b4904.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[7643],{2783:(e,t,n)=>{n.r(t),n.d(t,{default:()=>u});n(6540);var a=n(4164),i=n(7639),s=n(6644),r=n(8630),l=n(6953),o=n(4934),c=n(1210),d=n(4331),g=n(1141),p=n(9101),x=n(4848);function h(e){const t=(0,p.kJ)(e);return(0,x.jsx)(g.A,{children:(0,x.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function j(e){const{metadata:t}=e,{siteConfig:{title:n}}=(0,i.A)(),{blogDescription:a,blogTitle:r,permalink:l}=t,o="/"===l?n:r;return(0,x.jsxs)(x.Fragment,{children:[(0,x.jsx)(s.be,{title:o,description:a}),(0,x.jsx)(c.A,{tag:"blog_posts_list"})]})}function m(e){const{metadata:t,items:n,sidebar:a}=e;return(0,x.jsxs)(l.A,{sidebar:a,children:[(0,x.jsx)(d.A,{items:n}),(0,x.jsx)(o.A,{metadata:t})]})}function u(e){return(0,x.jsxs)(s.e3,{className:(0,a.A)(r.G.wrapper.blogPages,r.G.page.blogListPage),children:[(0,x.jsx)(j,{...e}),(0,x.jsx)(h,{...e}),(0,x.jsx)(m,{...e})]})}},4934:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var a=n(3230),i=n(3555),s=n(4848);function r(e){const{metadata:t}=e,{previousPage:n,nextPage:r}=t;return(0,s.jsxs)("nav",{className:"pagination-nav","aria-label":(0,a.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[n&&(0,s.jsx)(i.A,{permalink:n,title:(0,s.jsx)(a.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer entries"})}),r&&(0,s.jsx)(i.A,{permalink:r,title:(0,s.jsx)(a.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older entries"}),isNext:!0})]})}},4331:(e,t,n)=>{n.d(t,{A:()=>r});n(6540);var a=n(9101),i=n(8406),s=n(4848);function r(e){let{items:t,component:n=i.A}=e;return(0,s.jsx)(s.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,s.jsx)(a.in,{content:t,children:(0,s.jsx)(n,{children:(0,s.jsx)(t,{})})},t.metadata.permalink)}))})}}}]); \ No newline at end of file diff --git a/assets/js/a6aa9e1f.f7ba2db4.js b/assets/js/a6aa9e1f.f7ba2db4.js deleted file mode 100644 index ea77d9e..0000000 --- a/assets/js/a6aa9e1f.f7ba2db4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[7643],{7605:(e,t,a)=>{a.r(t),a.d(t,{default:()=>f});a(6540);var n=a(4164),i=a(1059),r=a(4714),o=a(8570),s=a(1510),l=a(7954),d=a(6758),c=a(943),g=a(4993),p=a(2818),u=a(4848);function m(e){const t=(0,p.k)(e);return(0,u.jsx)(g.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}function h(e){const{metadata:t}=e,{siteConfig:{title:a}}=(0,i.A)(),{blogDescription:n,blogTitle:o,permalink:s}=t,l="/"===s?a:o;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(r.be,{title:l,description:n}),(0,u.jsx)(d.A,{tag:"blog_posts_list"})]})}function b(e){const{metadata:t,items:a,sidebar:n}=e;return(0,u.jsxs)(s.A,{sidebar:n,children:[(0,u.jsx)(c.A,{items:a}),(0,u.jsx)(l.A,{metadata:t})]})}function f(e){return(0,u.jsxs)(r.e3,{className:(0,n.A)(o.G.wrapper.blogPages,o.G.page.blogListPage),children:[(0,u.jsx)(h,{...e}),(0,u.jsx)(m,{...e}),(0,u.jsx)(b,{...e})]})}},7954:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var n=a(6885),i=a(9215),r=a(4848);function o(e){const{metadata:t}=e,{previousPage:a,nextPage:o}=t;return(0,r.jsxs)("nav",{className:"pagination-nav","aria-label":(0,n.T)({id:"theme.blog.paginator.navAriaLabel",message:"Blog list page navigation",description:"The ARIA label for the blog pagination"}),children:[a&&(0,r.jsx)(i.A,{permalink:a,title:(0,r.jsx)(n.A,{id:"theme.blog.paginator.newerEntries",description:"The label used to navigate to the newer blog posts page (previous page)",children:"Newer Entries"})}),o&&(0,r.jsx)(i.A,{permalink:o,title:(0,r.jsx)(n.A,{id:"theme.blog.paginator.olderEntries",description:"The label used to navigate to the older blog posts page (next page)",children:"Older Entries"}),isNext:!0})]})}},943:(e,t,a)=>{a.d(t,{A:()=>o});a(6540);var n=a(542),i=a(4247),r=a(4848);function o(e){let{items:t,component:a=i.A}=e;return(0,r.jsx)(r.Fragment,{children:t.map((e=>{let{content:t}=e;return(0,r.jsx)(n.i,{content:t,children:(0,r.jsx)(a,{children:(0,r.jsx)(t,{})})},t.metadata.permalink)}))})}},2818:(e,t,a)=>{a.d(t,{k:()=>c,J:()=>g});var n=a(5176),i=a(1059),r=a(5860);var o=a(542);const s=e=>new Date(e).toISOString();function l(e){const t=e.map(p);return{author:1===t.length?t[0]:t}}function d(e,t,a){return e?{image:u({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function c(e){const{siteConfig:t}=(0,i.A)(),{withBaseUrl:a}=(0,n.hH)(),{metadata:{blogDescription:r,blogTitle:o,permalink:c}}=e,g=`${t.url}${c}`;return{"@context":"https://schema.org","@type":"Blog","@id":g,mainEntityOfPage:g,headline:o,description:r,blogPost:e.items.map((e=>function(e,t,a){const{assets:n,frontMatter:i,metadata:r}=e,{date:o,title:c,description:g,lastUpdatedAt:p}=r,u=n.image??i.image,m=i.keywords??[],h=`${t.url}${r.permalink}`,b=p?s(p):void 0;return{"@type":"BlogPosting","@id":h,mainEntityOfPage:h,url:h,headline:c,name:c,description:g,datePublished:o,...b?{dateModified:b}:{},...l(r.authors),...d(u,a,c),...m?{keywords:m}:{}}}(e.content,t,a)))}}function g(){const e=function(){const e=(0,r.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}(),{assets:t,metadata:a}=(0,o.e)(),{siteConfig:c}=(0,i.A)(),{withBaseUrl:g}=(0,n.hH)(),{date:p,title:u,description:m,frontMatter:h,lastUpdatedAt:b}=a,f=t.image??h.image,x=h.keywords??[],j=b?s(b):void 0,A=`${c.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":A,mainEntityOfPage:A,url:A,headline:u,name:u,description:m,datePublished:p,...j?{dateModified:j}:{},...l(a.authors),...d(f,g,u),...x?{keywords:x}:{},isPartOf:{"@type":"Blog","@id":`${c.url}${e.blogBasePath}`,name:e.blogTitle}}}function p(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function u(e){let{imageUrl:t,caption:a}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:a}}}}]); \ No newline at end of file diff --git a/assets/js/a7bd4aaa.20a6c468.js b/assets/js/a7bd4aaa.20a6c468.js new file mode 100644 index 0000000..1fc0591 --- /dev/null +++ b/assets/js/a7bd4aaa.20a6c468.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[7098],{2881:(n,e,s)=>{s.r(e),s.d(e,{default:()=>d});s(6540);var r=s(6644),o=s(3718),t=s(1704),i=s(2831),c=s(1210),a=s(4848);function u(n){const{version:e}=n;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(c.A,{version:e.version,tag:(0,o.k)(e.pluginId,e.version)}),(0,a.jsx)(r.be,{children:e.noIndex&&(0,a.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function l(n){const{version:e,route:s}=n;return(0,a.jsx)(r.e3,{className:e.className,children:(0,a.jsx)(t.n,{version:e,children:(0,i.v)(s.routes)})})}function d(n){return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(u,{...n}),(0,a.jsx)(l,{...n})]})}}}]); \ No newline at end of file diff --git a/assets/js/a7bd4aaa.64a6a31e.js b/assets/js/a7bd4aaa.64a6a31e.js deleted file mode 100644 index afc6c12..0000000 --- a/assets/js/a7bd4aaa.64a6a31e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[7098],{2341:(n,e,s)=>{s.r(e),s.d(e,{default:()=>d});s(6540);var r=s(4714),o=s(1358),t=s(8647),i=s(2831),c=s(6758),a=s(4848);function u(n){const{version:e}=n;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(c.A,{version:e.version,tag:(0,o.tU)(e.pluginId,e.version)}),(0,a.jsx)(r.be,{children:e.noIndex&&(0,a.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function l(n){const{version:e,route:s}=n;return(0,a.jsx)(r.e3,{className:e.className,children:(0,a.jsx)(t.n,{version:e,children:(0,i.v)(s.routes)})})}function d(n){return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(u,{...n}),(0,a.jsx)(l,{...n})]})}}}]); \ No newline at end of file diff --git a/assets/js/a94703ab.3a918a31.js b/assets/js/a94703ab.3a918a31.js deleted file mode 100644 index 2665293..0000000 --- a/assets/js/a94703ab.3a918a31.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[9048],{5688:(e,t,n)=>{n.r(t),n.d(t,{default:()=>be});var a=n(6540),o=n(4164),i=n(4714),s=n(8570),l=n(4658),r=n(447),c=n(6885),d=n(5865),u=n(695);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(4848);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l}=(0,d.gk)();return(0,d.Mq)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a{e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.A)("clean-btn",s.G.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(7482),x=n(6347),f=n(4756),j=n(7513),v=n(7712);function _(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const A={collapseSidebarButton:"collapseSidebarButton_PEFL",collapseSidebarButtonIcon:"collapseSidebarButtonIcon_kv0_"};function g(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,c.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.A)("button button--secondary button--outline",A.collapseSidebarButton),onClick:t,children:(0,b.jsx)(_,{className:A.collapseSidebarButtonIcon})})}var k=n(4686),C=n(1971);const S=Symbol("EmptyContext"),T=a.createContext(S);function N(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),i=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return(0,b.jsx)(T.Provider,{value:i,children:t})}var I=n(5545),B=n(5728),y=n(7083),w=n(5482);function L(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,c.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),"aria-expanded":!t,type:"button",className:"clean-btn menu__caret",onClick:a})}function E(e){let{item:t,onItemClick:n,activePath:i,level:r,index:c,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:f}}}=(0,j.p)(),v=function(e){const t=(0,w.A)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.Nr)(e):void 0),[e,t])}(t),_=(0,l.w8)(t,i),A=(0,B.ys)(x,i),{collapsed:g,setCollapsed:k}=(0,I.u)({initialState:()=>!!h&&(!_&&t.collapsed)}),{expandedItem:N,setExpandedItem:E}=function(){const e=(0,a.useContext)(T);if(e===S)throw new C.dV("DocSidebarItemsExpandedStateProvider");return e}(),M=function(e){void 0===e&&(e=!g),E(e?null:c),k(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,C.ZC)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:_,collapsed:g,updateCollapsed:M}),(0,a.useEffect)((()=>{h&&null!=N&&N!==c&&f&&k(!0)}),[h,N,c,k,f]),(0,b.jsxs)("li",{className:(0,o.A)(s.G.docs.docSidebarItemCategory,s.G.docs.docSidebarItemCategoryLevel(r),"menu__list-item",{"menu__list-item--collapsed":g},p),children:[(0,b.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":A}),children:[(0,b.jsx)(y.A,{className:(0,o.A)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":_}),onClick:h?e=>{n?.(t),x?M(!1):(e.preventDefault(),M())}:()=>{n?.(t)},"aria-current":A?"page":void 0,role:h&&!x?"button":void 0,"aria-expanded":h&&!x?!g:void 0,href:h?v??"#":v,...d,children:m}),x&&h&&(0,b.jsx)(L,{collapsed:g,categoryLabel:m,onClick:e=>{e.preventDefault(),M()}})]}),(0,b.jsx)(I.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:g,children:(0,b.jsx)(U,{items:u,tabIndex:g?-1:0,onItemClick:n,activePath:i,level:r+1})})]})}var M=n(5881),H=n(521);const G={menuExternalLink:"menuExternalLink_NmtK"};function W(e){let{item:t,onItemClick:n,activePath:a,level:i,index:r,...c}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l.w8)(t,a),x=(0,M.A)(d);return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(y.A,{className:(0,o.A)("menu__link",!x&&G.menuExternalLink,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...c,children:[u,!x&&(0,b.jsx)(H.A,{})]})},u)}const P={menuHtmlItem:"menuHtmlItem_M9Kj"};function R(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:r}=t;return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(n),l&&[P.menuHtmlItem,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:i}},a)}function D(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(E,{item:t,...n});case"html":return(0,b.jsx)(R,{item:t,...n});default:return(0,b.jsx)(W,{item:t,...n})}}function F(e){let{items:t,...n}=e;const a=(0,l.Y)(t,n.activePath);return(0,b.jsx)(N,{children:a.map(((e,t)=>(0,b.jsx)(D,{item:e,index:t,...n},t)))})}const U=(0,a.memo)(F),V={menu:"menu_SIkG",menuWithAnnouncementBar:"menuWithAnnouncementBar_GW3s"};function Y(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,k.M)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,c.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",V.menu,l&&V.menuWithAnnouncementBar,i),children:(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:n,activePath:t,level:1})})})}const K="sidebar_njMd",z="sidebarWithHideableNavbar_wUlq",q="sidebarHidden_VK0M",O="sidebarLogo_isFc";function J(e){let{path:t,sidebar:n,onCollapse:a,isHidden:i}=e;const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:l}}}=(0,j.p)();return(0,b.jsxs)("div",{className:(0,o.A)(K,s&&z,i&&q),children:[s&&(0,b.jsx)(v.A,{tabIndex:-1,className:O}),(0,b.jsx)(Y,{path:t,sidebar:n}),l&&(0,b.jsx)(g,{onClick:a})]})}const Q=a.memo(J);var X=n(6703),Z=n(3123);const $=e=>{let{sidebar:t,path:n}=e;const a=(0,Z.M)();return(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(U,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&a.toggle(),"link"===e.type&&a.toggle()},level:1})})};function ee(e){return(0,b.jsx)(X.GX,{component:$,props:e})}const te=a.memo(ee);function ne(e){const t=(0,f.l)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(Q,{...e}),a&&(0,b.jsx)(te,{...e})]})}const ae={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function oe(e){let{toggleSidebar:t}=e;return(0,b.jsx)("div",{className:ae.expandButton,title:(0,c.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t,children:(0,b.jsx)(_,{className:ae.expandButtonIcon})})}const ie={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function se(e){let{children:t}=e;const n=(0,r.t)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function le(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.zy)(),[r,c]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{r&&c(!1),!r&&(0,p.O)()&&c(!0),i((e=>!e))}),[i,r]);return(0,b.jsx)("aside",{className:(0,o.A)(s.G.docs.docSidebarContainer,ie.docSidebarContainer,n&&ie.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(ie.docSidebarContainer)&&n&&c(!0)},children:(0,b.jsx)(se,{children:(0,b.jsxs)("div",{className:(0,o.A)(ie.sidebarViewport,r&&ie.sidebarViewportHidden),children:[(0,b.jsx)(ne,{sidebar:t,path:l,onCollapse:d,isHidden:r}),r&&(0,b.jsx)(oe,{toggleSidebar:d})]})})})}const re={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ce(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,r.t)();return(0,b.jsx)("main",{className:(0,o.A)(re.docMainContainer,(t||!a)&&re.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",re.docItemWrapper,t&&re.docItemWrapperEnhanced),children:n})})}const de={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function ue(e){let{children:t}=e;const n=(0,r.t)(),[o,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:de.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:de.docRoot,children:[n&&(0,b.jsx)(le,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(ce,{hiddenSidebarContainer:o,children:t})]})]})}var me=n(666);function be(e){const t=(0,l.B5)(e);if(!t)return(0,b.jsx)(me.A,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(i.e3,{className:(0,o.A)(s.G.page.docsDocPage),children:(0,b.jsx)(r.V,{name:a,items:c,children:(0,b.jsx)(ue,{children:n})})})}},666:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var a=n(4164),o=n(6885),i=n(2067),s=n(4848);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.A)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]); \ No newline at end of file diff --git a/assets/js/a94703ab.9b36d8eb.js b/assets/js/a94703ab.9b36d8eb.js new file mode 100644 index 0000000..50b2e68 --- /dev/null +++ b/assets/js/a94703ab.9b36d8eb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[9048],{8001:(e,t,n)=>{n.r(t),n.d(t,{default:()=>pe});var a=n(6540),o=n(4164),i=n(6644),s=n(8630),l=n(5357),r=n(40),c=n(3230),d=n(4245),u=n(4067);const m={backToTopButton:"backToTopButton_sjWU",backToTopButtonShow:"backToTopButtonShow_xfvO"};var b=n(4848);function h(){const{shown:e,scrollToTop:t}=function(e){let{threshold:t}=e;const[n,o]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:l}=(0,d.gk)();return(0,d.Mq)(((e,n)=>{let{scrollY:a}=e;const s=n?.scrollY;s&&(i.current?i.current=!1:a>=s?(l(),o(!1)):a {e.location.hash&&(i.current=!0,o(!1))})),{shown:n,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.A)("clean-btn",s.G.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(6350),x=n(6347),f=n(2216),j=n(6957),v=n(20);function _(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const g="collapseSidebarButton_PEFL",A="collapseSidebarButtonIcon_kv0_";function C(e){let{onClick:t}=e;return(0,b.jsx)("button",{type:"button",title:(0,c.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.A)("button button--secondary button--outline",g),onClick:t,children:(0,b.jsx)(_,{className:A})})}var k=n(2),S=n(4799);const T=Symbol("EmptyContext"),N=a.createContext(T);function I(e){let{children:t}=e;const[n,o]=(0,a.useState)(null),i=(0,a.useMemo)((()=>({expandedItem:n,setExpandedItem:o})),[n]);return(0,b.jsx)(N.Provider,{value:i,children:t})}var y=n(4549),B=n(260),w=n(4783),L=n(1062);function E(e){let{collapsed:t,categoryLabel:n,onClick:a}=e;return(0,b.jsx)("button",{"aria-label":t?(0,c.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:n}):(0,c.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:n}),"aria-expanded":!t,type:"button",className:"clean-btn menu__caret",onClick:a})}function M(e){let{item:t,onItemClick:n,activePath:i,level:r,index:c,...d}=e;const{items:u,label:m,collapsible:h,className:p,href:x}=t,{docs:{sidebar:{autoCollapseCategories:f}}}=(0,j.p)(),v=function(e){const t=(0,L.A)();return(0,a.useMemo)((()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,l.Nr)(e):void 0),[e,t])}(t),_=(0,l.w8)(t,i),g=(0,B.ys)(x,i),{collapsed:A,setCollapsed:C}=(0,y.u)({initialState:()=>!!h&&(!_&&t.collapsed)}),{expandedItem:k,setExpandedItem:I}=function(){const e=(0,a.useContext)(N);if(e===T)throw new S.dV("DocSidebarItemsExpandedStateProvider");return e}(),M=function(e){void 0===e&&(e=!A),I(e?null:c),C(e)};return function(e){let{isActive:t,collapsed:n,updateCollapsed:o}=e;const i=(0,S.ZC)(t);(0,a.useEffect)((()=>{t&&!i&&n&&o(!1)}),[t,i,n,o])}({isActive:_,collapsed:A,updateCollapsed:M}),(0,a.useEffect)((()=>{h&&null!=k&&k!==c&&f&&C(!0)}),[h,k,c,C,f]),(0,b.jsxs)("li",{className:(0,o.A)(s.G.docs.docSidebarItemCategory,s.G.docs.docSidebarItemCategoryLevel(r),"menu__list-item",{"menu__list-item--collapsed":A},p),children:[(0,b.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":g}),children:[(0,b.jsx)(w.A,{className:(0,o.A)("menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!x&&h,"menu__link--active":_}),onClick:h?e=>{n?.(t),x?M(!1):(e.preventDefault(),M())}:()=>{n?.(t)},"aria-current":g?"page":void 0,role:h&&!x?"button":void 0,"aria-expanded":h&&!x?!A:void 0,href:h?v??"#":v,...d,children:m}),x&&h&&(0,b.jsx)(E,{collapsed:A,categoryLabel:m,onClick:e=>{e.preventDefault(),M()}})]}),(0,b.jsx)(y.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:A,children:(0,b.jsx)(V,{items:u,tabIndex:A?-1:0,onItemClick:n,activePath:i,level:r+1})})]})}var H=n(877),G=n(716);const P="menuExternalLink_NmtK";function R(e){let{item:t,onItemClick:n,activePath:a,level:i,index:r,...c}=e;const{href:d,label:u,className:m,autoAddBaseUrl:h}=t,p=(0,l.w8)(t,a),x=(0,H.A)(d);return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(i),"menu__list-item",m),children:(0,b.jsxs)(w.A,{className:(0,o.A)("menu__link",!x&&P,{"menu__link--active":p}),autoAddBaseUrl:h,"aria-current":p?"page":void 0,to:d,...x&&{onClick:n?()=>n(t):void 0},...c,children:[u,!x&&(0,b.jsx)(G.A,{})]})},u)}const W="menuHtmlItem_M9Kj";function D(e){let{item:t,level:n,index:a}=e;const{value:i,defaultStyle:l,className:r}=t;return(0,b.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(n),l&&[W,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:i}},a)}function F(e){let{item:t,...n}=e;switch(t.type){case"category":return(0,b.jsx)(M,{item:t,...n});case"html":return(0,b.jsx)(D,{item:t,...n});default:return(0,b.jsx)(R,{item:t,...n})}}function U(e){let{items:t,...n}=e;const a=(0,l.Y)(t,n.activePath);return(0,b.jsx)(I,{children:a.map(((e,t)=>(0,b.jsx)(F,{item:e,index:t,...n},t)))})}const V=(0,a.memo)(U),Y="menu_SIkG",K="menuWithAnnouncementBar_GW3s";function z(e){let{path:t,sidebar:n,className:i}=e;const l=function(){const{isActive:e}=(0,k.M)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)((t=>{let{scrollY:a}=t;e&&n(0===a)}),[e]),e&&t}();return(0,b.jsx)("nav",{"aria-label":(0,c.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",Y,l&&K,i),children:(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:n,activePath:t,level:1})})})}const q="sidebar_njMd",O="sidebarWithHideableNavbar_wUlq",J="sidebarHidden_VK0M",Q="sidebarLogo_isFc";function X(e){let{path:t,sidebar:n,onCollapse:a,isHidden:i}=e;const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:l}}}=(0,j.p)();return(0,b.jsxs)("div",{className:(0,o.A)(q,s&&O,i&&J),children:[s&&(0,b.jsx)(v.A,{tabIndex:-1,className:Q}),(0,b.jsx)(z,{path:t,sidebar:n}),l&&(0,b.jsx)(C,{onClick:a})]})}const Z=a.memo(X);var $=n(763),ee=n(5755);const te=e=>{let{sidebar:t,path:n}=e;const a=(0,ee.M)();return(0,b.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(V,{items:t,activePath:n,onItemClick:e=>{"category"===e.type&&e.href&&a.toggle(),"link"===e.type&&a.toggle()},level:1})})};function ne(e){return(0,b.jsx)($.GX,{component:te,props:e})}const ae=a.memo(ne);function oe(e){const t=(0,f.l)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(Z,{...e}),a&&(0,b.jsx)(ae,{...e})]})}const ie={expandButton:"expandButton_TmdG",expandButtonIcon:"expandButtonIcon_i1dp"};function se(e){let{toggleSidebar:t}=e;return(0,b.jsx)("div",{className:ie.expandButton,title:(0,c.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:t,onClick:t,children:(0,b.jsx)(_,{className:ie.expandButtonIcon})})}const le={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function re(e){let{children:t}=e;const n=(0,r.t)();return(0,b.jsx)(a.Fragment,{children:t},n?.name??"noSidebar")}function ce(e){let{sidebar:t,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}=e;const{pathname:l}=(0,x.zy)(),[r,c]=(0,a.useState)(!1),d=(0,a.useCallback)((()=>{r&&c(!1),!r&&(0,p.O)()&&c(!0),i((e=>!e))}),[i,r]);return(0,b.jsx)("aside",{className:(0,o.A)(s.G.docs.docSidebarContainer,le.docSidebarContainer,n&&le.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(le.docSidebarContainer)&&n&&c(!0)},children:(0,b.jsx)(re,{children:(0,b.jsxs)("div",{className:(0,o.A)(le.sidebarViewport,r&&le.sidebarViewportHidden),children:[(0,b.jsx)(oe,{sidebar:t,path:l,onCollapse:d,isHidden:r}),r&&(0,b.jsx)(se,{toggleSidebar:d})]})})})}const de={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function ue(e){let{hiddenSidebarContainer:t,children:n}=e;const a=(0,r.t)();return(0,b.jsx)("main",{className:(0,o.A)(de.docMainContainer,(t||!a)&&de.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",de.docItemWrapper,t&&de.docItemWrapperEnhanced),children:n})})}const me={docRoot:"docRoot_UBD9",docsWrapper:"docsWrapper_hBAB"};function be(e){let{children:t}=e;const n=(0,r.t)(),[o,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:me.docsWrapper,children:[(0,b.jsx)(h,{}),(0,b.jsxs)("div",{className:me.docRoot,children:[n&&(0,b.jsx)(ce,{sidebar:n.items,hiddenSidebarContainer:o,setHiddenSidebarContainer:i}),(0,b.jsx)(ue,{hiddenSidebarContainer:o,children:t})]})]})}var he=n(3510);function pe(e){const t=(0,l.B5)(e);if(!t)return(0,b.jsx)(he.A,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(i.e3,{className:(0,o.A)(s.G.page.docsDocPage),children:(0,b.jsx)(r.V,{name:a,items:c,children:(0,b.jsx)(be,{children:n})})})}},3510:(e,t,n)=>{n.d(t,{A:()=>l});n(6540);var a=n(4164),o=n(3230),i=n(5225),s=n(4848);function l(e){let{className:t}=e;return(0,s.jsx)("main",{className:(0,a.A)("container margin-vert--xl",t),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]); \ No newline at end of file diff --git a/assets/js/acecf23e.bf02d3bc.js b/assets/js/acecf23e.bf02d3bc.js deleted file mode 100644 index 4cfd784..0000000 --- a/assets/js/acecf23e.bf02d3bc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[1903],{1912:e=>{e.exports=JSON.parse('{"blogBasePath":"/changelog","blogTitle":"Changelog"}')}}]); \ No newline at end of file diff --git a/assets/js/acecf23e.c145897b.js b/assets/js/acecf23e.c145897b.js new file mode 100644 index 0000000..c18da17 --- /dev/null +++ b/assets/js/acecf23e.c145897b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[1903],{1912:s=>{s.exports=JSON.parse('{"blogBasePath":"/changelog","blogTitle":"Changelog","authorsListPath":"/changelog/authors"}')}}]); \ No newline at end of file diff --git a/assets/js/af805925.0d925c06.js b/assets/js/af805925.0d925c06.js deleted file mode 100644 index e16cdda..0000000 --- a/assets/js/af805925.0d925c06.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[8603],{211:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>a,metadata:()=>c,toc:()=>o});var i=n(4848),r=n(8453);const a={id:"a9s-cli-a8s",title:"a9s CLI a8s",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]},t="a8s Stack",c={id:"a9s-cli-a8s",title:"a9s CLI a8s",description:"Create a local Kubernetes cluster using Minikube or Kind, install a8s PostgreSQL including its dependencies as well as a local Minio object store.",source:"@site/docs/a9s-cli-a8s.md",sourceDirName:".",slug:"/a9s-cli-a8s",permalink:"/docs/develop/a9s-cli-a8s",draft:!1,unlisted:!1,tags:[{inline:!0,label:"a9s cli",permalink:"/docs/develop/tags/a-9-s-cli"},{inline:!0,label:"a9s hub",permalink:"/docs/develop/tags/a-9-s-hub"},{inline:!0,label:"a9s data services",permalink:"/docs/develop/tags/a-9-s-data-services"},{inline:!0,label:"a8s data services",permalink:"/docs/develop/tags/a-8-s-data-services"},{inline:!0,label:"a9s postgres",permalink:"/docs/develop/tags/a-9-s-postgres"},{inline:!0,label:"a8s postgres",permalink:"/docs/develop/tags/a-8-s-postgres"},{inline:!0,label:"data service",permalink:"/docs/develop/tags/data-service"},{inline:!0,label:"introduction",permalink:"/docs/develop/tags/introduction"},{inline:!0,label:"kubernetes",permalink:"/docs/develop/tags/kubernetes"},{inline:!0,label:"minikube",permalink:"/docs/develop/tags/minikube"},{inline:!0,label:"kind",permalink:"/docs/develop/tags/kind"},{inline:!0,label:"klutch",permalink:"/docs/develop/tags/klutch"}],version:"current",frontMatter:{id:"a9s-cli-a8s",title:"a9s CLI a8s",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]},sidebar:"tutorialSidebar",next:{title:"a9s CLI",permalink:"/docs/develop/a9s-cli"}},l={},o=[{value:"Cold-Run",id:"cold-run",level:2},{value:"Setting Up a Working Directory",id:"setting-up-a-working-directory",level:3},{value:"Configuring the Backup Store",id:"configuring-the-backup-store",level:3},{value:"Skip Checking Prerequisites",id:"skip-checking-prerequisites",level:2},{value:"Number of Kubernetes Nodes",id:"number-of-kubernetes-nodes",level:2},{value:"Cluster Memory",id:"cluster-memory",level:2},{value:"Deployment Version",id:"deployment-version",level:2},{value:"Kubernetes Provider",id:"kubernetes-provider",level:2},{value:"Backup Infrastructure Region",id:"backup-infrastructure-region",level:2},{value:"Unattended Mode",id:"unattended-mode",level:2},{value:"Printing the Working Directory",id:"printing-the-working-directory",level:2},{value:"Creating a PostgreSQL Service Instance",id:"creating-a-postgresql-service-instance",level:2},{value:"Creating PostgreSQL Service Instance YAML Without Applying it",id:"creating-postgresql-service-instance-yaml-without-applying-it",level:3},{value:"Creating a Custom PostgreSQL Service Instance",id:"creating-a-custom-postgresql-service-instance",level:3},{value:"Deleting a PostgreSQL Service Instance",id:"deleting-a-postgresql-service-instance",level:2},{value:"Applying a SQL File to a PostgreSQL Service Instance",id:"applying-a-sql-file-to-a-postgresql-service-instance",level:2},{value:"Applying a SQL Statement to a PostgreSQL Service Instance",id:"applying-a-sql-statement-to-a-postgresql-service-instance",level:2},{value:"Creating a Backup of a PostgreSQL Service Instance",id:"creating-a-backup-of-a-postgresql-service-instance",level:2},{value:"Restoring a Backup of PostgreSQL Service Instance",id:"restoring-a-backup-of-postgresql-service-instance",level:2},{value:"Creating a PostgreSQL Service Binding",id:"creating-a-postgresql-service-binding",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(s.h1,{id:"a8s-stack",children:[(0,i.jsx)(s.code,{children:"a8s"})," Stack"]}),"\n",(0,i.jsx)(s.h1,{id:"creating-a-local-a8s-postgres-cluster",children:"Creating a Local a8s Postgres Cluster"}),"\n",(0,i.jsxs)(s.p,{children:["Create a local Kubernetes cluster using ",(0,i.jsx)(s.code,{children:"Minikube"})," or ",(0,i.jsx)(s.code,{children:"Kind"}),", ",(0,i.jsx)(s.strong,{children:"install a8s PostgreSQL"})," including its dependencies as well as a local ",(0,i.jsx)(s.a,{href:"https://min.io/",children:"Minio"})," object store."]}),"\n",(0,i.jsxs)(s.p,{children:["Get ready for ",(0,i.jsx)(s.strong,{children:"local development of applications with PostgreSQL"})," and/or ",(0,i.jsx)(s.strong,{children:"experimentation with a8s Postgres"})," by issuing the command:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s\n"})}),"\n",(0,i.jsx)(s.p,{children:"Recommended is 12 GB of free memory for the creation of three cluster nodes with each 4 GB. The number of nodes and memory size can be adjusted."}),"\n",(0,i.jsx)(s.h2,{id:"cold-run",children:"Cold-Run"}),"\n",(0,i.jsx)(s.p,{children:"When creating a cluster for the first time, a few setup steps will have to be taken which need to be performed only once:"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Setting up a working directory for the use with the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI. ",(0,i.jsx)(s.strong,{children:"This step asks for your confirmation of the proposed directory."})]}),"\n",(0,i.jsx)(s.li,{children:"Configuring the access credentials for the S3 compatible object store which is needed to use the backup/restore feature of a8s Postgres. This step is performed automatically."}),"\n",(0,i.jsxs)(s.li,{children:["Cloning deployment resources required by the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI to create a cluster. This step is performed automatically."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"setting-up-a-working-directory",children:"Setting Up a Working Directory"}),"\n",(0,i.jsxs)(s.p,{children:["The working directory is where are ",(0,i.jsx)(s.code,{children:"a9s"})," CLI related resources will go. This includes ",(0,i.jsx)(s.code,{children:"yaml"})," specifications being cloned from remote repositories, but also those generated by the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI for your convenience."]}),"\n",(0,i.jsxs)(s.p,{children:["Once established, the working directory is stored in the ",(0,i.jsx)(s.code,{children:"~/.a9s"})," configuration file."]}),"\n",(0,i.jsxs)(s.p,{children:["The default working directory is ",(0,i.jsx)(s.code,{children:"~/a9s"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"Alternatively, provide a custom working directory at the corresponding prompt."}),"\n",(0,i.jsx)(s.h3,{id:"configuring-the-backup-store",children:"Configuring the Backup Store"}),"\n",(0,i.jsx)(s.p,{children:"A non-prod Minio object store is installed in your local Kubernetes cluster and is automatically configured as the default backup store for a8s PostgreSQL backups."}),"\n",(0,i.jsxs)(s.p,{children:["If you want to use an alternative backup store, see ",(0,i.jsx)(s.code,{children:"a9s create cluster a8s --help"})," for the defaults of your particular CLI version and list of configuration options."]}),"\n",(0,i.jsx)(s.p,{children:"Most S3 compatible object stores, including AWS S3 itself of course, should work."}),"\n",(0,i.jsx)(s.h2,{id:"skip-checking-prerequisites",children:"Skip Checking Prerequisites"}),"\n",(0,i.jsx)(s.p,{children:"It is possible to skip the verification of prerequisites. This includes skipping the search for: required shell commands, a running Docker daemon and a running Kubernetes cluster."}),"\n",(0,i.jsxs)(s.p,{children:["In order to skip precheck use the ",(0,i.jsx)(s.code,{children:"--no-precheck"})," option:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --no-precheck\n"})}),"\n",(0,i.jsx)(s.h2,{id:"number-of-kubernetes-nodes",children:"Number of Kubernetes Nodes"}),"\n",(0,i.jsx)(s.p,{children:"Specifying the number of Nodes in the Kubernetes cluster:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --cluster-nr-of-nodes 1\n"})}),"\n",(0,i.jsx)(s.h2,{id:"cluster-memory",children:"Cluster Memory"}),"\n",(0,i.jsxs)(s.p,{children:["Specifying the memory of ",(0,i.jsx)(s.strong,{children:"each"})," Node of the Kubernetes cluster:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --cluster-memory 4gb\n"})}),"\n",(0,i.jsx)(s.h2,{id:"deployment-version",children:"Deployment Version"}),"\n",(0,i.jsxs)(s.p,{children:["The deployment version refers to the version of manifests used for installing software. Deployment versions are managed by anynines in a Git repository. The deployment version option allows you to select a particular version of the deployment manifests identified by ",(0,i.jsx)(s.strong,{children:"Git tags"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["Select a particular release by providing the ",(0,i.jsx)(s.code,{children:"--deployment-version"})," parameter:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --deployment-version v1.2.0\n"})}),"\n",(0,i.jsx)(s.p,{children:"Use:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --deployment-version latest\n"})}),"\n",(0,i.jsx)(s.p,{children:"To get the latest, untagged version of the deployment manifests."}),"\n",(0,i.jsx)(s.h2,{id:"kubernetes-provider",children:"Kubernetes Provider"}),"\n",(0,i.jsxs)(s.p,{children:["When creating a Kubernetes cluster, the mechanism to manage the cluster can be selected by specifying the ",(0,i.jsx)(s.code,{children:"--provider"})," option:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s -p kind \na9s create cluster a8s -p minikube (default)\n"})}),"\n",(0,i.jsx)(s.p,{children:"Follow the instructions to learn about available sub commands."}),"\n",(0,i.jsx)(s.h2,{id:"backup-infrastructure-region",children:"Backup Infrastructure Region"}),"\n",(0,i.jsxs)(s.p,{children:["When using the backup and restore functionality, a backup infrastructure region must be specified by using the ",(0,i.jsx)(s.code,{children:"--backup-region"})," option:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --backup-region us-east-1\n"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note"}),": By default, an existing ",(0,i.jsx)(s.code,{children:"backup-config.yaml"})," will be used. Hence, if you intend to change\nyour backup config, remove the existing ",(0,i.jsx)(s.code,{children:"backup-config.yaml"}),", first:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"rm a8s-deployment/deploy/a8s/backup-config/backup-store-config.yaml\n"})}),"\n",(0,i.jsx)(s.h2,{id:"unattended-mode",children:"Unattended Mode"}),"\n",(0,i.jsxs)(s.p,{children:["It is possible to skip all yes-no questions by ",(0,i.jsx)(s.strong,{children:"enabling the unattended mode"})," by passing the ",(0,i.jsx)(s.code,{children:"-y"})," or ",(0,i.jsx)(s.code,{children:"--yes"})," flag:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --yes\n"})}),"\n",(0,i.jsx)(s.h2,{id:"printing-the-working-directory",children:"Printing the Working Directory"}),"\n",(0,i.jsxs)(s.p,{children:["The working directory is stored in the ",(0,i.jsx)(s.code,{children:"~/.a8s"})," configuration file. The working directory contains all resources downloaded and generated by the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI."]}),"\n",(0,i.jsx)(s.p,{children:"To print the working directory execute:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s cluster pwd\n"})}),"\n",(0,i.jsx)(s.h1,{id:"a8s-postgresql",children:"a8s PostgreSQL"}),"\n",(0,i.jsxs)(s.p,{children:["A selected subset of the a8s PostgreSQL features are available through the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI."]}),"\n",(0,i.jsx)(s.h2,{id:"creating-a-postgresql-service-instance",children:"Creating a PostgreSQL Service Instance"}),"\n",(0,i.jsxs)(s.p,{children:["Creating a service instance with the name ",(0,i.jsx)(s.code,{children:"sample-pg-cluster"}),":"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --name sample-pg-cluster\n"})}),"\n",(0,i.jsxs)(s.p,{children:["The generated YAML specification will be stored in the ",(0,i.jsx)(s.code,{children:"usermanifests"}),"."]}),"\n",(0,i.jsx)(s.h3,{id:"creating-postgresql-service-instance-yaml-without-applying-it",children:"Creating PostgreSQL Service Instance YAML Without Applying it"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --name sample-pg-cluster --no-apply\n"})}),"\n",(0,i.jsxs)(s.p,{children:["The generated YAML specification will be stored in the ",(0,i.jsx)(s.code,{children:"usermanifests"})," but ",(0,i.jsx)(s.code,{children:"kubectl apply"})," won't be executed."]}),"\n",(0,i.jsx)(s.h3,{id:"creating-a-custom-postgresql-service-instance",children:"Creating a Custom PostgreSQL Service Instance"}),"\n",(0,i.jsx)(s.p,{children:"The command:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --api-version v1beta3 --name sample-pg-cluster --namespace default --replicas 3 --requests-cpu 200m --limits-memory 200Mi --service-version 14 --volume-size 2Gi\n"})}),"\n",(0,i.jsxs)(s.p,{children:["Will generate a YAML spec called ",(0,i.jsx)(s.code,{children:"usermanifests/my-pg-instance.yaml"})," with the following content:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"apiVersion: postgresql.anynines.com/v1beta3\nkind: Postgresql\nmetadata:\n name: my-pg\nspec:\n replicas: 3\n resources:\n limits:\n memory: 200m\n requests:\n cpu: 200m\n version: 14\n volumeSize: 2Gi\n"})}),"\n",(0,i.jsx)(s.h2,{id:"deleting-a-postgresql-service-instance",children:"Deleting a PostgreSQL Service Instance"}),"\n",(0,i.jsxs)(s.p,{children:["Deleting a service instance with the name ",(0,i.jsx)(s.code,{children:"sample-pg-cluster"}),":"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s delete pg instance --name sample-pg-cluster\n"})}),"\n",(0,i.jsx)(s.p,{children:"Or by providing an explicit namespace:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s delete pg instance --name sample-pg-cluster -n default\n"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note"}),": If the service instance doesn't exist, a warning is printed and the command exists with the\nreturn code ",(0,i.jsx)(s.code,{children:"0"})," as the desired state of the service instance being delete is reached."]}),"\n",(0,i.jsx)(s.h2,{id:"applying-a-sql-file-to-a-postgresql-service-instance",children:"Applying a SQL File to a PostgreSQL Service Instance"}),"\n",(0,i.jsxs)(s.p,{children:["Uploading a SQL file, executing it using ",(0,i.jsx)(s.code,{children:"psql"})," and deleting the file can be done with:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster\n"})}),"\n",(0,i.jsx)(s.p,{children:"The file is uploaded to the current primary pod of the service instance."}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note"}),": Ensure that, during the execution of the command, there is no change of the primary node for a given clustered service instance as otherwise the file upload may fail or target the wrong pod."]}),"\n",(0,i.jsxs)(s.p,{children:["Use ",(0,i.jsx)(s.code,{children:"--yes"})," to skip the confirmation prompt."]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster --yes\n"})}),"\n",(0,i.jsxs)(s.p,{children:["Use ",(0,i.jsx)(s.code,{children:"--no-delete"})," to leave the file in the pod:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster --no-delete\n"})}),"\n",(0,i.jsx)(s.h2,{id:"applying-a-sql-statement-to-a-postgresql-service-instance",children:"Applying a SQL Statement to a PostgreSQL Service Instance"}),"\n",(0,i.jsx)(s.p,{children:"Applying a SQL statement on the primary pod of a PostgreSQL service instance can be accomplished with:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:'a9s pg apply -i sample-pg-cluster --sql "select count(*) from posts" --yes\n'})}),"\n",(0,i.jsx)(s.h2,{id:"creating-a-backup-of-a-postgresql-service-instance",children:"Creating a Backup of a PostgreSQL Service Instance"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg backup --name sample-pg-cluster-backup-1 -i sample-pg-cluster\n"})}),"\n",(0,i.jsx)(s.h2,{id:"restoring-a-backup-of-postgresql-service-instance",children:"Restoring a Backup of PostgreSQL Service Instance"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg restore --name sample-pg-cluster-restore-1 -b sample-pg-cluster-backup-1 -i sample-pg-cluster\n"})}),"\n",(0,i.jsx)(s.h2,{id:"creating-a-postgresql-service-binding",children:"Creating a PostgreSQL Service Binding"}),"\n",(0,i.jsx)(s.p,{children:"A Service Binding is an entity facilitating the secure consumption of a service instance.\nBy creating a service instance, a Postgres user is created along with a corresponding Kubernetes Secret."}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg servicebinding --name sb-clustered-1 -i sample-pg-cluster\n"})}),"\n",(0,i.jsxs)(s.p,{children:["Will therefore create a Kubernetes Secret named ",(0,i.jsx)(s.code,{children:"sb-clustered-1-service-binding"})," and provide the following\nkeys containing everything an application needs to connect to the PostgreSQL service instance:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"database"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"instance_service"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"password"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"username"})}),"\n"]}),"\n",(0,i.jsx)(s.h1,{id:"cleaning-up",children:"Cleaning Up"}),"\n",(0,i.jsx)(s.p,{children:"In order to delete the cluster run:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s delete cluster a8s\n"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note"}),": This will not delete config files."]}),"\n",(0,i.jsx)(s.p,{children:"Config files are stored in the cluster working directory."}),"\n",(0,i.jsx)(s.p,{children:"They can be removed with:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"rm -rf $( a9s cluster pwd )\n"})})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>t,x:()=>c});var i=n(6540);const r={},a=i.createContext(r);function t(e){const s=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),i.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/af805925.336a3798.js b/assets/js/af805925.336a3798.js new file mode 100644 index 0000000..409c99c --- /dev/null +++ b/assets/js/af805925.336a3798.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[8603],{7008:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>t,metadata:()=>i,toc:()=>o});const i=JSON.parse('{"id":"a9s-cli-a8s","title":"a9s CLI a8s","description":"Create a local Kubernetes cluster using Minikube or Kind, install a8s PostgreSQL including its dependencies as well as a local Minio object store.","source":"@site/docs/a9s-cli-a8s.md","sourceDirName":".","slug":"/a9s-cli-a8s","permalink":"/docs/develop/a9s-cli-a8s","draft":false,"unlisted":false,"tags":[{"inline":true,"label":"a9s cli","permalink":"/docs/develop/tags/a-9-s-cli"},{"inline":true,"label":"a9s hub","permalink":"/docs/develop/tags/a-9-s-hub"},{"inline":true,"label":"a9s data services","permalink":"/docs/develop/tags/a-9-s-data-services"},{"inline":true,"label":"a8s data services","permalink":"/docs/develop/tags/a-8-s-data-services"},{"inline":true,"label":"a9s postgres","permalink":"/docs/develop/tags/a-9-s-postgres"},{"inline":true,"label":"a8s postgres","permalink":"/docs/develop/tags/a-8-s-postgres"},{"inline":true,"label":"data service","permalink":"/docs/develop/tags/data-service"},{"inline":true,"label":"introduction","permalink":"/docs/develop/tags/introduction"},{"inline":true,"label":"kubernetes","permalink":"/docs/develop/tags/kubernetes"},{"inline":true,"label":"minikube","permalink":"/docs/develop/tags/minikube"},{"inline":true,"label":"kind","permalink":"/docs/develop/tags/kind"},{"inline":true,"label":"klutch","permalink":"/docs/develop/tags/klutch"}],"version":"current","frontMatter":{"id":"a9s-cli-a8s","title":"a9s CLI a8s","tags":["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],"keywords":["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]},"sidebar":"tutorialSidebar","next":{"title":"a9s CLI","permalink":"/docs/develop/a9s-cli"}}');var r=n(4848),a=n(8453);const t={id:"a9s-cli-a8s",title:"a9s CLI a8s",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]},c="a8s Stack",l={},o=[{value:"Cold-Run",id:"cold-run",level:2},{value:"Setting Up a Working Directory",id:"setting-up-a-working-directory",level:3},{value:"Configuring the Backup Store",id:"configuring-the-backup-store",level:3},{value:"Skip Checking Prerequisites",id:"skip-checking-prerequisites",level:2},{value:"Number of Kubernetes Nodes",id:"number-of-kubernetes-nodes",level:2},{value:"Cluster Memory",id:"cluster-memory",level:2},{value:"Deployment Version",id:"deployment-version",level:2},{value:"Kubernetes Provider",id:"kubernetes-provider",level:2},{value:"Backup Infrastructure Region",id:"backup-infrastructure-region",level:2},{value:"Unattended Mode",id:"unattended-mode",level:2},{value:"Printing the Working Directory",id:"printing-the-working-directory",level:2},{value:"Creating a PostgreSQL Service Instance",id:"creating-a-postgresql-service-instance",level:2},{value:"Creating PostgreSQL Service Instance YAML Without Applying it",id:"creating-postgresql-service-instance-yaml-without-applying-it",level:3},{value:"Creating a Custom PostgreSQL Service Instance",id:"creating-a-custom-postgresql-service-instance",level:3},{value:"Deleting a PostgreSQL Service Instance",id:"deleting-a-postgresql-service-instance",level:2},{value:"Applying a SQL File to a PostgreSQL Service Instance",id:"applying-a-sql-file-to-a-postgresql-service-instance",level:2},{value:"Applying a SQL Statement to a PostgreSQL Service Instance",id:"applying-a-sql-statement-to-a-postgresql-service-instance",level:2},{value:"Creating a Backup of a PostgreSQL Service Instance",id:"creating-a-backup-of-a-postgresql-service-instance",level:2},{value:"Restoring a Backup of PostgreSQL Service Instance",id:"restoring-a-backup-of-postgresql-service-instance",level:2},{value:"Creating a PostgreSQL Service Binding",id:"creating-a-postgresql-service-binding",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsxs)(s.h1,{id:"a8s-stack",children:[(0,r.jsx)(s.code,{children:"a8s"})," Stack"]})}),"\n",(0,r.jsx)(s.h1,{id:"creating-a-local-a8s-postgres-cluster",children:"Creating a Local a8s Postgres Cluster"}),"\n",(0,r.jsxs)(s.p,{children:["Create a local Kubernetes cluster using ",(0,r.jsx)(s.code,{children:"Minikube"})," or ",(0,r.jsx)(s.code,{children:"Kind"}),", ",(0,r.jsx)(s.strong,{children:"install a8s PostgreSQL"})," including its dependencies as well as a local ",(0,r.jsx)(s.a,{href:"https://min.io/",children:"Minio"})," object store."]}),"\n",(0,r.jsxs)(s.p,{children:["Get ready for ",(0,r.jsx)(s.strong,{children:"local development of applications with PostgreSQL"})," and/or ",(0,r.jsx)(s.strong,{children:"experimentation with a8s Postgres"})," by issuing the command:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s\n"})}),"\n",(0,r.jsx)(s.p,{children:"Recommended is 12 GB of free memory for the creation of three cluster nodes with each 4 GB. The number of nodes and memory size can be adjusted."}),"\n",(0,r.jsx)(s.h2,{id:"cold-run",children:"Cold-Run"}),"\n",(0,r.jsx)(s.p,{children:"When creating a cluster for the first time, a few setup steps will have to be taken which need to be performed only once:"}),"\n",(0,r.jsxs)(s.ol,{children:["\n",(0,r.jsxs)(s.li,{children:["Setting up a working directory for the use with the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI. ",(0,r.jsx)(s.strong,{children:"This step asks for your confirmation of the proposed directory."})]}),"\n",(0,r.jsx)(s.li,{children:"Configuring the access credentials for the S3 compatible object store which is needed to use the backup/restore feature of a8s Postgres. This step is performed automatically."}),"\n",(0,r.jsxs)(s.li,{children:["Cloning deployment resources required by the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI to create a cluster. This step is performed automatically."]}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"setting-up-a-working-directory",children:"Setting Up a Working Directory"}),"\n",(0,r.jsxs)(s.p,{children:["The working directory is where are ",(0,r.jsx)(s.code,{children:"a9s"})," CLI related resources will go. This includes ",(0,r.jsx)(s.code,{children:"yaml"})," specifications being cloned from remote repositories, but also those generated by the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI for your convenience."]}),"\n",(0,r.jsxs)(s.p,{children:["Once established, the working directory is stored in the ",(0,r.jsx)(s.code,{children:"~/.a9s"})," configuration file."]}),"\n",(0,r.jsxs)(s.p,{children:["The default working directory is ",(0,r.jsx)(s.code,{children:"~/a9s"}),"."]}),"\n",(0,r.jsx)(s.p,{children:"Alternatively, provide a custom working directory at the corresponding prompt."}),"\n",(0,r.jsx)(s.h3,{id:"configuring-the-backup-store",children:"Configuring the Backup Store"}),"\n",(0,r.jsx)(s.p,{children:"A non-prod Minio object store is installed in your local Kubernetes cluster and is automatically configured as the default backup store for a8s PostgreSQL backups."}),"\n",(0,r.jsxs)(s.p,{children:["If you want to use an alternative backup store, see ",(0,r.jsx)(s.code,{children:"a9s create cluster a8s --help"})," for the defaults of your particular CLI version and list of configuration options."]}),"\n",(0,r.jsx)(s.p,{children:"Most S3 compatible object stores, including AWS S3 itself of course, should work."}),"\n",(0,r.jsx)(s.h2,{id:"skip-checking-prerequisites",children:"Skip Checking Prerequisites"}),"\n",(0,r.jsx)(s.p,{children:"It is possible to skip the verification of prerequisites. This includes skipping the search for: required shell commands, a running Docker daemon and a running Kubernetes cluster."}),"\n",(0,r.jsxs)(s.p,{children:["In order to skip precheck use the ",(0,r.jsx)(s.code,{children:"--no-precheck"})," option:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --no-precheck\n"})}),"\n",(0,r.jsx)(s.h2,{id:"number-of-kubernetes-nodes",children:"Number of Kubernetes Nodes"}),"\n",(0,r.jsx)(s.p,{children:"Specifying the number of Nodes in the Kubernetes cluster:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --cluster-nr-of-nodes 1\n"})}),"\n",(0,r.jsx)(s.h2,{id:"cluster-memory",children:"Cluster Memory"}),"\n",(0,r.jsxs)(s.p,{children:["Specifying the memory of ",(0,r.jsx)(s.strong,{children:"each"})," Node of the Kubernetes cluster:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --cluster-memory 4gb\n"})}),"\n",(0,r.jsx)(s.h2,{id:"deployment-version",children:"Deployment Version"}),"\n",(0,r.jsxs)(s.p,{children:["The deployment version refers to the version of manifests used for installing software. Deployment versions are managed by anynines in a Git repository. The deployment version option allows you to select a particular version of the deployment manifests identified by ",(0,r.jsx)(s.strong,{children:"Git tags"}),"."]}),"\n",(0,r.jsxs)(s.p,{children:["Select a particular release by providing the ",(0,r.jsx)(s.code,{children:"--deployment-version"})," parameter:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --deployment-version v1.2.0\n"})}),"\n",(0,r.jsx)(s.p,{children:"Use:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --deployment-version latest\n"})}),"\n",(0,r.jsx)(s.p,{children:"To get the latest, untagged version of the deployment manifests."}),"\n",(0,r.jsx)(s.h2,{id:"kubernetes-provider",children:"Kubernetes Provider"}),"\n",(0,r.jsxs)(s.p,{children:["When creating a Kubernetes cluster, the mechanism to manage the cluster can be selected by specifying the ",(0,r.jsx)(s.code,{children:"--provider"})," option:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s -p kind \na9s create cluster a8s -p minikube (default)\n"})}),"\n",(0,r.jsx)(s.p,{children:"Follow the instructions to learn about available sub commands."}),"\n",(0,r.jsx)(s.h2,{id:"backup-infrastructure-region",children:"Backup Infrastructure Region"}),"\n",(0,r.jsxs)(s.p,{children:["When using the backup and restore functionality, a backup infrastructure region must be specified by using the ",(0,r.jsx)(s.code,{children:"--backup-region"})," option:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --backup-region us-east-1\n"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note"}),": By default, an existing ",(0,r.jsx)(s.code,{children:"backup-config.yaml"})," will be used. Hence, if you intend to change\nyour backup config, remove the existing ",(0,r.jsx)(s.code,{children:"backup-config.yaml"}),", first:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"rm a8s-deployment/deploy/a8s/backup-config/backup-store-config.yaml\n"})}),"\n",(0,r.jsx)(s.h2,{id:"unattended-mode",children:"Unattended Mode"}),"\n",(0,r.jsxs)(s.p,{children:["It is possible to skip all yes-no questions by ",(0,r.jsx)(s.strong,{children:"enabling the unattended mode"})," by passing the ",(0,r.jsx)(s.code,{children:"-y"})," or ",(0,r.jsx)(s.code,{children:"--yes"})," flag:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --yes\n"})}),"\n",(0,r.jsx)(s.h2,{id:"printing-the-working-directory",children:"Printing the Working Directory"}),"\n",(0,r.jsxs)(s.p,{children:["The working directory is stored in the ",(0,r.jsx)(s.code,{children:"~/.a8s"})," configuration file. The working directory contains all resources downloaded and generated by the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI."]}),"\n",(0,r.jsx)(s.p,{children:"To print the working directory execute:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s cluster pwd\n"})}),"\n",(0,r.jsx)(s.h1,{id:"a8s-postgresql",children:"a8s PostgreSQL"}),"\n",(0,r.jsxs)(s.p,{children:["A selected subset of the a8s PostgreSQL features are available through the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI."]}),"\n",(0,r.jsx)(s.h2,{id:"creating-a-postgresql-service-instance",children:"Creating a PostgreSQL Service Instance"}),"\n",(0,r.jsxs)(s.p,{children:["Creating a service instance with the name ",(0,r.jsx)(s.code,{children:"sample-pg-cluster"}),":"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --name sample-pg-cluster\n"})}),"\n",(0,r.jsxs)(s.p,{children:["The generated YAML specification will be stored in the ",(0,r.jsx)(s.code,{children:"usermanifests"}),"."]}),"\n",(0,r.jsx)(s.h3,{id:"creating-postgresql-service-instance-yaml-without-applying-it",children:"Creating PostgreSQL Service Instance YAML Without Applying it"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --name sample-pg-cluster --no-apply\n"})}),"\n",(0,r.jsxs)(s.p,{children:["The generated YAML specification will be stored in the ",(0,r.jsx)(s.code,{children:"usermanifests"})," but ",(0,r.jsx)(s.code,{children:"kubectl apply"})," won't be executed."]}),"\n",(0,r.jsx)(s.h3,{id:"creating-a-custom-postgresql-service-instance",children:"Creating a Custom PostgreSQL Service Instance"}),"\n",(0,r.jsx)(s.p,{children:"The command:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --api-version v1beta3 --name sample-pg-cluster --namespace default --replicas 3 --requests-cpu 200m --limits-memory 200Mi --service-version 14 --volume-size 2Gi\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Will generate a YAML spec called ",(0,r.jsx)(s.code,{children:"usermanifests/my-pg-instance.yaml"})," with the following content:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"apiVersion: postgresql.anynines.com/v1beta3\nkind: Postgresql\nmetadata:\n name: my-pg\nspec:\n replicas: 3\n resources:\n limits:\n memory: 200m\n requests:\n cpu: 200m\n version: 14\n volumeSize: 2Gi\n"})}),"\n",(0,r.jsx)(s.h2,{id:"deleting-a-postgresql-service-instance",children:"Deleting a PostgreSQL Service Instance"}),"\n",(0,r.jsxs)(s.p,{children:["Deleting a service instance with the name ",(0,r.jsx)(s.code,{children:"sample-pg-cluster"}),":"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s delete pg instance --name sample-pg-cluster\n"})}),"\n",(0,r.jsx)(s.p,{children:"Or by providing an explicit namespace:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s delete pg instance --name sample-pg-cluster -n default\n"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note"}),": If the service instance doesn't exist, a warning is printed and the command exists with the\nreturn code ",(0,r.jsx)(s.code,{children:"0"})," as the desired state of the service instance being delete is reached."]}),"\n",(0,r.jsx)(s.h2,{id:"applying-a-sql-file-to-a-postgresql-service-instance",children:"Applying a SQL File to a PostgreSQL Service Instance"}),"\n",(0,r.jsxs)(s.p,{children:["Uploading a SQL file, executing it using ",(0,r.jsx)(s.code,{children:"psql"})," and deleting the file can be done with:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster\n"})}),"\n",(0,r.jsx)(s.p,{children:"The file is uploaded to the current primary pod of the service instance."}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note"}),": Ensure that, during the execution of the command, there is no change of the primary node for a given clustered service instance as otherwise the file upload may fail or target the wrong pod."]}),"\n",(0,r.jsxs)(s.p,{children:["Use ",(0,r.jsx)(s.code,{children:"--yes"})," to skip the confirmation prompt."]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster --yes\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Use ",(0,r.jsx)(s.code,{children:"--no-delete"})," to leave the file in the pod:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster --no-delete\n"})}),"\n",(0,r.jsx)(s.h2,{id:"applying-a-sql-statement-to-a-postgresql-service-instance",children:"Applying a SQL Statement to a PostgreSQL Service Instance"}),"\n",(0,r.jsx)(s.p,{children:"Applying a SQL statement on the primary pod of a PostgreSQL service instance can be accomplished with:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:'a9s pg apply -i sample-pg-cluster --sql "select count(*) from posts" --yes\n'})}),"\n",(0,r.jsx)(s.h2,{id:"creating-a-backup-of-a-postgresql-service-instance",children:"Creating a Backup of a PostgreSQL Service Instance"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg backup --name sample-pg-cluster-backup-1 -i sample-pg-cluster\n"})}),"\n",(0,r.jsx)(s.h2,{id:"restoring-a-backup-of-postgresql-service-instance",children:"Restoring a Backup of PostgreSQL Service Instance"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg restore --name sample-pg-cluster-restore-1 -b sample-pg-cluster-backup-1 -i sample-pg-cluster\n"})}),"\n",(0,r.jsx)(s.h2,{id:"creating-a-postgresql-service-binding",children:"Creating a PostgreSQL Service Binding"}),"\n",(0,r.jsx)(s.p,{children:"A Service Binding is an entity facilitating the secure consumption of a service instance.\nBy creating a service instance, a Postgres user is created along with a corresponding Kubernetes Secret."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg servicebinding --name sb-clustered-1 -i sample-pg-cluster\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Will therefore create a Kubernetes Secret named ",(0,r.jsx)(s.code,{children:"sb-clustered-1-service-binding"})," and provide the following\nkeys containing everything an application needs to connect to the PostgreSQL service instance:"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.code,{children:"database"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.code,{children:"instance_service"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.code,{children:"password"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.code,{children:"username"})}),"\n"]}),"\n",(0,r.jsx)(s.h1,{id:"cleaning-up",children:"Cleaning Up"}),"\n",(0,r.jsx)(s.p,{children:"In order to delete the cluster run:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s delete cluster a8s\n"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note"}),": This will not delete config files."]}),"\n",(0,r.jsx)(s.p,{children:"Config files are stored in the cluster working directory."}),"\n",(0,r.jsx)(s.p,{children:"They can be removed with:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"rm -rf $( a9s cluster pwd )\n"})})]})}function h(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>t,x:()=>c});var i=n(6540);const r={},a=i.createContext(r);function t(e){const s=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),i.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.fc5abaed.js b/assets/js/c4f5d8e4.fc5abaed.js deleted file mode 100644 index b7479af..0000000 --- a/assets/js/c4f5d8e4.fc5abaed.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[2634],{5418:(l,e,a)=>{a.r(e),a.d(e,{default:()=>p});a(6540);var c=a(4164),t=a(1777),n=a(7083);const i={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"},r={features:"features_xdhU",featureSvg:"featureSvg__8YW"};var s=a(4848);const d=[{title:"a9s CLI",Svg:a(1012).A,description:(0,s.jsx)(s.Fragment,{children:"A single Go binary to help with app development. Create local Kubernetes clusters and install a8s PostgreSQL with ease."}),button:{label:"a9s CLI Docs",link:"/docs/a9s-cli"}},{title:"Tutorial: Demo App + a8s PostgreSQL",Svg:a(5069).A,description:(0,s.jsx)(s.Fragment,{children:"Provision a local Kubernetes cluster using Kind or Minikube, install a PostgreSQL operator, deploy a demo application, load data into the database as well as perform backup and restore operations."}),button:{label:"Hands-On Tutorial",link:"/docs/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/"}}];function o(l){let{Svg:e,title:a,description:t,button:i}=l;return(0,s.jsxs)("div",{className:(0,c.A)("col col--6"),children:[(0,s.jsx)("div",{className:"text--center",children:(0,s.jsx)(e,{className:r.featureSvg,alt:a})}),(0,s.jsxs)("div",{className:"text--center padding-horiz--md",children:[(0,s.jsx)("h2",{children:a}),(0,s.jsx)("p",{children:t}),(0,s.jsx)(n.A,{className:"button button--secondary button--lg",to:i.link,children:i.label})]})]})}function h(){return(0,s.jsx)("section",{className:r.features,children:(0,s.jsx)("div",{className:"container",children:(0,s.jsx)("div",{className:"row",children:d.map(((l,e)=>(0,s.jsx)(o,{...l},e)))})})})}function m(){return(0,s.jsx)("header",{className:(0,c.A)("hero",i.heroBanner),children:(0,s.jsxs)("div",{className:"container",children:[(0,s.jsx)("h1",{className:"hero__title",children:"a9s CLI Documentation"}),(0,s.jsx)("p",{className:"hero__subtitle",children:"Here you can find all the relevant Documentation about the a9s CLI, a single Go binary helping you with application development and managing cloud data."}),(0,s.jsx)("div",{className:i.buttons,children:(0,s.jsx)(n.A,{className:"button button--secondary button--lg",to:"/docs/a9s-cli",children:"Get Started"})})]})})}function p(){return(0,s.jsxs)(t.A,{title:"anynines Docs",description:"The anynines Documentation and Changelog",children:[(0,s.jsx)(m,{}),(0,s.jsx)("main",{children:(0,s.jsx)(h,{})})]})}},1012:(l,e,a)=>{a.d(e,{A:()=>B});var c,t,n,i,r,s,d,o,h,m,p,f,E,u,M,z,g,v=a(6540);function b(){return b=Object.assign?Object.assign.bind():function(l){for(var e=1;e {let{title:e,titleId:a,...B}=l;return v.createElement("svg",b({xmlns:"http://www.w3.org/2000/svg",width:496,height:496,fill:"none",viewBox:"0 0 496 496","aria-labelledby":a},B),e?v.createElement("title",{id:a},e):null,c||(c=v.createElement("path",{fill:"#E0E4ED",d:"M22 203.009c0 8.601 3.038 14.672 7.955 17.565l18.086 10.509c-4.917-2.891-7.954-8.891-8.027-17.566 0-11.707 5.496-25.009 13.666-35.198.724-16.987 12.581-37.083 27.26-45.539 2.892-1.662 5.712-2.816 8.387-3.325-.072-.504-.072-.938-.072-1.517-.072-19.877 13.955-44.018 31.236-53.992 15.618-9.035 28.633-3.399 31.02 12.5 2.819-3.394 5.929-6.43 9.182-8.886 14.317 7.299 31.598 15.9 31.67 16.553 4.411-2.531 8.605-3.763 12.292-3.763 2.676 0 5.062.653 7.159 1.807l-21.403-11.996c.579 1.373-11.135-2.675-23.21-6.579a26.2 26.2 0 0 1 7.375-2.311l-.144-.074c.289-.07.506 0 .723-.07.289 0 .506 0 .795-.075 1.374-.07 2.748 0 3.977.219.289 0 .506.144.723.215 1.229.219 2.314.653 3.326 1.158L166.324 62.35c-4.989-2.89-11.93-2.457-19.523 1.88-2.602 1.519-5.061 3.396-7.447 5.493l-14.606-8.457c-5.712-3.324-13.593-2.89-22.343 2.167-17.28 9.974-31.236 34.189-31.164 54.066 0 .508 0 .942.073 1.447-2.675.579-5.496 1.662-8.46 3.325-14.606 8.456-26.536 28.549-27.26 45.609-8.17 10.119-13.666 23.492-13.593 35.128"})),t||(t=v.createElement("path",{fill:"#fff",d:"M120.493 73.916c-17.308 9.99-31.274 34.172-31.218 54.053.001.512.003.99.063 1.466-2.674.554-5.496 1.669-8.405 3.348-14.636 8.447-26.533 28.532-27.257 45.55-8.179 10.152-13.672 23.501-13.638 35.164.049 17.391 12.35 24.364 27.46 15.643l125.041-72.167c15.111-8.721 27.302-29.83 27.253-47.221-.05-17.392-12.32-24.383-27.431-15.662-.093-1.142-.007-2.455-.011-3.75-.049-17.357-12.379-24.313-27.49-15.592-4.839 2.793-9.407 6.863-13.348 11.699-2.364-15.884-15.374-21.56-31.019-12.53"})),n||(n=v.createElement("path",{fill:"#485776",d:"M162.613 339.123v8.668c0 3.208 2.141 6.421 6.316 8.772l61.442 35.743c8.242 4.813 21.836 4.813 30.186 0l77.819-44.944c4.175-2.351 6.316-5.564 6.209-8.772v-8.778c0 3.213-2.034 6.421-6.209 8.882l-77.819 44.835c-8.457 4.922-21.944 4.817-30.293 0l-61.443-35.634c-4.174-2.455-6.208-5.669-6.208-8.772"})),i||(i=v.createElement("path",{fill:"#B8C2D6",d:"M168.889 330.306c-8.406 4.851-8.383 12.7-.032 17.552l61.449 35.697c8.285 4.813 21.84 4.852 30.246 0l77.774-44.887c8.338-4.812 8.383-12.7.099-17.513l-61.449-35.698c-8.351-4.851-21.974-4.851-30.312-.039z"})),r||(r=v.createElement("path",{fill:"#485776",d:"m231.046 276.516.255 84.183 55.108-31.805-.255-84.184z"})),s||(s=v.createElement("path",{fill:"#293858",d:"m221.03 270.732.294 84.153 10.006 5.784-.294-84.153 55.133-31.771-10.006-5.885z"})),d||(d=v.createElement("path",{fill:"#6BB8FF",d:"M106.347 197.411c-.019-6.569 4.616-14.588 10.287-17.858L382.39 26.168c5.719-3.298 10.337-.616 10.356 5.953l.445 171.12-286.398 165.29z"})),o||(o=v.createElement("path",{fill:"#E8EEFB",d:"m393.191 203.241.056 22.731c.019 6.522-4.569 14.512-10.288 17.811L117.204 397.168c-5.672 3.27-10.336.616-10.355-5.896l-.056-22.741z"})),h||(h=v.createElement("path",{fill:"#485776",d:"M257.552 290.389c-4.193 2.42-7.545 8.276-7.532 13.042.014 4.816 3.388 6.74 7.581 4.32 4.15-2.395 7.546-8.227 7.532-13.042-.013-4.767-3.431-6.715-7.581-4.32"})),m||(m=v.createElement("path",{fill:"#293858",d:"M94.722 190.634c-.072-6.541 4.588-14.55 10.268-17.83L370.712 19.429c2.912-1.678 5.46-1.82 7.354-.73l11.618 6.768c-1.82-1.09-4.442-.948-7.282.73L116.608 179.572c-5.681 3.28-10.268 11.289-10.268 17.839l.453 171.12-11.618-6.702z"})),p||(p=v.createElement("path",{fill:"#9DA9C1",d:"m106.793 368.531.057 22.759c0 3.204 1.165 5.46 2.985 6.55l-11.617-6.768c-1.821-1.014-2.986-3.346-2.986-6.549l-.057-22.694z"})),f||(f=v.createElement("path",{fill:"#E0E4ED",d:"M360.008 126.092c0 4.76 1.681 8.12 4.402 9.722l14.528 8.441c-2.722-1.6-4.403-4.921-4.443-9.723 0-6.479 3.042-13.842 7.564-19.481.4-9.402 6.964-20.525 15.088-25.206 1.601-.92 3.161-1.558 4.642-1.84-.04-.28-.04-.52-.04-.84-.04-11.002 7.724-24.363 17.289-29.884 8.645-5 15.848-1.88 17.169 6.92 1.561-1.88 3.282-3.56 5.082-4.92 7.925 4.04 17.489 8.801 17.529 9.163 2.442-1.401 4.763-2.083 6.804-2.083a8.1 8.1 0 0 1 3.962 1l-11.846-6.64c.32.76-6.163-1.48-12.846-3.64 1.4-.68 2.801-1.081 4.082-1.28l-.08-.041c.16-.04.28 0 .4-.04.16 0 .28 0 .44-.04.761-.04 1.521 0 2.201.12.16 0 .28.08.4.12.681.121 1.281.361 1.841.64l-14.287-8.321c-2.762-1.6-6.604-1.36-10.806 1.041-1.44.84-2.801 1.88-4.122 3.04l-8.084-4.68c-3.161-1.84-7.524-1.6-12.366 1.199-9.565 5.52-17.289 18.923-17.249 29.924 0 .282 0 .522.04.801-1.481.32-3.042.92-4.683 1.84-8.084 4.681-14.687 15.802-15.087 25.245-4.523 5.6-7.564 13.002-7.524 19.443"})),E||(E=v.createElement("path",{fill:"#fff",d:"M419.039 57.265c-9.58 5.529-17.31 18.914-17.279 29.917.001.284.002.548.036.812-1.481.307-3.043.924-4.653 1.853-8.1 4.676-14.685 15.792-15.086 25.211-4.527 5.619-7.567 13.008-7.549 19.463.027 9.626 6.836 13.485 15.199 8.658l69.209-39.943C467.28 98.408 474.027 86.726 474 77.1c-.027-9.627-6.819-13.496-15.183-8.669-.051-.632-.004-1.359-.006-2.076-.027-9.607-6.851-13.457-15.215-8.63-2.678 1.546-5.206 3.799-7.388 6.476-1.309-8.792-8.51-11.934-17.169-6.936"})),u||(u=v.createElement("path",{fill:"#E8EEFB",d:"M80.28 299.647c-2.602 1.502-4.703 5.155-4.694 8.144l.473 166.872c.009 2.989 2.123 4.192 4.725 2.691l80.352-46.375c2.602-1.502 4.702-5.138 4.693-8.127l-.473-166.871c-.009-2.99-2.122-4.21-4.724-2.709z"})),M||(M=v.createElement("path",{fill:"#6BB8FF",d:"m77.281 307.669.42 147.626 86.362-49.906-.335-147.631-28.227 16.296v7.067l-29.154 16.837v-7.066z"})),z||(z=v.createElement("path",{fill:"#293858",d:"m72.613 295.193 80.352-46.374c1.306-.754 2.489-.822 3.344-.325l7.667 4.454c-.856-.498-2.039-.429-3.344.324L80.28 299.647c-2.602 1.502-4.703 5.155-4.694 8.144l.473 166.872c.004 1.485.528 2.529 1.373 3.02l-7.666-4.454c-.845-.491-1.369-1.535-1.373-3.02l-.473-166.872c-.009-2.989 2.091-6.641 4.693-8.144"})),g||(g=v.createElement("path",{fill:"#485776",d:"M131.234 278.769a1.17 1.17 0 0 0-1.6-.428l-19.471 11.237a1.17 1.17 0 1 0 1.171 2.027l19.471-11.237a1.17 1.17 0 0 0 .429-1.599M123.237 433.551c3.005-1.735 5.448-.343 5.458 3.109s-2.418 7.655-5.423 9.389c-2.996 1.729-5.439.338-5.449-3.115-.01-3.452 2.418-7.654 5.414-9.383"})))}},5069:(l,e,a)=>{a.d(e,{A:()=>G});var c,t,n,i,r,s,d,o,h,m,p,f,E,u,M,z,g,v,b,B,x,L,j,y,F,w,A,D,N,C,_,S,k,O,I=a(6540);function P(){return P=Object.assign?Object.assign.bind():function(l){for(var e=1;e {let{title:e,titleId:a,...G}=l;return I.createElement("svg",P({xmlns:"http://www.w3.org/2000/svg",width:496,height:496,fill:"none",viewBox:"0 0 496 496","aria-labelledby":a},G),e?I.createElement("title",{id:a},e):null,c||(c=I.createElement("path",{fill:"#293858",d:"M408.33 377.911a4 4 0 0 1-4.005-.005l-77.747-45.107c-1.418-.823-1.415-2.871.006-3.69a2.13 2.13 0 0 1 2.134.003l75.635 43.881a4 4 0 0 0 4.005.006l23.464-13.527a4 4 0 0 1 4.005.006l57.041 33.092a2.096 2.096 0 1 1-2.103 3.625l-54.891-31.848a4 4 0 0 0-4.005-.006z"})),t||(t=I.createElement("path",{fill:"#293858",d:"M310.674 341.968c-1.419-.823-1.416-2.871.005-3.69a2.13 2.13 0 0 1 2.134.003l90.152 52.3a4 4 0 0 0 4.004.005l18.822-10.847a4 4 0 0 1 4.005.006l42.468 24.637c1.418.823 1.416 2.872-.005 3.69a2.13 2.13 0 0 1-2.134-.003l-40.431-23.456a4 4 0 0 0-4.005-.005l-18.822 10.847a4 4 0 0 1-4.004-.006zM295.783 346.863a2.1 2.1 0 0 1 2.095.003l136.698 79.307c1.393.808 1.39 2.821-.005 3.625a2.09 2.09 0 0 1-2.096-.003l-136.698-79.308c-1.392-.808-1.389-2.82.006-3.624M364.957 414.802c2.665-1.537 2.67-5.382.009-6.926l-84.047-48.759c-1.418-.822-1.415-2.871.005-3.69a2.13 2.13 0 0 1 2.134.003l90.328 52.405c2.662 1.544 2.656 5.39-.01 6.926l-10.843 6.249c-2.666 1.536-2.672 5.381-.01 6.925l34.326 19.915c1.418.822 1.415 2.871-.005 3.69a2.13 2.13 0 0 1-2.134-.003l-40.609-23.557c-2.661-1.544-2.656-5.389.01-6.925z"})),n||(n=I.createElement("path",{fill:"#293858",d:"M265.033 368.209c-1.392-.808-1.39-2.82.005-3.624a2.09 2.09 0 0 1 2.096.003l75.905 44.035c2.662 1.544 2.656 5.388-.009 6.925l-15.564 8.972c-2.665 1.537-2.67 5.382-.009 6.926l48.826 28.326c1.393.808 1.39 2.82-.005 3.624a2.09 2.09 0 0 1-2.096-.003l-55.144-31.992c-2.661-1.544-2.656-5.388.009-6.925l15.564-8.973c2.665-1.537 2.671-5.382.009-6.925zM88.67 263.277a4 4 0 0 1 4.005.006l77.747 45.106c1.418.823 1.415 2.872-.006 3.691a2.13 2.13 0 0 1-2.134-.003l-75.635-43.882a4 4 0 0 0-4.005-.005l-23.464 13.525a4 4 0 0 1-4.005-.005L4.132 248.617c-1.394-.808-1.392-2.821.004-3.627a2.1 2.1 0 0 1 2.099.003l54.89 31.849a4 4 0 0 0 4.006.005z"})),i||(i=I.createElement("path",{fill:"#293858",d:"M186.326 299.22c1.418.823 1.415 2.872-.005 3.69a2.13 2.13 0 0 1-2.133-.003l-90.153-52.3a4 4 0 0 0-4.004-.006l-18.822 10.847a4 4 0 0 1-4.005-.005l-42.468-24.637c-1.418-.822-1.416-2.871.005-3.69a2.13 2.13 0 0 1 2.134.003l40.431 23.456a4 4 0 0 0 4.005.006l18.822-10.847a4 4 0 0 1 4.004.005zM201.217 294.325a2.1 2.1 0 0 1-2.096-.003L62.424 215.014c-1.393-.808-1.39-2.82.006-3.624a2.1 2.1 0 0 1 2.095.003L201.222 290.7c1.393.808 1.39 2.821-.005 3.625M132.043 226.387c-2.665 1.537-2.67 5.381-.009 6.925l84.047 48.759c1.418.823 1.415 2.871-.005 3.69a2.13 2.13 0 0 1-2.134-.003l-90.328-52.406c-2.662-1.544-2.656-5.389.01-6.925l10.843-6.249c2.666-1.537 2.672-5.382.01-6.926l-34.326-19.914c-1.418-.823-1.415-2.872.006-3.69a2.13 2.13 0 0 1 2.133.003l40.609 23.558c2.661 1.543 2.656 5.388-.01 6.925z"})),r||(r=I.createElement("path",{fill:"#4C5671",d:"m235.099 274.796-4.186 2.411-82.935-48.112 27.549-15.881-57.941-33.615 4.186-2.411 62.173 36.07-27.548 15.882z"})),s||(s=I.createElement("path",{fill:"#293858",d:"M88.67 377.911a4 4 0 0 0 4.005-.005l77.747-45.107c1.418-.823 1.415-2.871-.006-3.69a2.13 2.13 0 0 0-2.134.003l-75.635 43.881a4 4 0 0 1-4.005.006l-23.464-13.527a4 4 0 0 0-4.005.006L4.132 392.57c-1.394.809-1.392 2.822.003 3.628.65.375 1.451.374 2.1-.003l54.89-31.848a4 4 0 0 1 4.006-.006z"})),d||(d=I.createElement("path",{fill:"#293858",d:"M186.326 341.968c1.418-.823 1.416-2.871-.005-3.69a2.13 2.13 0 0 0-2.134.003l-90.152 52.3a4 4 0 0 1-4.004.005l-18.822-10.847a4 4 0 0 0-4.005.006l-42.468 24.637c-1.418.823-1.416 2.872.005 3.69a2.13 2.13 0 0 0 2.134-.003l40.431-23.456a4 4 0 0 1 4.005-.005l18.822 10.847a4 4 0 0 0 4.004-.006zM201.217 346.863a2.1 2.1 0 0 0-2.095.003L62.424 426.173c-1.393.808-1.39 2.821.005 3.625a2.09 2.09 0 0 0 2.096-.003l136.697-79.308c1.393-.808 1.39-2.82-.005-3.624M132.043 414.802c-2.665-1.537-2.67-5.382-.009-6.926l84.047-48.759c1.418-.822 1.415-2.871-.005-3.69a2.13 2.13 0 0 0-2.134.003l-90.328 52.405c-2.662 1.544-2.656 5.39.01 6.926l10.843 6.249c2.666 1.536 2.672 5.381.01 6.925l-34.326 19.915c-1.418.822-1.415 2.871.005 3.69a2.13 2.13 0 0 0 2.134-.003l40.608-23.557c2.662-1.544 2.657-5.389-.009-6.925z"})),o||(o=I.createElement("path",{fill:"#293858",d:"M231.967 368.209c1.393-.808 1.39-2.82-.005-3.624a2.09 2.09 0 0 0-2.096.003l-75.905 44.035c-2.662 1.544-2.656 5.388.009 6.925l15.564 8.972c2.666 1.537 2.671 5.382.01 6.926l-48.826 28.325c-1.393.809-1.39 2.821.005 3.625a2.09 2.09 0 0 0 2.096-.003l55.143-31.992c2.661-1.544 2.656-5.388-.009-6.925l-15.564-8.973c-2.665-1.537-2.67-5.382-.009-6.925zM408.33 263.277a4 4 0 0 0-4.005.006l-77.747 45.106c-1.418.823-1.415 2.872.006 3.691.66.381 1.474.379 2.134-.003l75.635-43.882a4 4 0 0 1 4.005-.005l23.464 13.525a4 4 0 0 0 4.005-.005l57.041-33.093c1.394-.808 1.392-2.821-.004-3.627a2.1 2.1 0 0 0-2.099.003l-54.891 31.849a4 4 0 0 1-4.005.005z"})),h||(h=I.createElement("path",{fill:"#293858",d:"M310.674 299.22c-1.418.823-1.415 2.872.005 3.69.66.381 1.474.38 2.133-.003l90.153-52.3a4 4 0 0 1 4.004-.006l18.822 10.847a4 4 0 0 0 4.005-.005l42.468-24.637c1.418-.822 1.415-2.871-.005-3.69a2.13 2.13 0 0 0-2.134.003l-40.431 23.456a4 4 0 0 1-4.005.006l-18.822-10.847a4 4 0 0 0-4.004.005zM295.783 294.325a2.1 2.1 0 0 0 2.096-.003l136.697-79.308c1.393-.808 1.389-2.82-.006-3.624a2.1 2.1 0 0 0-2.095.003L295.777 290.7c-1.392.808-1.39 2.821.006 3.625M364.957 226.387c2.665 1.537 2.67 5.381.009 6.925l-84.047 48.759c-1.418.823-1.415 2.871.005 3.69.661.38 1.474.379 2.134-.003l90.328-52.406c2.662-1.544 2.656-5.389-.01-6.925l-10.843-6.249c-2.666-1.537-2.672-5.382-.01-6.926l34.326-19.914c1.418-.823 1.415-2.872-.006-3.69a2.13 2.13 0 0 0-2.133.003l-40.609 23.558c-2.661 1.543-2.656 5.388.01 6.925z"})),m||(m=I.createElement("path",{fill:"#4C5671",d:"m261.902 274.796 4.185 2.411 82.935-48.112-27.548-15.881 57.94-33.615-4.185-2.411-62.174 36.07 27.548 15.882z"})),p||(p=I.createElement("path",{fill:"#0D1424",d:"m109.721 356.004 125.697 72.928c6.946 4.006 18.235 4.006 25.182 0l126.673-72.928c6.838-4.011 6.948-10.514 0-14.631l-125.697-72.928c-6.947-4.011-18.235-4.011-25.183 0l-126.564 73.033c-7.055 4.011-7.055 10.515-.108 14.526"})),f||(f=I.createElement("path",{fill:"#293858",d:"m109.8 341.454 126.6-72.971c6.942-4 18.23-4.032 25.181 0l125.722 72.939c6.953 4.036 6.86 10.56-.081 14.561L260.62 428.954c-6.998 4.031-18.228 4.031-25.181 0l-125.722-72.939c-6.952-4.032-6.915-10.529.083-14.561m2.638 9.879 125.729 72.932c5.231 3.048 14.464 3.037 19.743-.005l126.598-72.971c2.004-1.153 2.539-2.222 2.539-2.624 0-.386-.514-1.424-2.475-2.56l-125.718-72.934c-2.619-1.523-6.228-2.275-9.848-2.275-3.619 0-7.25.757-9.889 2.28l-126.604 72.971c-1.876 1.079-2.554 2.159-2.554 2.619-.001.45.656 1.508 2.479 2.567"})),E||(E=I.createElement("path",{fill:"#0B76DA",d:"m104.53 275.841.09 53.395c0 2.668 1.693 5.248 5.169 7.294l125.745 72.865c6.951 4.092 18.18 4.092 25.132 0l126.636-72.951c3.475-2.046 5.258-4.627 5.258-7.298l-.088-53.482c0 2.667-1.782 5.334-5.258 7.384l-126.637 72.951c-6.952 4.005-18.18 4.005-25.132 0L109.7 283.048c-3.476-2.051-5.17-4.626-5.17-7.207"})),u||(u=I.createElement("path",{fill:"#6BB8FF",d:"M109.8 268.482c-6.998 4.034-7.034 10.528-.082 14.561l125.722 72.938c6.953 4.034 18.183 4.034 25.181 0l126.601-72.97c6.941-4 7.034-10.527.081-14.561l-125.722-72.938c-6.952-4.033-18.239-4.001-25.181 0z"})),M||(M=I.createElement("path",{fill:"#fff",d:"m109.718 275.553 125.722 72.941c6.953 4.033 18.183 4.033 25.181 0l126.601-72.972c1.832-1.054 3.118-2.294 3.993-3.61 2.54 3.716 1.192 8.11-3.993 11.101L260.621 355.98c-6.998 4.032-18.228 4.032-25.181 0l-125.722-72.935c-5.129-2.979-6.393-7.287-3.926-10.964.865 1.265 2.159 2.45 3.926 3.472",opacity:.25})),z||(z=I.createElement("path",{fill:"#0D1424",d:"M202.7 360.579a2 2 0 0 1 1.001 1.74l-.055 14.743c-.005 1.536-1.668 2.492-2.998 1.725l-3.083-1.776a2 2 0 0 1-1.002-1.741l.055-14.743c.006-1.536 1.669-2.492 2.999-1.725zM216.447 368.502a2 2 0 0 1 1.001 1.74l-.054 14.743c-.006 1.536-1.669 2.493-2.999 1.726l-3.119-1.798a2 2 0 0 1-1.001-1.74l.054-14.743c.006-1.536 1.668-2.493 2.999-1.726zM230.157 376.405a2 2 0 0 1 1.001 1.74l-.054 14.742c-.006 1.536-1.668 2.493-2.998 1.726l-3.083-1.777a2 2 0 0 1-1.002-1.74l.055-14.742c.006-1.536 1.669-2.493 2.999-1.726z"})),g||(g=I.createElement("path",{fill:"#0B76DA",d:"m104.53 196.092.09 53.395c0 2.668 1.693 5.248 5.169 7.294l125.745 72.865c6.951 4.092 18.18 4.092 25.132 0l126.636-72.951c3.475-2.046 5.258-4.627 5.258-7.298l-.088-53.482c0 2.667-1.782 5.334-5.258 7.384L260.577 276.25c-6.952 4.005-18.18 4.005-25.132 0L109.7 203.299c-3.476-2.052-5.17-4.627-5.17-7.207"})),v||(v=I.createElement("path",{fill:"#6BB8FF",d:"M109.8 188.732c-6.998 4.034-7.034 10.528-.082 14.561l125.722 72.938c6.953 4.034 18.183 4.034 25.181 0l126.601-72.97c6.941-4 7.034-10.527.081-14.561l-125.722-72.938c-6.952-4.033-18.239-4.001-25.181 0z"})),b||(b=I.createElement("path",{fill:"#fff",d:"m109.718 195.803 125.722 72.941c6.953 4.033 18.183 4.033 25.181 0l126.601-72.972c1.832-1.054 3.118-2.294 3.993-3.61 2.54 3.715 1.192 8.11-3.993 11.101L260.621 276.23c-6.998 4.032-18.228 4.032-25.181 0l-125.722-72.935c-5.129-2.979-6.393-7.287-3.926-10.964.865 1.266 2.159 2.45 3.926 3.472",opacity:.25})),B||(B=I.createElement("path",{fill:"#0D1424",d:"M202.7 280.829a2 2 0 0 1 1.001 1.74l-.055 14.743c-.005 1.536-1.668 2.492-2.998 1.725l-3.083-1.776a2 2 0 0 1-1.002-1.74l.055-14.744c.006-1.536 1.669-2.492 2.999-1.725zM216.447 288.752a2 2 0 0 1 1.001 1.74l-.054 14.743c-.006 1.536-1.669 2.493-2.999 1.726l-3.119-1.798a2 2 0 0 1-1.001-1.74l.054-14.743c.006-1.536 1.668-2.493 2.999-1.726zM230.157 296.655a2 2 0 0 1 1.001 1.74l-.054 14.743c-.006 1.536-1.668 2.492-2.999 1.725l-3.082-1.777a2 2 0 0 1-1.002-1.74l.055-14.742c.006-1.536 1.669-2.493 2.999-1.726z"})),x||(x=I.createElement("path",{fill:"#0B76DA",d:"m104.53 116.342.09 53.395c0 2.668 1.693 5.248 5.169 7.294l125.745 72.865c6.951 4.092 18.18 4.092 25.132 0l126.636-72.951c3.475-2.046 5.258-4.627 5.258-7.298l-.088-53.482c0 2.667-1.782 5.334-5.258 7.384L260.577 196.5c-6.952 4.005-18.18 4.005-25.132 0L109.7 123.549c-3.476-2.051-5.17-4.627-5.17-7.207"})),L||(L=I.createElement("path",{fill:"#6BB8FF",d:"M109.8 108.983c-6.998 4.033-7.034 10.528-.082 14.561l125.722 72.938c6.953 4.034 18.183 4.035 25.181 0l126.601-72.97c6.941-4 7.034-10.527.081-14.561L261.581 36.013c-6.952-4.033-18.239-4.001-25.181 0z"})),j||(j=I.createElement("path",{fill:"#fff",d:"M322.392 124.432c5.332-3.073 5.342-10.763.02-13.85l-69.305-40.206a8 8 0 0 0-8.01-.011l-70.474 40.618c-5.331 3.073-5.342 10.764-.019 13.851l69.311 40.206a8 8 0 0 0 8.009.011z",opacity:.33})),y||(y=I.createElement("path",{fill:"#fff",d:"m109.718 116.053 125.722 72.941c6.953 4.033 18.183 4.033 25.181 0l126.601-72.971c1.832-1.054 3.118-2.294 3.993-3.61 2.54 3.716 1.192 8.11-3.993 11.101l-126.601 72.967c-6.998 4.032-18.228 4.032-25.181 0l-125.722-72.935c-5.129-2.979-6.393-7.287-3.926-10.964.865 1.265 2.159 2.449 3.926 3.471",opacity:.25})),F||(F=I.createElement("path",{fill:"#0D1424",d:"M202.7 201.079a2 2 0 0 1 1.001 1.74l-.055 14.744c-.005 1.535-1.668 2.492-2.999 1.725l-3.082-1.777a2 2 0 0 1-1.002-1.74l.055-14.743c.006-1.536 1.668-2.493 2.999-1.726zM216.447 209.003a2 2 0 0 1 1.001 1.74l-.054 14.742c-.006 1.536-1.669 2.493-2.999 1.726l-3.119-1.798a2 2 0 0 1-1.001-1.74l.054-14.743c.006-1.535 1.668-2.492 2.999-1.725zM230.157 216.906a2 2 0 0 1 1.001 1.74l-.054 14.743c-.006 1.535-1.668 2.492-2.998 1.725l-3.083-1.777a2 2 0 0 1-1.002-1.74l.055-14.743c.006-1.536 1.669-2.492 2.999-1.725z"})),w||(w=I.createElement("path",{fill:"#FFBAB4",d:"M144.949 314.218c2.468 1.421 4.449 4.881 4.441 7.71-.009 2.799-2.002 3.964-4.471 2.543s-4.449-4.881-4.44-7.679c.008-2.831 2.001-4.002 4.47-2.574",opacity:.5})),A||(A=I.createElement("path",{fill:"#FFE6B4",d:"M131.703 306.582c2.468 1.421 4.478 4.899 4.471 7.73-.008 2.798-2.031 3.946-4.5 2.524-2.438-1.402-4.449-4.881-4.441-7.679.007-2.83 2.031-3.983 4.47-2.575",opacity:.5})),D||(D=I.createElement("path",{fill:"#60EB98",d:"M118.486 298.965c2.469 1.42 4.449 4.881 4.441 7.71-.009 2.798-2.001 3.964-4.47 2.543s-4.45-4.881-4.441-7.68c.009-2.829 2.002-4 4.47-2.573"})),N||(N=I.createElement("path",{fill:"#FFBAB4",d:"M144.949 234.468c2.468 1.42 4.449 4.881 4.441 7.71-.009 2.799-2.002 3.964-4.471 2.542-2.469-1.42-4.449-4.88-4.44-7.679.008-2.829 2.001-4.001 4.47-2.573",opacity:.5})),C||(C=I.createElement("path",{fill:"#FFE6B4",d:"M131.703 226.832c2.468 1.421 4.478 4.899 4.471 7.73-.008 2.798-2.031 3.946-4.5 2.524-2.438-1.402-4.449-4.881-4.441-7.679.007-2.83 2.031-3.983 4.47-2.575"})),_||(_=I.createElement("path",{fill:"#60EB98",d:"M118.486 219.216c2.469 1.421 4.449 4.881 4.441 7.71-.009 2.798-2.001 3.964-4.47 2.543s-4.45-4.881-4.441-7.679c.009-2.831 2.002-4.002 4.47-2.574",opacity:.5})),S||(S=I.createElement("path",{fill:"#FFBAB4",d:"M144.949 154.718c2.468 1.42 4.449 4.881 4.441 7.71-.009 2.798-2.002 3.964-4.471 2.543s-4.449-4.881-4.44-7.68c.008-2.829 2.001-4 4.47-2.573",opacity:.5})),k||(k=I.createElement("path",{fill:"#FFE6B4",d:"M131.703 147.082c2.468 1.421 4.478 4.899 4.471 7.73-.008 2.798-2.031 3.946-4.5 2.524-2.438-1.402-4.449-4.881-4.441-7.679.007-2.83 2.031-3.983 4.47-2.575",opacity:.5})),O||(O=I.createElement("path",{fill:"#60EB98",d:"M118.486 139.466c2.469 1.42 4.449 4.881 4.441 7.71-.009 2.798-2.001 3.964-4.47 2.543s-4.45-4.881-4.441-7.68c.009-2.829 2.002-4.001 4.47-2.573"})))}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.fd733adc.js b/assets/js/c4f5d8e4.fd733adc.js new file mode 100644 index 0000000..bfc7b9b --- /dev/null +++ b/assets/js/c4f5d8e4.fd733adc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[2634],{1012:(l,e,a)=>{a.d(e,{A:()=>B});var c,t,n,i,r,s,d,o,h,m,p,f,E,u,M,z,g,v=a(6540);function b(){return b=Object.assign?Object.assign.bind():function(l){for(var e=1;e {let{title:e,titleId:a,...B}=l;return v.createElement("svg",b({xmlns:"http://www.w3.org/2000/svg",width:496,height:496,fill:"none",viewBox:"0 0 496 496","aria-labelledby":a},B),e?v.createElement("title",{id:a},e):null,c||(c=v.createElement("path",{fill:"#E0E4ED",d:"M22 203.009c0 8.601 3.038 14.672 7.955 17.565l18.086 10.509c-4.917-2.891-7.954-8.891-8.027-17.566 0-11.707 5.496-25.009 13.666-35.198.724-16.987 12.581-37.083 27.26-45.539 2.892-1.662 5.712-2.816 8.387-3.325-.072-.504-.072-.938-.072-1.517-.072-19.877 13.955-44.018 31.236-53.992 15.618-9.035 28.633-3.399 31.02 12.5 2.819-3.394 5.929-6.43 9.182-8.886 14.317 7.299 31.598 15.9 31.67 16.553 4.411-2.531 8.605-3.763 12.292-3.763 2.676 0 5.062.653 7.159 1.807l-21.403-11.996c.579 1.373-11.135-2.675-23.21-6.579a26.2 26.2 0 0 1 7.375-2.311l-.144-.074c.289-.07.506 0 .723-.07.289 0 .506 0 .795-.075 1.374-.07 2.748 0 3.977.219.289 0 .506.144.723.215 1.229.219 2.314.653 3.326 1.158L166.324 62.35c-4.989-2.89-11.93-2.457-19.523 1.88-2.602 1.519-5.061 3.396-7.447 5.493l-14.606-8.457c-5.712-3.324-13.593-2.89-22.343 2.167-17.28 9.974-31.236 34.189-31.164 54.066 0 .508 0 .942.073 1.447-2.675.579-5.496 1.662-8.46 3.325-14.606 8.456-26.536 28.549-27.26 45.609-8.17 10.119-13.666 23.492-13.593 35.128"})),t||(t=v.createElement("path",{fill:"#fff",d:"M120.493 73.916c-17.308 9.99-31.274 34.172-31.218 54.053.001.512.003.99.063 1.466-2.674.554-5.496 1.669-8.405 3.348-14.636 8.447-26.533 28.532-27.257 45.55-8.179 10.152-13.672 23.501-13.638 35.164.049 17.391 12.35 24.364 27.46 15.643l125.041-72.167c15.111-8.721 27.302-29.83 27.253-47.221-.05-17.392-12.32-24.383-27.431-15.662-.093-1.142-.007-2.455-.011-3.75-.049-17.357-12.379-24.313-27.49-15.592-4.839 2.793-9.407 6.863-13.348 11.699-2.364-15.884-15.374-21.56-31.019-12.53"})),n||(n=v.createElement("path",{fill:"#485776",d:"M162.613 339.123v8.668c0 3.208 2.141 6.421 6.316 8.772l61.442 35.743c8.242 4.813 21.836 4.813 30.186 0l77.819-44.944c4.175-2.351 6.316-5.564 6.209-8.772v-8.778c0 3.213-2.034 6.421-6.209 8.882l-77.819 44.835c-8.457 4.922-21.944 4.817-30.293 0l-61.443-35.634c-4.174-2.455-6.208-5.669-6.208-8.772"})),i||(i=v.createElement("path",{fill:"#B8C2D6",d:"M168.889 330.306c-8.406 4.851-8.383 12.7-.032 17.552l61.449 35.697c8.285 4.813 21.84 4.852 30.246 0l77.774-44.887c8.338-4.812 8.383-12.7.099-17.513l-61.449-35.698c-8.351-4.851-21.974-4.851-30.312-.039z"})),r||(r=v.createElement("path",{fill:"#485776",d:"m231.046 276.516.255 84.183 55.108-31.805-.255-84.184z"})),s||(s=v.createElement("path",{fill:"#293858",d:"m221.03 270.732.294 84.153 10.006 5.784-.294-84.153 55.133-31.771-10.006-5.885z"})),d||(d=v.createElement("path",{fill:"#6BB8FF",d:"M106.347 197.411c-.019-6.569 4.616-14.588 10.287-17.858L382.39 26.168c5.719-3.298 10.337-.616 10.356 5.953l.445 171.12-286.398 165.29z"})),o||(o=v.createElement("path",{fill:"#E8EEFB",d:"m393.191 203.241.056 22.731c.019 6.522-4.569 14.512-10.288 17.811L117.204 397.168c-5.672 3.27-10.336.616-10.355-5.896l-.056-22.741z"})),h||(h=v.createElement("path",{fill:"#485776",d:"M257.552 290.389c-4.193 2.42-7.545 8.276-7.532 13.042.014 4.816 3.388 6.74 7.581 4.32 4.15-2.395 7.546-8.227 7.532-13.042-.013-4.767-3.431-6.715-7.581-4.32"})),m||(m=v.createElement("path",{fill:"#293858",d:"M94.722 190.634c-.072-6.541 4.588-14.55 10.268-17.83L370.712 19.429c2.912-1.678 5.46-1.82 7.354-.73l11.618 6.768c-1.82-1.09-4.442-.948-7.282.73L116.608 179.572c-5.681 3.28-10.268 11.289-10.268 17.839l.453 171.12-11.618-6.702z"})),p||(p=v.createElement("path",{fill:"#9DA9C1",d:"m106.793 368.531.057 22.759c0 3.204 1.165 5.46 2.985 6.55l-11.617-6.768c-1.821-1.014-2.986-3.346-2.986-6.549l-.057-22.694z"})),f||(f=v.createElement("path",{fill:"#E0E4ED",d:"M360.008 126.092c0 4.76 1.681 8.12 4.402 9.722l14.528 8.441c-2.722-1.6-4.403-4.921-4.443-9.723 0-6.479 3.042-13.842 7.564-19.481.4-9.402 6.964-20.525 15.088-25.206 1.601-.92 3.161-1.558 4.642-1.84-.04-.28-.04-.52-.04-.84-.04-11.002 7.724-24.363 17.289-29.884 8.645-5 15.848-1.88 17.169 6.92 1.561-1.88 3.282-3.56 5.082-4.92 7.925 4.04 17.489 8.801 17.529 9.163 2.442-1.401 4.763-2.083 6.804-2.083a8.1 8.1 0 0 1 3.962 1l-11.846-6.64c.32.76-6.163-1.48-12.846-3.64 1.4-.68 2.801-1.081 4.082-1.28l-.08-.041c.16-.04.28 0 .4-.04.16 0 .28 0 .44-.04.761-.04 1.521 0 2.201.12.16 0 .28.08.4.12.681.121 1.281.361 1.841.64l-14.287-8.321c-2.762-1.6-6.604-1.36-10.806 1.041-1.44.84-2.801 1.88-4.122 3.04l-8.084-4.68c-3.161-1.84-7.524-1.6-12.366 1.199-9.565 5.52-17.289 18.923-17.249 29.924 0 .282 0 .522.04.801-1.481.32-3.042.92-4.683 1.84-8.084 4.681-14.687 15.802-15.087 25.245-4.523 5.6-7.564 13.002-7.524 19.443"})),E||(E=v.createElement("path",{fill:"#fff",d:"M419.039 57.265c-9.58 5.529-17.31 18.914-17.279 29.917.001.284.002.548.036.812-1.481.307-3.043.924-4.653 1.853-8.1 4.676-14.685 15.792-15.086 25.211-4.527 5.619-7.567 13.008-7.549 19.463.027 9.626 6.836 13.485 15.199 8.658l69.209-39.943C467.28 98.408 474.027 86.726 474 77.1c-.027-9.627-6.819-13.496-15.183-8.669-.051-.632-.004-1.359-.006-2.076-.027-9.607-6.851-13.457-15.215-8.63-2.678 1.546-5.206 3.799-7.388 6.476-1.309-8.792-8.51-11.934-17.169-6.936"})),u||(u=v.createElement("path",{fill:"#E8EEFB",d:"M80.28 299.647c-2.602 1.502-4.703 5.155-4.694 8.144l.473 166.872c.009 2.989 2.123 4.192 4.725 2.691l80.352-46.375c2.602-1.502 4.702-5.138 4.693-8.127l-.473-166.871c-.009-2.99-2.122-4.21-4.724-2.709z"})),M||(M=v.createElement("path",{fill:"#6BB8FF",d:"m77.281 307.669.42 147.626 86.362-49.906-.335-147.631-28.227 16.296v7.067l-29.154 16.837v-7.066z"})),z||(z=v.createElement("path",{fill:"#293858",d:"m72.613 295.193 80.352-46.374c1.306-.754 2.489-.822 3.344-.325l7.667 4.454c-.856-.498-2.039-.429-3.344.324L80.28 299.647c-2.602 1.502-4.703 5.155-4.694 8.144l.473 166.872c.004 1.485.528 2.529 1.373 3.02l-7.666-4.454c-.845-.491-1.369-1.535-1.373-3.02l-.473-166.872c-.009-2.989 2.091-6.641 4.693-8.144"})),g||(g=v.createElement("path",{fill:"#485776",d:"M131.234 278.769a1.17 1.17 0 0 0-1.6-.428l-19.471 11.237a1.17 1.17 0 1 0 1.171 2.027l19.471-11.237a1.17 1.17 0 0 0 .429-1.599M123.237 433.551c3.005-1.735 5.448-.343 5.458 3.109s-2.418 7.655-5.423 9.389c-2.996 1.729-5.439.338-5.449-3.115-.01-3.452 2.418-7.654 5.414-9.383"})))}},5069:(l,e,a)=>{a.d(e,{A:()=>G});var c,t,n,i,r,s,d,o,h,m,p,f,E,u,M,z,g,v,b,B,x,L,j,y,F,w,A,D,N,C,_,S,k,O,I=a(6540);function P(){return P=Object.assign?Object.assign.bind():function(l){for(var e=1;e {let{title:e,titleId:a,...G}=l;return I.createElement("svg",P({xmlns:"http://www.w3.org/2000/svg",width:496,height:496,fill:"none",viewBox:"0 0 496 496","aria-labelledby":a},G),e?I.createElement("title",{id:a},e):null,c||(c=I.createElement("path",{fill:"#293858",d:"M408.33 377.911a4 4 0 0 1-4.005-.005l-77.747-45.107c-1.418-.823-1.415-2.871.006-3.69a2.13 2.13 0 0 1 2.134.003l75.635 43.881a4 4 0 0 0 4.005.006l23.464-13.527a4 4 0 0 1 4.005.006l57.041 33.092a2.096 2.096 0 1 1-2.103 3.625l-54.891-31.848a4 4 0 0 0-4.005-.006z"})),t||(t=I.createElement("path",{fill:"#293858",d:"M310.674 341.968c-1.419-.823-1.416-2.871.005-3.69a2.13 2.13 0 0 1 2.134.003l90.152 52.3a4 4 0 0 0 4.004.005l18.822-10.847a4 4 0 0 1 4.005.006l42.468 24.637c1.418.823 1.416 2.872-.005 3.69a2.13 2.13 0 0 1-2.134-.003l-40.431-23.456a4 4 0 0 0-4.005-.005l-18.822 10.847a4 4 0 0 1-4.004-.006zM295.783 346.863a2.1 2.1 0 0 1 2.095.003l136.698 79.307c1.393.808 1.39 2.821-.005 3.625a2.09 2.09 0 0 1-2.096-.003l-136.698-79.308c-1.392-.808-1.389-2.82.006-3.624M364.957 414.802c2.665-1.537 2.67-5.382.009-6.926l-84.047-48.759c-1.418-.822-1.415-2.871.005-3.69a2.13 2.13 0 0 1 2.134.003l90.328 52.405c2.662 1.544 2.656 5.39-.01 6.926l-10.843 6.249c-2.666 1.536-2.672 5.381-.01 6.925l34.326 19.915c1.418.822 1.415 2.871-.005 3.69a2.13 2.13 0 0 1-2.134-.003l-40.609-23.557c-2.661-1.544-2.656-5.389.01-6.925z"})),n||(n=I.createElement("path",{fill:"#293858",d:"M265.033 368.209c-1.392-.808-1.39-2.82.005-3.624a2.09 2.09 0 0 1 2.096.003l75.905 44.035c2.662 1.544 2.656 5.388-.009 6.925l-15.564 8.972c-2.665 1.537-2.67 5.382-.009 6.926l48.826 28.326c1.393.808 1.39 2.82-.005 3.624a2.09 2.09 0 0 1-2.096-.003l-55.144-31.992c-2.661-1.544-2.656-5.388.009-6.925l15.564-8.973c2.665-1.537 2.671-5.382.009-6.925zM88.67 263.277a4 4 0 0 1 4.005.006l77.747 45.106c1.418.823 1.415 2.872-.006 3.691a2.13 2.13 0 0 1-2.134-.003l-75.635-43.882a4 4 0 0 0-4.005-.005l-23.464 13.525a4 4 0 0 1-4.005-.005L4.132 248.617c-1.394-.808-1.392-2.821.004-3.627a2.1 2.1 0 0 1 2.099.003l54.89 31.849a4 4 0 0 0 4.006.005z"})),i||(i=I.createElement("path",{fill:"#293858",d:"M186.326 299.22c1.418.823 1.415 2.872-.005 3.69a2.13 2.13 0 0 1-2.133-.003l-90.153-52.3a4 4 0 0 0-4.004-.006l-18.822 10.847a4 4 0 0 1-4.005-.005l-42.468-24.637c-1.418-.822-1.416-2.871.005-3.69a2.13 2.13 0 0 1 2.134.003l40.431 23.456a4 4 0 0 0 4.005.006l18.822-10.847a4 4 0 0 1 4.004.005zM201.217 294.325a2.1 2.1 0 0 1-2.096-.003L62.424 215.014c-1.393-.808-1.39-2.82.006-3.624a2.1 2.1 0 0 1 2.095.003L201.222 290.7c1.393.808 1.39 2.821-.005 3.625M132.043 226.387c-2.665 1.537-2.67 5.381-.009 6.925l84.047 48.759c1.418.823 1.415 2.871-.005 3.69a2.13 2.13 0 0 1-2.134-.003l-90.328-52.406c-2.662-1.544-2.656-5.389.01-6.925l10.843-6.249c2.666-1.537 2.672-5.382.01-6.926l-34.326-19.914c-1.418-.823-1.415-2.872.006-3.69a2.13 2.13 0 0 1 2.133.003l40.609 23.558c2.661 1.543 2.656 5.388-.01 6.925z"})),r||(r=I.createElement("path",{fill:"#4C5671",d:"m235.099 274.796-4.186 2.411-82.935-48.112 27.549-15.881-57.941-33.615 4.186-2.411 62.173 36.07-27.548 15.882z"})),s||(s=I.createElement("path",{fill:"#293858",d:"M88.67 377.911a4 4 0 0 0 4.005-.005l77.747-45.107c1.418-.823 1.415-2.871-.006-3.69a2.13 2.13 0 0 0-2.134.003l-75.635 43.881a4 4 0 0 1-4.005.006l-23.464-13.527a4 4 0 0 0-4.005.006L4.132 392.57c-1.394.809-1.392 2.822.003 3.628.65.375 1.451.374 2.1-.003l54.89-31.848a4 4 0 0 1 4.006-.006z"})),d||(d=I.createElement("path",{fill:"#293858",d:"M186.326 341.968c1.418-.823 1.416-2.871-.005-3.69a2.13 2.13 0 0 0-2.134.003l-90.152 52.3a4 4 0 0 1-4.004.005l-18.822-10.847a4 4 0 0 0-4.005.006l-42.468 24.637c-1.418.823-1.416 2.872.005 3.69a2.13 2.13 0 0 0 2.134-.003l40.431-23.456a4 4 0 0 1 4.005-.005l18.822 10.847a4 4 0 0 0 4.004-.006zM201.217 346.863a2.1 2.1 0 0 0-2.095.003L62.424 426.173c-1.393.808-1.39 2.821.005 3.625a2.09 2.09 0 0 0 2.096-.003l136.697-79.308c1.393-.808 1.39-2.82-.005-3.624M132.043 414.802c-2.665-1.537-2.67-5.382-.009-6.926l84.047-48.759c1.418-.822 1.415-2.871-.005-3.69a2.13 2.13 0 0 0-2.134.003l-90.328 52.405c-2.662 1.544-2.656 5.39.01 6.926l10.843 6.249c2.666 1.536 2.672 5.381.01 6.925l-34.326 19.915c-1.418.822-1.415 2.871.005 3.69a2.13 2.13 0 0 0 2.134-.003l40.608-23.557c2.662-1.544 2.657-5.389-.009-6.925z"})),o||(o=I.createElement("path",{fill:"#293858",d:"M231.967 368.209c1.393-.808 1.39-2.82-.005-3.624a2.09 2.09 0 0 0-2.096.003l-75.905 44.035c-2.662 1.544-2.656 5.388.009 6.925l15.564 8.972c2.666 1.537 2.671 5.382.01 6.926l-48.826 28.325c-1.393.809-1.39 2.821.005 3.625a2.09 2.09 0 0 0 2.096-.003l55.143-31.992c2.661-1.544 2.656-5.388-.009-6.925l-15.564-8.973c-2.665-1.537-2.67-5.382-.009-6.925zM408.33 263.277a4 4 0 0 0-4.005.006l-77.747 45.106c-1.418.823-1.415 2.872.006 3.691.66.381 1.474.379 2.134-.003l75.635-43.882a4 4 0 0 1 4.005-.005l23.464 13.525a4 4 0 0 0 4.005-.005l57.041-33.093c1.394-.808 1.392-2.821-.004-3.627a2.1 2.1 0 0 0-2.099.003l-54.891 31.849a4 4 0 0 1-4.005.005z"})),h||(h=I.createElement("path",{fill:"#293858",d:"M310.674 299.22c-1.418.823-1.415 2.872.005 3.69.66.381 1.474.38 2.133-.003l90.153-52.3a4 4 0 0 1 4.004-.006l18.822 10.847a4 4 0 0 0 4.005-.005l42.468-24.637c1.418-.822 1.415-2.871-.005-3.69a2.13 2.13 0 0 0-2.134.003l-40.431 23.456a4 4 0 0 1-4.005.006l-18.822-10.847a4 4 0 0 0-4.004.005zM295.783 294.325a2.1 2.1 0 0 0 2.096-.003l136.697-79.308c1.393-.808 1.389-2.82-.006-3.624a2.1 2.1 0 0 0-2.095.003L295.777 290.7c-1.392.808-1.39 2.821.006 3.625M364.957 226.387c2.665 1.537 2.67 5.381.009 6.925l-84.047 48.759c-1.418.823-1.415 2.871.005 3.69.661.38 1.474.379 2.134-.003l90.328-52.406c2.662-1.544 2.656-5.389-.01-6.925l-10.843-6.249c-2.666-1.537-2.672-5.382-.01-6.926l34.326-19.914c1.418-.823 1.415-2.872-.006-3.69a2.13 2.13 0 0 0-2.133.003l-40.609 23.558c-2.661 1.543-2.656 5.388.01 6.925z"})),m||(m=I.createElement("path",{fill:"#4C5671",d:"m261.902 274.796 4.185 2.411 82.935-48.112-27.548-15.881 57.94-33.615-4.185-2.411-62.174 36.07 27.548 15.882z"})),p||(p=I.createElement("path",{fill:"#0D1424",d:"m109.721 356.004 125.697 72.928c6.946 4.006 18.235 4.006 25.182 0l126.673-72.928c6.838-4.011 6.948-10.514 0-14.631l-125.697-72.928c-6.947-4.011-18.235-4.011-25.183 0l-126.564 73.033c-7.055 4.011-7.055 10.515-.108 14.526"})),f||(f=I.createElement("path",{fill:"#293858",d:"m109.8 341.454 126.6-72.971c6.942-4 18.23-4.032 25.181 0l125.722 72.939c6.953 4.036 6.86 10.56-.081 14.561L260.62 428.954c-6.998 4.031-18.228 4.031-25.181 0l-125.722-72.939c-6.952-4.032-6.915-10.529.083-14.561m2.638 9.879 125.729 72.932c5.231 3.048 14.464 3.037 19.743-.005l126.598-72.971c2.004-1.153 2.539-2.222 2.539-2.624 0-.386-.514-1.424-2.475-2.56l-125.718-72.934c-2.619-1.523-6.228-2.275-9.848-2.275-3.619 0-7.25.757-9.889 2.28l-126.604 72.971c-1.876 1.079-2.554 2.159-2.554 2.619-.001.45.656 1.508 2.479 2.567"})),E||(E=I.createElement("path",{fill:"#0B76DA",d:"m104.53 275.841.09 53.395c0 2.668 1.693 5.248 5.169 7.294l125.745 72.865c6.951 4.092 18.18 4.092 25.132 0l126.636-72.951c3.475-2.046 5.258-4.627 5.258-7.298l-.088-53.482c0 2.667-1.782 5.334-5.258 7.384l-126.637 72.951c-6.952 4.005-18.18 4.005-25.132 0L109.7 283.048c-3.476-2.051-5.17-4.626-5.17-7.207"})),u||(u=I.createElement("path",{fill:"#6BB8FF",d:"M109.8 268.482c-6.998 4.034-7.034 10.528-.082 14.561l125.722 72.938c6.953 4.034 18.183 4.034 25.181 0l126.601-72.97c6.941-4 7.034-10.527.081-14.561l-125.722-72.938c-6.952-4.033-18.239-4.001-25.181 0z"})),M||(M=I.createElement("path",{fill:"#fff",d:"m109.718 275.553 125.722 72.941c6.953 4.033 18.183 4.033 25.181 0l126.601-72.972c1.832-1.054 3.118-2.294 3.993-3.61 2.54 3.716 1.192 8.11-3.993 11.101L260.621 355.98c-6.998 4.032-18.228 4.032-25.181 0l-125.722-72.935c-5.129-2.979-6.393-7.287-3.926-10.964.865 1.265 2.159 2.45 3.926 3.472",opacity:.25})),z||(z=I.createElement("path",{fill:"#0D1424",d:"M202.7 360.579a2 2 0 0 1 1.001 1.74l-.055 14.743c-.005 1.536-1.668 2.492-2.998 1.725l-3.083-1.776a2 2 0 0 1-1.002-1.741l.055-14.743c.006-1.536 1.669-2.492 2.999-1.725zM216.447 368.502a2 2 0 0 1 1.001 1.74l-.054 14.743c-.006 1.536-1.669 2.493-2.999 1.726l-3.119-1.798a2 2 0 0 1-1.001-1.74l.054-14.743c.006-1.536 1.668-2.493 2.999-1.726zM230.157 376.405a2 2 0 0 1 1.001 1.74l-.054 14.742c-.006 1.536-1.668 2.493-2.998 1.726l-3.083-1.777a2 2 0 0 1-1.002-1.74l.055-14.742c.006-1.536 1.669-2.493 2.999-1.726z"})),g||(g=I.createElement("path",{fill:"#0B76DA",d:"m104.53 196.092.09 53.395c0 2.668 1.693 5.248 5.169 7.294l125.745 72.865c6.951 4.092 18.18 4.092 25.132 0l126.636-72.951c3.475-2.046 5.258-4.627 5.258-7.298l-.088-53.482c0 2.667-1.782 5.334-5.258 7.384L260.577 276.25c-6.952 4.005-18.18 4.005-25.132 0L109.7 203.299c-3.476-2.052-5.17-4.627-5.17-7.207"})),v||(v=I.createElement("path",{fill:"#6BB8FF",d:"M109.8 188.732c-6.998 4.034-7.034 10.528-.082 14.561l125.722 72.938c6.953 4.034 18.183 4.034 25.181 0l126.601-72.97c6.941-4 7.034-10.527.081-14.561l-125.722-72.938c-6.952-4.033-18.239-4.001-25.181 0z"})),b||(b=I.createElement("path",{fill:"#fff",d:"m109.718 195.803 125.722 72.941c6.953 4.033 18.183 4.033 25.181 0l126.601-72.972c1.832-1.054 3.118-2.294 3.993-3.61 2.54 3.715 1.192 8.11-3.993 11.101L260.621 276.23c-6.998 4.032-18.228 4.032-25.181 0l-125.722-72.935c-5.129-2.979-6.393-7.287-3.926-10.964.865 1.266 2.159 2.45 3.926 3.472",opacity:.25})),B||(B=I.createElement("path",{fill:"#0D1424",d:"M202.7 280.829a2 2 0 0 1 1.001 1.74l-.055 14.743c-.005 1.536-1.668 2.492-2.998 1.725l-3.083-1.776a2 2 0 0 1-1.002-1.74l.055-14.744c.006-1.536 1.669-2.492 2.999-1.725zM216.447 288.752a2 2 0 0 1 1.001 1.74l-.054 14.743c-.006 1.536-1.669 2.493-2.999 1.726l-3.119-1.798a2 2 0 0 1-1.001-1.74l.054-14.743c.006-1.536 1.668-2.493 2.999-1.726zM230.157 296.655a2 2 0 0 1 1.001 1.74l-.054 14.743c-.006 1.536-1.668 2.492-2.999 1.725l-3.082-1.777a2 2 0 0 1-1.002-1.74l.055-14.742c.006-1.536 1.669-2.493 2.999-1.726z"})),x||(x=I.createElement("path",{fill:"#0B76DA",d:"m104.53 116.342.09 53.395c0 2.668 1.693 5.248 5.169 7.294l125.745 72.865c6.951 4.092 18.18 4.092 25.132 0l126.636-72.951c3.475-2.046 5.258-4.627 5.258-7.298l-.088-53.482c0 2.667-1.782 5.334-5.258 7.384L260.577 196.5c-6.952 4.005-18.18 4.005-25.132 0L109.7 123.549c-3.476-2.051-5.17-4.627-5.17-7.207"})),L||(L=I.createElement("path",{fill:"#6BB8FF",d:"M109.8 108.983c-6.998 4.033-7.034 10.528-.082 14.561l125.722 72.938c6.953 4.034 18.183 4.035 25.181 0l126.601-72.97c6.941-4 7.034-10.527.081-14.561L261.581 36.013c-6.952-4.033-18.239-4.001-25.181 0z"})),j||(j=I.createElement("path",{fill:"#fff",d:"M322.392 124.432c5.332-3.073 5.342-10.763.02-13.85l-69.305-40.206a8 8 0 0 0-8.01-.011l-70.474 40.618c-5.331 3.073-5.342 10.764-.019 13.851l69.311 40.206a8 8 0 0 0 8.009.011z",opacity:.33})),y||(y=I.createElement("path",{fill:"#fff",d:"m109.718 116.053 125.722 72.941c6.953 4.033 18.183 4.033 25.181 0l126.601-72.971c1.832-1.054 3.118-2.294 3.993-3.61 2.54 3.716 1.192 8.11-3.993 11.101l-126.601 72.967c-6.998 4.032-18.228 4.032-25.181 0l-125.722-72.935c-5.129-2.979-6.393-7.287-3.926-10.964.865 1.265 2.159 2.449 3.926 3.471",opacity:.25})),F||(F=I.createElement("path",{fill:"#0D1424",d:"M202.7 201.079a2 2 0 0 1 1.001 1.74l-.055 14.744c-.005 1.535-1.668 2.492-2.999 1.725l-3.082-1.777a2 2 0 0 1-1.002-1.74l.055-14.743c.006-1.536 1.668-2.493 2.999-1.726zM216.447 209.003a2 2 0 0 1 1.001 1.74l-.054 14.742c-.006 1.536-1.669 2.493-2.999 1.726l-3.119-1.798a2 2 0 0 1-1.001-1.74l.054-14.743c.006-1.535 1.668-2.492 2.999-1.725zM230.157 216.906a2 2 0 0 1 1.001 1.74l-.054 14.743c-.006 1.535-1.668 2.492-2.998 1.725l-3.083-1.777a2 2 0 0 1-1.002-1.74l.055-14.743c.006-1.536 1.669-2.492 2.999-1.725z"})),w||(w=I.createElement("path",{fill:"#FFBAB4",d:"M144.949 314.218c2.468 1.421 4.449 4.881 4.441 7.71-.009 2.799-2.002 3.964-4.471 2.543s-4.449-4.881-4.44-7.679c.008-2.831 2.001-4.002 4.47-2.574",opacity:.5})),A||(A=I.createElement("path",{fill:"#FFE6B4",d:"M131.703 306.582c2.468 1.421 4.478 4.899 4.471 7.73-.008 2.798-2.031 3.946-4.5 2.524-2.438-1.402-4.449-4.881-4.441-7.679.007-2.83 2.031-3.983 4.47-2.575",opacity:.5})),D||(D=I.createElement("path",{fill:"#60EB98",d:"M118.486 298.965c2.469 1.42 4.449 4.881 4.441 7.71-.009 2.798-2.001 3.964-4.47 2.543s-4.45-4.881-4.441-7.68c.009-2.829 2.002-4 4.47-2.573"})),N||(N=I.createElement("path",{fill:"#FFBAB4",d:"M144.949 234.468c2.468 1.42 4.449 4.881 4.441 7.71-.009 2.799-2.002 3.964-4.471 2.542-2.469-1.42-4.449-4.88-4.44-7.679.008-2.829 2.001-4.001 4.47-2.573",opacity:.5})),C||(C=I.createElement("path",{fill:"#FFE6B4",d:"M131.703 226.832c2.468 1.421 4.478 4.899 4.471 7.73-.008 2.798-2.031 3.946-4.5 2.524-2.438-1.402-4.449-4.881-4.441-7.679.007-2.83 2.031-3.983 4.47-2.575"})),_||(_=I.createElement("path",{fill:"#60EB98",d:"M118.486 219.216c2.469 1.421 4.449 4.881 4.441 7.71-.009 2.798-2.001 3.964-4.47 2.543s-4.45-4.881-4.441-7.679c.009-2.831 2.002-4.002 4.47-2.574",opacity:.5})),S||(S=I.createElement("path",{fill:"#FFBAB4",d:"M144.949 154.718c2.468 1.42 4.449 4.881 4.441 7.71-.009 2.798-2.002 3.964-4.471 2.543s-4.449-4.881-4.44-7.68c.008-2.829 2.001-4 4.47-2.573",opacity:.5})),k||(k=I.createElement("path",{fill:"#FFE6B4",d:"M131.703 147.082c2.468 1.421 4.478 4.899 4.471 7.73-.008 2.798-2.031 3.946-4.5 2.524-2.438-1.402-4.449-4.881-4.441-7.679.007-2.83 2.031-3.983 4.47-2.575",opacity:.5})),O||(O=I.createElement("path",{fill:"#60EB98",d:"M118.486 139.466c2.469 1.42 4.449 4.881 4.441 7.71-.009 2.798-2.001 3.964-4.47 2.543s-4.45-4.881-4.441-7.68c.009-2.829 2.002-4.001 4.47-2.573"})))}},3709:(l,e,a)=>{a.r(e),a.d(e,{default:()=>p});a(6540);var c=a(4164),t=a(1297),n=a(4783);const i={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"},r={features:"features_xdhU",featureSvg:"featureSvg__8YW"};var s=a(4848);const d=[{title:"a9s CLI",Svg:a(1012).A,description:(0,s.jsx)(s.Fragment,{children:"A single Go binary to help with app development. Create local Kubernetes clusters and install a8s PostgreSQL with ease."}),button:{label:"a9s CLI Docs",link:"/docs/a9s-cli"}},{title:"Tutorial: Demo App + a8s PostgreSQL",Svg:a(5069).A,description:(0,s.jsx)(s.Fragment,{children:"Provision a local Kubernetes cluster using Kind or Minikube, install a PostgreSQL operator, deploy a demo application, load data into the database as well as perform backup and restore operations."}),button:{label:"Hands-On Tutorial",link:"/docs/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/"}}];function o(l){let{Svg:e,title:a,description:t,button:i}=l;return(0,s.jsxs)("div",{className:(0,c.A)("col col--6"),children:[(0,s.jsx)("div",{className:"text--center",children:(0,s.jsx)(e,{className:r.featureSvg,alt:a})}),(0,s.jsxs)("div",{className:"text--center padding-horiz--md",children:[(0,s.jsx)("h2",{children:a}),(0,s.jsx)("p",{children:t}),(0,s.jsx)(n.A,{className:"button button--secondary button--lg",to:i.link,children:i.label})]})]})}function h(){return(0,s.jsx)("section",{className:r.features,children:(0,s.jsx)("div",{className:"container",children:(0,s.jsx)("div",{className:"row",children:d.map(((l,e)=>(0,s.jsx)(o,{...l},e)))})})})}function m(){return(0,s.jsx)("header",{className:(0,c.A)("hero",i.heroBanner),children:(0,s.jsxs)("div",{className:"container",children:[(0,s.jsx)("h1",{className:"hero__title",children:"a9s CLI Documentation"}),(0,s.jsx)("p",{className:"hero__subtitle",children:"Here you can find all the relevant Documentation about the a9s CLI, a single Go binary helping you with application development and managing cloud data."}),(0,s.jsx)("div",{className:i.buttons,children:(0,s.jsx)(n.A,{className:"button button--secondary button--lg",to:"/docs/a9s-cli",children:"Get Started"})})]})})}function p(){return(0,s.jsxs)(t.A,{title:"anynines Docs",description:"The anynines Documentation and Changelog",children:[(0,s.jsx)(m,{}),(0,s.jsx)("main",{children:(0,s.jsx)(h,{})})]})}}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.837bf033.js b/assets/js/ccc49370.837bf033.js new file mode 100644 index 0000000..d7d419b --- /dev/null +++ b/assets/js/ccc49370.837bf033.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[3249],{1917:(e,n,t)=>{t.r(n),t.d(n,{default:()=>b});t(6540);var i=t(4164),a=t(6644),s=t(8630),r=t(9101),o=t(6953),l=t(8406),c=t(3230),d=t(3555),u=t(4848);function m(e){const{nextItem:n,prevItem:t}=e;return(0,u.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.T)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[t&&(0,u.jsx)(d.A,{...t,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer post"})}),n&&(0,u.jsx)(d.A,{...n,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post",children:"Older post"}),isNext:!0})]})}function h(){const{assets:e,metadata:n}=(0,r.e7)(),{title:t,description:i,date:s,tags:o,authors:l,frontMatter:c}=n,{keywords:d}=c,m=e.image??c.image;return(0,u.jsxs)(a.be,{title:c.title_meta??t,description:i,keywords:d,image:m,children:[(0,u.jsx)("meta",{property:"og:type",content:"article"}),(0,u.jsx)("meta",{property:"article:published_time",content:s}),l.some((e=>e.url))&&(0,u.jsx)("meta",{property:"article:author",content:l.map((e=>e.url)).filter(Boolean).join(",")}),o.length>0&&(0,u.jsx)("meta",{property:"article:tag",content:o.map((e=>e.label)).join(",")})]})}var f=t(1141);function g(){const e=(0,r.J_)();return(0,u.jsx)(f.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(e)})})}var p=t(8793),v=t(4648);function x(e){let{sidebar:n,children:t}=e;const{metadata:i,toc:a}=(0,r.e7)(),{nextItem:s,prevItem:c,frontMatter:d}=i,{hide_table_of_contents:h,toc_min_heading_level:f,toc_max_heading_level:g}=d;return(0,u.jsxs)(o.A,{sidebar:n,toc:!h&&a.length>0?(0,u.jsx)(p.A,{toc:a,minHeadingLevel:f,maxHeadingLevel:g}):void 0,children:[(0,u.jsx)(v.A,{metadata:i}),(0,u.jsx)(l.A,{children:t}),(s||c)&&(0,u.jsx)(m,{nextItem:s,prevItem:c})]})}function b(e){const n=e.content;return(0,u.jsx)(r.in,{content:e.content,isBlogPostPage:!0,children:(0,u.jsxs)(a.e3,{className:(0,i.A)(s.G.wrapper.blogPages,s.G.page.blogPostPage),children:[(0,u.jsx)(h,{}),(0,u.jsx)(g,{}),(0,u.jsx)(x,{sidebar:e.sidebar,children:(0,u.jsx)(n,{})})]})})}},8811:(e,n,t)=>{t.d(n,{A:()=>c});t(6540);var i=t(4164),a=t(6907),s=t(8630),r=t(4182),o=t(4848);function l(e){let{className:n}=e;return(0,o.jsx)(r.A,{type:"caution",title:(0,o.jsx)(a.Rc,{}),className:(0,i.A)(n,s.G.common.unlistedBanner),children:(0,o.jsx)(a.Uh,{})})}function c(e){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(a.AE,{}),(0,o.jsx)(l,{...e})]})}},4648:(e,n,t)=>{t.d(n,{A:()=>d});t(6540);var i=t(4164),a=t(6907),s=t(8630),r=t(4182),o=t(4848);function l(e){let{className:n}=e;return(0,o.jsx)(r.A,{type:"caution",title:(0,o.jsx)(a.Yh,{}),className:(0,i.A)(n,s.G.common.draftBanner),children:(0,o.jsx)(a.TT,{})})}var c=t(8811);function d(e){let{metadata:n}=e;const{unlisted:t,frontMatter:i}=n;return(0,o.jsxs)(o.Fragment,{children:[(t||i.unlisted)&&(0,o.jsx)(c.A,{}),i.draft&&(0,o.jsx)(l,{})]})}},8793:(e,n,t)=>{t.d(n,{A:()=>c});t(6540);var i=t(4164),a=t(1507);const s={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var r=t(4848);const o="table-of-contents__link toc-highlight",l="table-of-contents__link--active";function c(e){let{className:n,...t}=e;return(0,r.jsx)("div",{className:(0,i.A)(s.tableOfContents,"thin-scrollbar",n),children:(0,r.jsx)(a.A,{...t,linkClassName:o,linkActiveClassName:l})})}},1507:(e,n,t)=>{t.d(n,{A:()=>g});var i=t(6540),a=t(6957);function s(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),t=Array(7).fill(-1);n.forEach(((e,n)=>{const i=t.slice(2,e.level);e.parentIndex=Math.max(...i),t[e.level]=n}));const i=[];return n.forEach((e=>{const{parentIndex:t,...a}=e;t>=0?n[t].children.push(a):i.push(a)})),i}function r(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:i}=e;return n.flatMap((e=>{const n=r({toc:e.children,minHeadingLevel:t,maxHeadingLevel:i});return function(e){return e.level>=t&&e.level<=i}(e)?[{...e,children:n}]:n}))}function o(e){const n=e.getBoundingClientRect();return n.top===n.bottom?o(e.parentNode):n}function l(e,n){let{anchorTopOffset:t}=n;const i=e.find((e=>o(e).top>=t));if(i){return function(e){return e.top>0&&e.bottom {e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,i.useRef)(void 0),t=c();(0,i.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:i,linkActiveClassName:a,minHeadingLevel:s,maxHeadingLevel:r}=e;function o(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(i),o=function(e){let{minHeadingLevel:n,maxHeadingLevel:t}=e;const i=[];for(let a=n;a<=t;a+=1)i.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(i.join()))}({minHeadingLevel:s,maxHeadingLevel:r}),c=l(o,{anchorTopOffset:t.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(a),e.classList.add(a),n.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",o),document.addEventListener("resize",o),o(),()=>{document.removeEventListener("scroll",o),document.removeEventListener("resize",o)}}),[e,t])}var u=t(4783),m=t(4848);function h(e){let{toc:n,className:t,linkClassName:i,isChild:a}=e;return n.length?(0,m.jsx)("ul",{className:a?void 0:t,children:n.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:t,linkClassName:i})]},e.id)))}):null}const f=i.memo(h);function g(e){let{toc:n,className:t="table-of-contents table-of-contents__left-border",linkClassName:o="table-of-contents__link",linkActiveClassName:l,minHeadingLevel:c,maxHeadingLevel:u,...h}=e;const g=(0,a.p)(),p=c??g.tableOfContents.minHeadingLevel,v=u??g.tableOfContents.maxHeadingLevel,x=function(e){let{toc:n,minHeadingLevel:t,maxHeadingLevel:a}=e;return(0,i.useMemo)((()=>r({toc:s(n),minHeadingLevel:t,maxHeadingLevel:a})),[n,t,a])}({toc:n,minHeadingLevel:p,maxHeadingLevel:v});return d((0,i.useMemo)((()=>{if(o&&l)return{linkClassName:o,linkActiveClassName:l,minHeadingLevel:p,maxHeadingLevel:v}}),[o,l,p,v])),(0,m.jsx)(f,{toc:x,className:t,linkClassName:o,...h})}},6907:(e,n,t)=>{t.d(n,{AE:()=>l,Rc:()=>r,TT:()=>d,Uh:()=>o,Yh:()=>c});t(6540);var i=t(3230),a=t(1141),s=t(4848);function r(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function o(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function l(){return(0,s.jsx)(a.A,{children:(0,s.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function c(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,s.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}}}]); \ No newline at end of file diff --git a/assets/js/ccc49370.af6e3952.js b/assets/js/ccc49370.af6e3952.js deleted file mode 100644 index 8be7370..0000000 --- a/assets/js/ccc49370.af6e3952.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[3249],{8024:(e,t,n)=>{n.r(t),n.d(t,{default:()=>j});n(6540);var i=n(4164),a=n(4714),o=n(8570),s=n(542),r=n(1510),l=n(4247),c=n(6885),d=n(9215),u=n(4848);function m(e){const{nextItem:t,prevItem:n}=e;return(0,u.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,c.T)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"}),children:[n&&(0,u.jsx)(d.A,{...n,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post",children:"Newer Post"})}),t&&(0,u.jsx)(d.A,{...t,subLabel:(0,u.jsx)(c.A,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post",children:"Older Post"}),isNext:!0})]})}function g(){const{assets:e,metadata:t}=(0,s.e)(),{title:n,description:i,date:o,tags:r,authors:l,frontMatter:c}=t,{keywords:d}=c,m=e.image??c.image;return(0,u.jsxs)(a.be,{title:n,description:i,keywords:d,image:m,children:[(0,u.jsx)("meta",{property:"og:type",content:"article"}),(0,u.jsx)("meta",{property:"article:published_time",content:o}),l.some((e=>e.url))&&(0,u.jsx)("meta",{property:"article:author",content:l.map((e=>e.url)).filter(Boolean).join(",")}),r.length>0&&(0,u.jsx)("meta",{property:"article:tag",content:r.map((e=>e.label)).join(",")})]})}var h=n(4993),f=n(2818);function p(){const e=(0,f.J)();return(0,u.jsx)(h.A,{children:(0,u.jsx)("script",{type:"application/ld+json",children:JSON.stringify(e)})})}var v=n(4515),x=n(8105);function b(e){let{sidebar:t,children:n}=e;const{metadata:i,toc:a}=(0,s.e)(),{nextItem:o,prevItem:c,frontMatter:d,unlisted:g}=i,{hide_table_of_contents:h,toc_min_heading_level:f,toc_max_heading_level:p}=d;return(0,u.jsxs)(r.A,{sidebar:t,toc:!h&&a.length>0?(0,u.jsx)(v.A,{toc:a,minHeadingLevel:f,maxHeadingLevel:p}):void 0,children:[g&&(0,u.jsx)(x.A,{}),(0,u.jsx)(l.A,{children:n}),(o||c)&&(0,u.jsx)(m,{nextItem:o,prevItem:c})]})}function j(e){const t=e.content;return(0,u.jsx)(s.i,{content:e.content,isBlogPostPage:!0,children:(0,u.jsxs)(a.e3,{className:(0,i.A)(o.G.wrapper.blogPages,o.G.page.blogPostPage),children:[(0,u.jsx)(g,{}),(0,u.jsx)(p,{}),(0,u.jsx)(b,{sidebar:e.sidebar,children:(0,u.jsx)(t,{})})]})})}},4515:(e,t,n)=>{n.d(t,{A:()=>c});n(6540);var i=n(4164),a=n(1216);const o={tableOfContents:"tableOfContents_bqdL",docItemContainer:"docItemContainer_F8PC"};var s=n(4848);const r="table-of-contents__link toc-highlight",l="table-of-contents__link--active";function c(e){let{className:t,...n}=e;return(0,s.jsx)("div",{className:(0,i.A)(o.tableOfContents,"thin-scrollbar",t),children:(0,s.jsx)(a.A,{...n,linkClassName:r,linkActiveClassName:l})})}},1216:(e,t,n)=>{n.d(t,{A:()=>f});var i=n(6540),a=n(7513);function o(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const i=n.slice(2,e.level);e.parentIndex=Math.max(...i),n[e.level]=t}));const i=[];return t.forEach((e=>{const{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):i.push(a)})),i}function s(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:i}=e;return t.flatMap((e=>{const t=s({toc:e.children,minHeadingLevel:n,maxHeadingLevel:i});return function(e){return e.level>=n&&e.level<=i}(e)?[{...e,children:t}]:t}))}function r(e){const t=e.getBoundingClientRect();return t.top===t.bottom?r(e.parentNode):t}function l(e,t){let{anchorTopOffset:n}=t;const i=e.find((e=>r(e).top>=n));if(i){return function(e){return e.top>0&&e.bottom {e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,i.useRef)(void 0),n=c();(0,i.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:i,linkActiveClassName:a,minHeadingLevel:o,maxHeadingLevel:s}=e;function r(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(i),r=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const i=[];for(let a=t;a<=n;a+=1)i.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(i.join()))}({minHeadingLevel:o,maxHeadingLevel:s}),c=l(r,{anchorTopOffset:n.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(a),e.classList.add(a),t.current=e):e.classList.remove(a)}(e,e===d)}))}return document.addEventListener("scroll",r),document.addEventListener("resize",r),r(),()=>{document.removeEventListener("scroll",r),document.removeEventListener("resize",r)}}),[e,n])}var u=n(7083),m=n(4848);function g(e){let{toc:t,className:n,linkClassName:i,isChild:a}=e;return t.length?(0,m.jsx)("ul",{className:a?void 0:n,children:t.map((e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:i??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(g,{isChild:!0,toc:e.children,className:n,linkClassName:i})]},e.id)))}):null}const h=i.memo(g);function f(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:r="table-of-contents__link",linkActiveClassName:l,minHeadingLevel:c,maxHeadingLevel:u,...g}=e;const f=(0,a.p)(),p=c??f.tableOfContents.minHeadingLevel,v=u??f.tableOfContents.maxHeadingLevel,x=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,i.useMemo)((()=>s({toc:o(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:p,maxHeadingLevel:v});return d((0,i.useMemo)((()=>{if(r&&l)return{linkClassName:r,linkActiveClassName:l,minHeadingLevel:p,maxHeadingLevel:v}}),[r,l,p,v])),(0,m.jsx)(h,{toc:x,className:n,linkClassName:r,...g})}},8105:(e,t,n)=>{n.d(t,{A:()=>g});n(6540);var i=n(4164),a=n(6885),o=n(4993),s=n(4848);function r(){return(0,s.jsx)(a.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,s.jsx)(a.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,s.jsx)(o.A,{children:(0,s.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=n(8570),u=n(7570);function m(e){let{className:t}=e;return(0,s.jsx)(u.A,{type:"caution",title:(0,s.jsx)(r,{}),className:(0,i.A)(t,d.G.common.unlistedBanner),children:(0,s.jsx)(l,{})})}function g(e){return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(c,{}),(0,s.jsx)(m,{...e})]})}},2818:(e,t,n)=>{n.d(t,{k:()=>d,J:()=>u});var i=n(5176),a=n(1059),o=n(5860);var s=n(542);const r=e=>new Date(e).toISOString();function l(e){const t=e.map(m);return{author:1===t.length?t[0]:t}}function c(e,t,n){return e?{image:g({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${n}`})}:{}}function d(e){const{siteConfig:t}=(0,a.A)(),{withBaseUrl:n}=(0,i.hH)(),{metadata:{blogDescription:o,blogTitle:s,permalink:d}}=e,u=`${t.url}${d}`;return{"@context":"https://schema.org","@type":"Blog","@id":u,mainEntityOfPage:u,headline:s,description:o,blogPost:e.items.map((e=>function(e,t,n){const{assets:i,frontMatter:a,metadata:o}=e,{date:s,title:d,description:u,lastUpdatedAt:m}=o,g=i.image??a.image,h=a.keywords??[],f=`${t.url}${o.permalink}`,p=m?r(m):void 0;return{"@type":"BlogPosting","@id":f,mainEntityOfPage:f,url:f,headline:d,name:d,description:u,datePublished:s,...p?{dateModified:p}:{},...l(o.authors),...c(g,n,d),...h?{keywords:h}:{}}}(e.content,t,n)))}}function u(){const e=function(){const e=(0,o.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}(),{assets:t,metadata:n}=(0,s.e)(),{siteConfig:d}=(0,a.A)(),{withBaseUrl:u}=(0,i.hH)(),{date:m,title:g,description:h,frontMatter:f,lastUpdatedAt:p}=n,v=t.image??f.image,x=f.keywords??[],b=p?r(p):void 0,j=`${d.url}${n.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":j,mainEntityOfPage:j,url:j,headline:g,name:g,description:h,datePublished:m,...b?{dateModified:b}:{},...l(n.authors),...c(v,u,g),...x?{keywords:x}:{},isPartOf:{"@type":"Blog","@id":`${d.url}${e.blogBasePath}`,name:e.blogTitle}}}function m(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function g(e){let{imageUrl:t,caption:n}=e;return{"@type":"ImageObject","@id":t,url:t,contentUrl:t,caption:n}}}}]); \ No newline at end of file diff --git a/assets/js/cedda78d.4ed2f31c.js b/assets/js/cedda78d.4ed2f31c.js deleted file mode 100644 index a45aa63..0000000 --- a/assets/js/cedda78d.4ed2f31c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[7191],{5499:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>h,frontMatter:()=>l,metadata:()=>t,toc:()=>a});var i=s(4848),c=s(8453);const l={id:"a9s-cli-klutch",title:"a9s CLI Klutch",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]},r="klutch Stack",t={id:"a9s-cli-klutch",title:"a9s CLI Klutch",description:"Create a local Klutch central management cluster using Kind, including the a8s stack. Deploy a consumer cluster and bind resources to the management cluster.",source:"@site/versioned_docs/version-0.14.0/a9s-cli-klutch.md",sourceDirName:".",slug:"/a9s-cli-klutch",permalink:"/docs/a9s-cli-klutch",draft:!1,unlisted:!1,tags:[{inline:!0,label:"a9s cli",permalink:"/docs/tags/a-9-s-cli"},{inline:!0,label:"a9s hub",permalink:"/docs/tags/a-9-s-hub"},{inline:!0,label:"a9s data services",permalink:"/docs/tags/a-9-s-data-services"},{inline:!0,label:"a8s data services",permalink:"/docs/tags/a-8-s-data-services"},{inline:!0,label:"a9s postgres",permalink:"/docs/tags/a-9-s-postgres"},{inline:!0,label:"a8s postgres",permalink:"/docs/tags/a-8-s-postgres"},{inline:!0,label:"data service",permalink:"/docs/tags/data-service"},{inline:!0,label:"introduction",permalink:"/docs/tags/introduction"},{inline:!0,label:"kubernetes",permalink:"/docs/tags/kubernetes"},{inline:!0,label:"minikube",permalink:"/docs/tags/minikube"},{inline:!0,label:"kind",permalink:"/docs/tags/kind"},{inline:!0,label:"klutch",permalink:"/docs/tags/klutch"}],version:"0.14.0",frontMatter:{id:"a9s-cli-klutch",title:"a9s CLI Klutch",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]}},d={},a=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installing the kubectl-bind
plugin:",id:"installing-the-kubectl-bind-plugin",level:3},{value:"Running on Linux",id:"running-on-linux",level:3},{value:"Commands",id:"commands",level:2},{value:"1.deploy
",id:"1-deploy",level:3},{value:"2.bind
",id:"2-bind",level:3},{value:"3.delete
",id:"3-delete",level:3}];function o(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,c.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h1,{id:"klutch-stack",children:"klutch Stack"}),"\n",(0,i.jsxs)(n.p,{children:["Create a local Klutch central management cluster using ",(0,i.jsx)(n.code,{children:"Kind"}),", including the ",(0,i.jsx)(n.code,{children:"a8s"})," stack. Deploy a consumer cluster and ",(0,i.jsx)(n.strong,{children:"bind"})," resources to the management cluster.\nThis will allow you to use ",(0,i.jsx)(n.code,{children:"a8s"})," resource instances such as ",(0,i.jsx)(n.code,{children:"postgresql"})," on the consumer cluster, which will run on the management cluster."]}),"\n",(0,i.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/docs/a9s-cli#prerequisites",children:"General prerequisites"})," are met."]}),"\n",(0,i.jsxs)(n.li,{children:["Install ",(0,i.jsx)(n.a,{href:"https://helm.sh/docs/intro/install/",children:"Helm"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Install ",(0,i.jsx)(n.code,{children:"kubectl-bind"})," plugin version 1.3.0 or higher (see below)."]}),"\n",(0,i.jsxs)(n.li,{children:["On ",(0,i.jsx)(n.strong,{children:"linux"}),", docker must be runnable without sudo. See the ",(0,i.jsx)(n.a,{href:"https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user",children:"docker documentation"})," for further details."]}),"\n"]}),"\n",(0,i.jsxs)(n.h3,{id:"installing-the-kubectl-bind-plugin",children:["Installing the ",(0,i.jsx)(n.code,{children:"kubectl-bind"})," plugin:"]}),"\n",(0,i.jsxs)(n.p,{children:["Download a binary for your platform with the following URL, make it executable and place it in a location in your ",(0,i.jsx)(n.code,{children:"PATH"}),":"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"https://anynines-artifacts.s3.eu-central-1.amazonaws.com/central-management/v1.3.0/$OS-$ARCH/kubectl-bind"})}),"\n",(0,i.jsxs)(n.p,{children:["Replace ",(0,i.jsx)(n.code,{children:"OS"})," and ",(0,i.jsx)(n.code,{children:"ARCH"})," with values for your platform, e.g. ",(0,i.jsx)(n.code,{children:"darwin-arm64"})," or ",(0,i.jsx)(n.code,{children:"linux-amd64"}),". You can also use the following script to achieve this:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'RELEASE="v1.3.0"\nOS=$(go env GOOS); ARCH=$(go env GOARCH); curl -fsSL -o kubectl-bind https://anynines-artifacts.s3.eu-central-1.amazonaws.com/central-management/$RELEASE/$OS-$ARCH/kubectl-bind\n\nsudo chmod 755 kubectl-bind\nsudo mv kubectl-bind /usr/local/bin\n'})}),"\n",(0,i.jsx)(n.h3,{id:"running-on-linux",children:"Running on Linux"}),"\n",(0,i.jsxs)(n.p,{children:["To avoid issues with ",(0,i.jsx)(n.code,{children:"Kind"})," on Linux, increase the ",(0,i.jsx)(n.code,{children:"inotify"})," resource limits as described ",(0,i.jsx)(n.a,{href:"https://kind.sigs.k8s.io/docs/user/known-issues/#pod-errors-due-to-too-many-open-files",children:"here"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"commands",children:"Commands"}),"\n",(0,i.jsxs)(n.h3,{id:"1-deploy",children:["1. ",(0,i.jsx)(n.code,{children:"deploy"})]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Usage"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"a9s klutch deploy [options]\n"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Options"}),":"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Flag"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Example"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsxs)(n.td,{children:[(0,i.jsx)(n.code,{children:"-y"}),", ",(0,i.jsx)(n.code,{children:"--yes"})]}),(0,i.jsx)(n.td,{children:"Skip confirmation prompts"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"a9s klutch deploy --yes"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"--port"})}),(0,i.jsxs)(n.td,{children:["The port to expose the management cluster on. Defaults to ",(0,i.jsx)(n.code,{children:"8080"}),"."]}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"a9s klutch deploy --port 8080"})})]})]})]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Description"}),":"]}),"\n",(0,i.jsxs)(n.p,{children:["This command deploys a ",(0,i.jsx)(n.code,{children:"Kind"})," cluster named ",(0,i.jsx)(n.code,{children:"klutch-management"})," and installs the required\ncomponents for Klutch. These components include:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.code,{children:"klutch-bind"})," backend and ",(0,i.jsx)(n.a,{href:"https://dexidp.io/",children:"Dex Idp"})," as a dummy OICD provider."]}),"\n",(0,i.jsx)(n.li,{children:"Crossplane and the anynines configuration packages."}),"\n",(0,i.jsxs)(n.li,{children:["The complete ",(0,i.jsx)(n.code,{children:"a8s"})," stack including ",(0,i.jsx)(n.code,{children:"Postgresql"})," operator, backup, restore and service binding capabilities."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["In addition to the management cluster, a ",(0,i.jsx)(n.strong,{children:"consumer"})," cluster named ",(0,i.jsx)(n.code,{children:"klutch-consumer"})," is deployed. This cluster can be used for the ",(0,i.jsx)(n.code,{children:"a9s klutch bind"})," command to bind resources to the management cluster."]}),"\n",(0,i.jsx)(n.p,{children:"The management cluster exports the following resources for binding:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"postgresqlinstance.anynines.com"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"servicebinding.anynines.com"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"backup.anynines.com"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"restore.anynines.com"})}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Important"}),": For technical reasons, the management cluster is exposed on the local network using the local IP address. If your IP or network changes, the management cluster may become unreachable and will have to be redeployed."]}),"\n",(0,i.jsxs)(n.h3,{id:"2-bind",children:["2. ",(0,i.jsx)(n.code,{children:"bind"})]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Usage"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"a9s klutch bind [options]\n"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Options"}),":"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Flag"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Example"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsxs)(n.td,{children:[(0,i.jsx)(n.code,{children:"-y"}),", ",(0,i.jsx)(n.code,{children:"--yes"})]}),(0,i.jsx)(n.td,{children:"Skip confirmation prompts"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"a9s klutch bind --yes"})})]})})]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Description"}),":"]}),"\n",(0,i.jsxs)(n.p,{children:["This command will invoke ",(0,i.jsx)(n.code,{children:"kubectl bind"})," in order to bind a resource exported by the management cluster. This process will open a browser window for you where you can authenticate with the dummy dex OIDC provider using these credentials:"]}),"\n",(0,i.jsxs)(n.p,{children:["Email: ",(0,i.jsx)(n.code,{children:"admin@example.com"})]}),"\n",(0,i.jsxs)(n.p,{children:["Password: ",(0,i.jsx)(n.code,{children:"password"})]}),"\n",(0,i.jsxs)(n.p,{children:["After logging in, grant access, and then ",(0,i.jsx)(n.strong,{children:"choose the resource you would like to bind"}),". Once this is done, return to your terminal and wait for the process to finish."]}),"\n",(0,i.jsxs)(n.p,{children:["After the ",(0,i.jsx)(n.code,{children:"bind"})," command has succeeded, you can deploy instances of the chosen resource on your consumer cluster, which will run in the management cluster. The command will print an example manifest for the resource you bound that you can apply to the consumer cluster with ",(0,i.jsx)(n.code,{children:"kubectl"}),". You can do this easily by copying the printed yaml and using a heredoc, like so:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"kubectl apply -f - <\nEOF\n"})}),"\n",(0,i.jsxs)(n.h3,{id:"3-delete",children:["3. ",(0,i.jsx)(n.code,{children:"delete"})]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Usage"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"a9s klutch delete [options]\n"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Options"}),":"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Flag"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Example"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsxs)(n.td,{children:[(0,i.jsx)(n.code,{children:"-y"}),", ",(0,i.jsx)(n.code,{children:"--yes"})]}),(0,i.jsx)(n.td,{children:"Skip confirmation prompts"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"a9s klutch delete --yes"})})]})})]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Description"}),":"]}),"\n",(0,i.jsx)(n.p,{children:"This command deletes the management and consumer clusters."})]})}function h(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>t});var i=s(6540);const c={},l=i.createContext(c);function r(e){const n=i.useContext(l);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:r(e.components),i.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cedda78d.d7c5af7a.js b/assets/js/cedda78d.d7c5af7a.js new file mode 100644 index 0000000..1d8458d --- /dev/null +++ b/assets/js/cedda78d.d7c5af7a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[7191],{104:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>t,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"a9s-cli-klutch","title":"a9s CLI Klutch","description":"Create a local Klutch central management cluster using Kind, including the a8s stack. Deploy a consumer cluster and bind resources to the management cluster.","source":"@site/versioned_docs/version-0.14.0/a9s-cli-klutch.md","sourceDirName":".","slug":"/a9s-cli-klutch","permalink":"/docs/a9s-cli-klutch","draft":false,"unlisted":false,"tags":[{"inline":true,"label":"a9s cli","permalink":"/docs/tags/a-9-s-cli"},{"inline":true,"label":"a9s hub","permalink":"/docs/tags/a-9-s-hub"},{"inline":true,"label":"a9s data services","permalink":"/docs/tags/a-9-s-data-services"},{"inline":true,"label":"a8s data services","permalink":"/docs/tags/a-8-s-data-services"},{"inline":true,"label":"a9s postgres","permalink":"/docs/tags/a-9-s-postgres"},{"inline":true,"label":"a8s postgres","permalink":"/docs/tags/a-8-s-postgres"},{"inline":true,"label":"data service","permalink":"/docs/tags/data-service"},{"inline":true,"label":"introduction","permalink":"/docs/tags/introduction"},{"inline":true,"label":"kubernetes","permalink":"/docs/tags/kubernetes"},{"inline":true,"label":"minikube","permalink":"/docs/tags/minikube"},{"inline":true,"label":"kind","permalink":"/docs/tags/kind"},{"inline":true,"label":"klutch","permalink":"/docs/tags/klutch"}],"version":"0.14.0","frontMatter":{"id":"a9s-cli-klutch","title":"a9s CLI Klutch","tags":["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],"keywords":["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]}}');var c=s(4848),l=s(8453);const r={id:"a9s-cli-klutch",title:"a9s CLI Klutch",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind","klutch"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind","klutch"]},t="klutch Stack",d={},a=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Installing the kubectl-bind
plugin:",id:"installing-the-kubectl-bind-plugin",level:3},{value:"Running on Linux",id:"running-on-linux",level:3},{value:"Commands",id:"commands",level:2},{value:"1.deploy
",id:"1-deploy",level:3},{value:"2.bind
",id:"2-bind",level:3},{value:"3.delete
",id:"3-delete",level:3}];function o(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(n.header,{children:(0,c.jsx)(n.h1,{id:"klutch-stack",children:"klutch Stack"})}),"\n",(0,c.jsxs)(n.p,{children:["Create a local Klutch central management cluster using ",(0,c.jsx)(n.code,{children:"Kind"}),", including the ",(0,c.jsx)(n.code,{children:"a8s"})," stack. Deploy a consumer cluster and ",(0,c.jsx)(n.strong,{children:"bind"})," resources to the management cluster.\nThis will allow you to use ",(0,c.jsx)(n.code,{children:"a8s"})," resource instances such as ",(0,c.jsx)(n.code,{children:"postgresql"})," on the consumer cluster, which will run on the management cluster."]}),"\n",(0,c.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:[(0,c.jsx)(n.a,{href:"/docs/a9s-cli#prerequisites",children:"General prerequisites"})," are met."]}),"\n",(0,c.jsxs)(n.li,{children:["Install ",(0,c.jsx)(n.a,{href:"https://helm.sh/docs/intro/install/",children:"Helm"}),"."]}),"\n",(0,c.jsxs)(n.li,{children:["Install ",(0,c.jsx)(n.code,{children:"kubectl-bind"})," plugin version 1.3.0 or higher (see below)."]}),"\n",(0,c.jsxs)(n.li,{children:["On ",(0,c.jsx)(n.strong,{children:"linux"}),", docker must be runnable without sudo. See the ",(0,c.jsx)(n.a,{href:"https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user",children:"docker documentation"})," for further details."]}),"\n"]}),"\n",(0,c.jsxs)(n.h3,{id:"installing-the-kubectl-bind-plugin",children:["Installing the ",(0,c.jsx)(n.code,{children:"kubectl-bind"})," plugin:"]}),"\n",(0,c.jsxs)(n.p,{children:["Download a binary for your platform with the following URL, make it executable and place it in a location in your ",(0,c.jsx)(n.code,{children:"PATH"}),":"]}),"\n",(0,c.jsx)(n.p,{children:(0,c.jsx)(n.code,{children:"https://anynines-artifacts.s3.eu-central-1.amazonaws.com/central-management/v1.3.0/$OS-$ARCH/kubectl-bind"})}),"\n",(0,c.jsxs)(n.p,{children:["Replace ",(0,c.jsx)(n.code,{children:"OS"})," and ",(0,c.jsx)(n.code,{children:"ARCH"})," with values for your platform, e.g. ",(0,c.jsx)(n.code,{children:"darwin-arm64"})," or ",(0,c.jsx)(n.code,{children:"linux-amd64"}),". You can also use the following script to achieve this:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-bash",children:'RELEASE="v1.3.0"\nOS=$(go env GOOS); ARCH=$(go env GOARCH); curl -fsSL -o kubectl-bind https://anynines-artifacts.s3.eu-central-1.amazonaws.com/central-management/$RELEASE/$OS-$ARCH/kubectl-bind\n\nsudo chmod 755 kubectl-bind\nsudo mv kubectl-bind /usr/local/bin\n'})}),"\n",(0,c.jsx)(n.h3,{id:"running-on-linux",children:"Running on Linux"}),"\n",(0,c.jsxs)(n.p,{children:["To avoid issues with ",(0,c.jsx)(n.code,{children:"Kind"})," on Linux, increase the ",(0,c.jsx)(n.code,{children:"inotify"})," resource limits as described ",(0,c.jsx)(n.a,{href:"https://kind.sigs.k8s.io/docs/user/known-issues/#pod-errors-due-to-too-many-open-files",children:"here"}),"."]}),"\n",(0,c.jsx)(n.h2,{id:"commands",children:"Commands"}),"\n",(0,c.jsxs)(n.h3,{id:"1-deploy",children:["1. ",(0,c.jsx)(n.code,{children:"deploy"})]}),"\n",(0,c.jsxs)(n.p,{children:[(0,c.jsx)(n.strong,{children:"Usage"}),":"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-bash",children:"a9s klutch deploy [options]\n"})}),"\n",(0,c.jsxs)(n.p,{children:[(0,c.jsx)(n.strong,{children:"Options"}),":"]}),"\n",(0,c.jsxs)(n.table,{children:[(0,c.jsx)(n.thead,{children:(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.th,{children:"Flag"}),(0,c.jsx)(n.th,{children:"Description"}),(0,c.jsx)(n.th,{children:"Example"})]})}),(0,c.jsxs)(n.tbody,{children:[(0,c.jsxs)(n.tr,{children:[(0,c.jsxs)(n.td,{children:[(0,c.jsx)(n.code,{children:"-y"}),", ",(0,c.jsx)(n.code,{children:"--yes"})]}),(0,c.jsx)(n.td,{children:"Skip confirmation prompts"}),(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"a9s klutch deploy --yes"})})]}),(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"--port"})}),(0,c.jsxs)(n.td,{children:["The port to expose the management cluster on. Defaults to ",(0,c.jsx)(n.code,{children:"8080"}),"."]}),(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"a9s klutch deploy --port 8080"})})]})]})]}),"\n",(0,c.jsxs)(n.p,{children:[(0,c.jsx)(n.strong,{children:"Description"}),":"]}),"\n",(0,c.jsxs)(n.p,{children:["This command deploys a ",(0,c.jsx)(n.code,{children:"Kind"})," cluster named ",(0,c.jsx)(n.code,{children:"klutch-management"})," and installs the required\ncomponents for Klutch. These components include:"]}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsxs)(n.li,{children:["The ",(0,c.jsx)(n.code,{children:"klutch-bind"})," backend and ",(0,c.jsx)(n.a,{href:"https://dexidp.io/",children:"Dex Idp"})," as a dummy OICD provider."]}),"\n",(0,c.jsx)(n.li,{children:"Crossplane and the anynines configuration packages."}),"\n",(0,c.jsxs)(n.li,{children:["The complete ",(0,c.jsx)(n.code,{children:"a8s"})," stack including ",(0,c.jsx)(n.code,{children:"Postgresql"})," operator, backup, restore and service binding capabilities."]}),"\n"]}),"\n",(0,c.jsxs)(n.p,{children:["In addition to the management cluster, a ",(0,c.jsx)(n.strong,{children:"consumer"})," cluster named ",(0,c.jsx)(n.code,{children:"klutch-consumer"})," is deployed. This cluster can be used for the ",(0,c.jsx)(n.code,{children:"a9s klutch bind"})," command to bind resources to the management cluster."]}),"\n",(0,c.jsx)(n.p,{children:"The management cluster exports the following resources for binding:"}),"\n",(0,c.jsxs)(n.ul,{children:["\n",(0,c.jsx)(n.li,{children:(0,c.jsx)(n.code,{children:"postgresqlinstance.anynines.com"})}),"\n",(0,c.jsx)(n.li,{children:(0,c.jsx)(n.code,{children:"servicebinding.anynines.com"})}),"\n",(0,c.jsx)(n.li,{children:(0,c.jsx)(n.code,{children:"backup.anynines.com"})}),"\n",(0,c.jsx)(n.li,{children:(0,c.jsx)(n.code,{children:"restore.anynines.com"})}),"\n"]}),"\n",(0,c.jsxs)(n.p,{children:[(0,c.jsx)(n.strong,{children:"Important"}),": For technical reasons, the management cluster is exposed on the local network using the local IP address. If your IP or network changes, the management cluster may become unreachable and will have to be redeployed."]}),"\n",(0,c.jsxs)(n.h3,{id:"2-bind",children:["2. ",(0,c.jsx)(n.code,{children:"bind"})]}),"\n",(0,c.jsxs)(n.p,{children:[(0,c.jsx)(n.strong,{children:"Usage"}),":"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{children:"a9s klutch bind [options]\n"})}),"\n",(0,c.jsxs)(n.p,{children:[(0,c.jsx)(n.strong,{children:"Options"}),":"]}),"\n",(0,c.jsxs)(n.table,{children:[(0,c.jsx)(n.thead,{children:(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.th,{children:"Flag"}),(0,c.jsx)(n.th,{children:"Description"}),(0,c.jsx)(n.th,{children:"Example"})]})}),(0,c.jsx)(n.tbody,{children:(0,c.jsxs)(n.tr,{children:[(0,c.jsxs)(n.td,{children:[(0,c.jsx)(n.code,{children:"-y"}),", ",(0,c.jsx)(n.code,{children:"--yes"})]}),(0,c.jsx)(n.td,{children:"Skip confirmation prompts"}),(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"a9s klutch bind --yes"})})]})})]}),"\n",(0,c.jsxs)(n.p,{children:[(0,c.jsx)(n.strong,{children:"Description"}),":"]}),"\n",(0,c.jsxs)(n.p,{children:["This command will invoke ",(0,c.jsx)(n.code,{children:"kubectl bind"})," in order to bind a resource exported by the management cluster. This process will open a browser window for you where you can authenticate with the dummy dex OIDC provider using these credentials:"]}),"\n",(0,c.jsxs)(n.p,{children:["Email: ",(0,c.jsx)(n.code,{children:"admin@example.com"})]}),"\n",(0,c.jsxs)(n.p,{children:["Password: ",(0,c.jsx)(n.code,{children:"password"})]}),"\n",(0,c.jsxs)(n.p,{children:["After logging in, grant access, and then ",(0,c.jsx)(n.strong,{children:"choose the resource you would like to bind"}),". Once this is done, return to your terminal and wait for the process to finish."]}),"\n",(0,c.jsxs)(n.p,{children:["After the ",(0,c.jsx)(n.code,{children:"bind"})," command has succeeded, you can deploy instances of the chosen resource on your consumer cluster, which will run in the management cluster. The command will print an example manifest for the resource you bound that you can apply to the consumer cluster with ",(0,c.jsx)(n.code,{children:"kubectl"}),". You can do this easily by copying the printed yaml and using a heredoc, like so:"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-bash",children:"kubectl apply -f - <\nEOF\n"})}),"\n",(0,c.jsxs)(n.h3,{id:"3-delete",children:["3. ",(0,c.jsx)(n.code,{children:"delete"})]}),"\n",(0,c.jsxs)(n.p,{children:[(0,c.jsx)(n.strong,{children:"Usage"}),":"]}),"\n",(0,c.jsx)(n.pre,{children:(0,c.jsx)(n.code,{className:"language-bash",children:"a9s klutch delete [options]\n"})}),"\n",(0,c.jsxs)(n.p,{children:[(0,c.jsx)(n.strong,{children:"Options"}),":"]}),"\n",(0,c.jsxs)(n.table,{children:[(0,c.jsx)(n.thead,{children:(0,c.jsxs)(n.tr,{children:[(0,c.jsx)(n.th,{children:"Flag"}),(0,c.jsx)(n.th,{children:"Description"}),(0,c.jsx)(n.th,{children:"Example"})]})}),(0,c.jsx)(n.tbody,{children:(0,c.jsxs)(n.tr,{children:[(0,c.jsxs)(n.td,{children:[(0,c.jsx)(n.code,{children:"-y"}),", ",(0,c.jsx)(n.code,{children:"--yes"})]}),(0,c.jsx)(n.td,{children:"Skip confirmation prompts"}),(0,c.jsx)(n.td,{children:(0,c.jsx)(n.code,{children:"a9s klutch delete --yes"})})]})})]}),"\n",(0,c.jsxs)(n.p,{children:[(0,c.jsx)(n.strong,{children:"Description"}),":"]}),"\n",(0,c.jsx)(n.p,{children:"This command deletes the management and consumer clusters."})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,c.jsx)(n,{...e,children:(0,c.jsx)(o,{...e})}):o(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>t});var i=s(6540);const c={},l=i.createContext(c);function r(e){const n=i.useContext(l);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:r(e.components),i.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d9bdb70b.139b9190.js b/assets/js/d9bdb70b.139b9190.js new file mode 100644 index 0000000..9c6594d --- /dev/null +++ b/assets/js/d9bdb70b.139b9190.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[3347],{9220:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>t,metadata:()=>i,toc:()=>o});const i=JSON.parse('{"id":"a9s-cli","title":"a9s CLI","description":"anynines provides a command line tool called a9s to facilitate application development, devops tasks and interact with selected anynines products.","source":"@site/versioned_docs/version-0.13.0/a9s-cli.md","sourceDirName":".","slug":"/a9s-cli","permalink":"/docs/0.13.0/a9s-cli","draft":false,"unlisted":false,"tags":[{"inline":true,"label":"a9s cli","permalink":"/docs/0.13.0/tags/a-9-s-cli"},{"inline":true,"label":"a9s hub","permalink":"/docs/0.13.0/tags/a-9-s-hub"},{"inline":true,"label":"a9s data services","permalink":"/docs/0.13.0/tags/a-9-s-data-services"},{"inline":true,"label":"a8s data services","permalink":"/docs/0.13.0/tags/a-8-s-data-services"},{"inline":true,"label":"a9s postgres","permalink":"/docs/0.13.0/tags/a-9-s-postgres"},{"inline":true,"label":"a8s postgres","permalink":"/docs/0.13.0/tags/a-8-s-postgres"},{"inline":true,"label":"data service","permalink":"/docs/0.13.0/tags/data-service"},{"inline":true,"label":"introduction","permalink":"/docs/0.13.0/tags/introduction"},{"inline":true,"label":"kubernetes","permalink":"/docs/0.13.0/tags/kubernetes"},{"inline":true,"label":"minikube","permalink":"/docs/0.13.0/tags/minikube"},{"inline":true,"label":"kind","permalink":"/docs/0.13.0/tags/kind"}],"version":"0.13.0","frontMatter":{"id":"a9s-cli","title":"a9s CLI","tags":["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind"],"keywords":["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind"]}}');var r=n(4848),a=n(8453);const t={id:"a9s-cli",title:"a9s CLI",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind"]},c="a9s CLI",l={},o=[{value:"Use Cases",id:"use-cases",level:2},{value:" a8s
Stack",id:"a8s-stack",level:3},{value:"Cold-Run",id:"cold-run",level:2},{value:"Setting Up a Working Directory",id:"setting-up-a-working-directory",level:3},{value:"Configuring the Backup Store",id:"configuring-the-backup-store",level:3},{value:"Skip Checking Prerequisites",id:"skip-checking-prerequisites",level:2},{value:"Number of Kubernetes Nodes",id:"number-of-kubernetes-nodes",level:2},{value:"Cluster Memory",id:"cluster-memory",level:2},{value:"Deployment Version",id:"deployment-version",level:2},{value:"Kubernetes Provider",id:"kubernetes-provider",level:2},{value:"Backup Infrastructure Region",id:"backup-infrastructure-region",level:2},{value:"Unattended Mode",id:"unattended-mode",level:2},{value:"Printing the Working Directory",id:"printing-the-working-directory",level:2},{value:"Creating a PostgreSQL Service Instance",id:"creating-a-postgresql-service-instance",level:2},{value:"Creating PostgreSQL Service Instance YAML Without Applying it",id:"creating-postgresql-service-instance-yaml-without-applying-it",level:3},{value:"Creating a Custom PostgreSQL Service Instance",id:"creating-a-custom-postgresql-service-instance",level:3},{value:"Deleting a PostgreSQL Service Instance",id:"deleting-a-postgresql-service-instance",level:2},{value:"Applying a SQL File to a PostgreSQL Service Instance",id:"applying-a-sql-file-to-a-postgresql-service-instance",level:2},{value:"Applying a SQL Statement to a PostgreSQL Service Instance",id:"applying-a-sql-statement-to-a-postgresql-service-instance",level:2},{value:"Creating a Backup of a PostgreSQL Service Instance",id:"creating-a-backup-of-a-postgresql-service-instance",level:2},{value:"Restoring a Backup of PostgreSQL Service Instance",id:"restoring-a-backup-of-postgresql-service-instance",level:2},{value:"Creating a PostgreSQL Service Binding",id:"creating-a-postgresql-service-binding",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"a9s-cli",children:"a9s CLI"})}),"\n",(0,r.jsxs)(s.p,{children:["anynines provides a command line tool called ",(0,r.jsx)(s.code,{children:"a9s"})," to facilitate application development, devops tasks and interact with selected anynines products."]}),"\n",(0,r.jsx)(s.h2,{id:"use-cases",children:"Use Cases"}),"\n",(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.code,{children:"a9s"})," CLI can be used to install and use the following stacks:"]}),"\n",(0,r.jsxs)(s.h3,{id:"a8s-stack",children:[(0,r.jsx)(s.code,{children:"a8s"})," Stack"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Install a local Kubernetes cluster (",(0,r.jsx)(s.code,{children:"minikube"})," or ",(0,r.jsx)(s.code,{children:"kind"}),")."]}),"\n",(0,r.jsxs)(s.li,{children:["Install the ",(0,r.jsx)(s.a,{href:"https://cert-manager.io/",children:"cert-manager"}),"."]}),"\n",(0,r.jsx)(s.li,{children:"Install a local Minio object store for storing Backups."}),"\n",(0,r.jsxs)(s.li,{children:["Install the a8s PostgreSQL Operator PostgreSQL supporting","\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["creating dedicated PostgreSQL clusters with","\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"synchronous and asynchronous streaming replication."}),"\n",(0,r.jsx)(s.li,{children:"automatic failure detection and automatic failover."}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(s.li,{children:"backup and restore capabilities storing backups in an S3 compatible object store such as AWS S3 or Minio."}),"\n",(0,r.jsx)(s.li,{children:"ability to easily create database users and Kubernetes Secrets by using the Service Bindings abstraction"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["Easily apply ",(0,r.jsx)(s.code,{children:".sql"})," files and SQL commands to PostgreSQL clusters."]}),"\n"]}),"\n",(0,r.jsx)(s.h1,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Using the backup/restore feature of a8s PostgreSQL requires an S3 compatible endpoint."}),"\n",(0,r.jsxs)(s.li,{children:["Install Go (if you want ",(0,r.jsx)(s.code,{children:"go env"})," to identify your OS and arch)."]}),"\n",(0,r.jsx)(s.li,{children:"Install Git."}),"\n",(0,r.jsx)(s.li,{children:"Install Docker."}),"\n",(0,r.jsx)(s.li,{children:"Install Kubectl."}),"\n",(0,r.jsx)(s.li,{children:"Install Kind and/or Minikube."}),"\n",(0,r.jsxs)(s.li,{children:["Install the ",(0,r.jsx)(s.a,{href:"https://cert-manager.io/docs/reference/cmctl/",children:"cert-manager CLI"}),"."]}),"\n"]}),"\n",(0,r.jsx)(s.h1,{id:"installing-the-cli",children:"Installing the CLI"}),"\n",(0,r.jsxs)(s.p,{children:["In order to install the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI execute the following shell script:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"RELEASE=$(curl -L -s https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/stable.txt); OS=$(go env GOOS); ARCH=$(go env GOARCH); curl -fsSL -o a9s https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/releases/$RELEASE/a9s-$OS-$ARCH\n \nsudo chmod 755 a9s\nsudo mv a9s /usr/local/bin\n"})}),"\n",(0,r.jsxs)(s.p,{children:["This will download the ",(0,r.jsx)(s.code,{children:"a9s"})," binary suitable for your architecture and move it to ",(0,r.jsx)(s.code,{children:"/usr/local/bin"}),".\nDepending on your system you have to adjust the ",(0,r.jsx)(s.code,{children:"PATH"})," variable or move the binary to a folder that's already in the ",(0,r.jsx)(s.code,{children:"PATH"}),"."]}),"\n",(0,r.jsx)(s.h1,{id:"using-the-cli",children:"Using the CLI"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s\n"})}),"\n",(0,r.jsx)(s.h1,{id:"creating-a-local-a8s-postgres-cluster",children:"Creating a Local a8s Postgres Cluster"}),"\n",(0,r.jsxs)(s.p,{children:["Create a local Kubernetes cluster using ",(0,r.jsx)(s.code,{children:"Minikube"})," or ",(0,r.jsx)(s.code,{children:"Kind"}),", ",(0,r.jsx)(s.strong,{children:"install a8s PostgreSQL"})," including its dependencies as well as a local ",(0,r.jsx)(s.a,{href:"https://min.io/",children:"Minio"})," object store."]}),"\n",(0,r.jsxs)(s.p,{children:["Get ready for ",(0,r.jsx)(s.strong,{children:"local development of applications with PostgreSQL"})," and/or ",(0,r.jsx)(s.strong,{children:"experimentation with a8s Postgres"})," by issuing the command:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s\n"})}),"\n",(0,r.jsx)(s.p,{children:"Recommended is 12 GB of free memory for the creation of three cluster nodes with each 4 GB. The number of nodes and memory size can be adjusted."}),"\n",(0,r.jsx)(s.h2,{id:"cold-run",children:"Cold-Run"}),"\n",(0,r.jsx)(s.p,{children:"When creating a cluster for the first time, a few setup steps will have to be taken which need to be performed only once:"}),"\n",(0,r.jsxs)(s.ol,{children:["\n",(0,r.jsxs)(s.li,{children:["Setting up a working directory for the use with the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI. ",(0,r.jsx)(s.strong,{children:"This step asks for your confirmation of the proposed directory."})]}),"\n",(0,r.jsx)(s.li,{children:"Configuring the access credentials for the S3 compatible object store which is needed to use the backup/restore feature of a8s Postgres. This step is performed automatically."}),"\n",(0,r.jsxs)(s.li,{children:["Cloning deployment resources required by the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI to create a cluster. This step is performed automatically."]}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"setting-up-a-working-directory",children:"Setting Up a Working Directory"}),"\n",(0,r.jsxs)(s.p,{children:["The working directory is where are ",(0,r.jsx)(s.code,{children:"a9s"})," CLI related resources will go. This includes ",(0,r.jsx)(s.code,{children:"yaml"})," specifications being cloned from remote repositories, but also those generated by the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI for your convenience."]}),"\n",(0,r.jsxs)(s.p,{children:["Once established, the working directory is stored in the ",(0,r.jsx)(s.code,{children:"~/.a9s"})," configuration file."]}),"\n",(0,r.jsxs)(s.p,{children:["The default working directory is ",(0,r.jsx)(s.code,{children:"~/a9s"}),"."]}),"\n",(0,r.jsx)(s.p,{children:"Alternatively, provide a custom working directory at the corresponding prompt."}),"\n",(0,r.jsx)(s.h3,{id:"configuring-the-backup-store",children:"Configuring the Backup Store"}),"\n",(0,r.jsx)(s.p,{children:"A non-prod Minio object store is installed in your local Kubernetes cluster and is automatically configured as the default backup store for a8s PostgreSQL backups."}),"\n",(0,r.jsxs)(s.p,{children:["If you want to use an alternative backup store, see ",(0,r.jsx)(s.code,{children:"a9s create cluster a8s --help"})," for the defaults of your particular CLI version and list of configuration options."]}),"\n",(0,r.jsx)(s.p,{children:"Most S3 compatible object stores, including AWS S3 itself of course, should work."}),"\n",(0,r.jsx)(s.h2,{id:"skip-checking-prerequisites",children:"Skip Checking Prerequisites"}),"\n",(0,r.jsx)(s.p,{children:"It is possible to skip the verification of prerequisites. This includes skipping the search for: required shell commands, a running Docker daemon and a running Kubernetes cluster."}),"\n",(0,r.jsxs)(s.p,{children:["In order to skip precheck use the ",(0,r.jsx)(s.code,{children:"--no-precheck"})," option:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --no-precheck\n"})}),"\n",(0,r.jsx)(s.h2,{id:"number-of-kubernetes-nodes",children:"Number of Kubernetes Nodes"}),"\n",(0,r.jsx)(s.p,{children:"Specifying the number of Nodes in the Kubernetes cluster:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --cluster-nr-of-nodes 1\n"})}),"\n",(0,r.jsx)(s.h2,{id:"cluster-memory",children:"Cluster Memory"}),"\n",(0,r.jsxs)(s.p,{children:["Specifying the memory of ",(0,r.jsx)(s.strong,{children:"each"})," Node of the Kubernetes cluster:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --cluster-memory 4gb\n"})}),"\n",(0,r.jsx)(s.h2,{id:"deployment-version",children:"Deployment Version"}),"\n",(0,r.jsxs)(s.p,{children:["The deployment version refers to the version of manifests used for installing software. Deployment versions are managed by anynines in a Git repository. The deployment version option allows you to select a particular version of the deployment manifests identified by ",(0,r.jsx)(s.strong,{children:"Git tags"}),"."]}),"\n",(0,r.jsxs)(s.p,{children:["Select a particular release by providing the ",(0,r.jsx)(s.code,{children:"--deployment-version"})," parameter:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --deployment-version v1.2.0\n"})}),"\n",(0,r.jsx)(s.p,{children:"Use:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --deployment-version latest\n"})}),"\n",(0,r.jsx)(s.p,{children:"To get the latest, untagged version of the deployment manifests."}),"\n",(0,r.jsx)(s.h2,{id:"kubernetes-provider",children:"Kubernetes Provider"}),"\n",(0,r.jsxs)(s.p,{children:["When creating a Kubernetes cluster, the mechanism to manage the cluster can be selected by specifying the ",(0,r.jsx)(s.code,{children:"--provider"})," option:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s -p kind \na9s create cluster a8s -p minikube (default)\n"})}),"\n",(0,r.jsx)(s.p,{children:"Follow the instructions to learn about available sub commands."}),"\n",(0,r.jsx)(s.h2,{id:"backup-infrastructure-region",children:"Backup Infrastructure Region"}),"\n",(0,r.jsxs)(s.p,{children:["When using the backup and restore functionality, a backup infrastructure region must be specified by using the ",(0,r.jsx)(s.code,{children:"--backup-region"})," option:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --backup-region us-east-1\n"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note"}),": By default, an existing ",(0,r.jsx)(s.code,{children:"backup-config.yaml"})," will be used. Hence, if you intend to change\nyour backup config, remove the existing ",(0,r.jsx)(s.code,{children:"backup-config.yaml"}),", first:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"rm a8s-deployment/deploy/a8s/backup-config/backup-store-config.yaml\n"})}),"\n",(0,r.jsx)(s.h2,{id:"unattended-mode",children:"Unattended Mode"}),"\n",(0,r.jsxs)(s.p,{children:["It is possible to skip all yes-no questions by ",(0,r.jsx)(s.strong,{children:"enabling the unattended mode"})," by passing the ",(0,r.jsx)(s.code,{children:"-y"})," or ",(0,r.jsx)(s.code,{children:"--yes"})," flag:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --yes\n"})}),"\n",(0,r.jsx)(s.h2,{id:"printing-the-working-directory",children:"Printing the Working Directory"}),"\n",(0,r.jsxs)(s.p,{children:["The working directory is stored in the ",(0,r.jsx)(s.code,{children:"~/.a8s"})," configuration file. The working directory contains all resources downloaded and generated by the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI."]}),"\n",(0,r.jsx)(s.p,{children:"To print the working directory execute:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s cluster pwd\n"})}),"\n",(0,r.jsx)(s.h1,{id:"a8s-postgresql",children:"a8s PostgreSQL"}),"\n",(0,r.jsxs)(s.p,{children:["A selected subset of the a8s PostgreSQL features are available through the ",(0,r.jsx)(s.code,{children:"a9s"})," CLI."]}),"\n",(0,r.jsx)(s.h2,{id:"creating-a-postgresql-service-instance",children:"Creating a PostgreSQL Service Instance"}),"\n",(0,r.jsxs)(s.p,{children:["Creating a service instance with the name ",(0,r.jsx)(s.code,{children:"sample-pg-cluster"}),":"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --name sample-pg-cluster\n"})}),"\n",(0,r.jsxs)(s.p,{children:["The generated YAML specification will be stored in the ",(0,r.jsx)(s.code,{children:"usermanifests"}),"."]}),"\n",(0,r.jsx)(s.h3,{id:"creating-postgresql-service-instance-yaml-without-applying-it",children:"Creating PostgreSQL Service Instance YAML Without Applying it"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --name sample-pg-cluster --no-apply\n"})}),"\n",(0,r.jsxs)(s.p,{children:["The generated YAML specification will be stored in the ",(0,r.jsx)(s.code,{children:"usermanifests"})," but ",(0,r.jsx)(s.code,{children:"kubectl apply"})," won't be executed."]}),"\n",(0,r.jsx)(s.h3,{id:"creating-a-custom-postgresql-service-instance",children:"Creating a Custom PostgreSQL Service Instance"}),"\n",(0,r.jsx)(s.p,{children:"The command:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --api-version v1beta3 --name sample-pg-cluster --namespace default --replicas 3 --requests-cpu 200m --limits-memory 200Mi --service-version 14 --volume-size 2Gi\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Will generate a YAML spec called ",(0,r.jsx)(s.code,{children:"usermanifests/my-pg-instance.yaml"})," with the following content:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-yaml",children:"apiVersion: postgresql.anynines.com/v1beta3\nkind: Postgresql\nmetadata:\n name: my-pg\nspec:\n replicas: 3\n resources:\n limits:\n memory: 200m\n requests:\n cpu: 200m\n version: 14\n volumeSize: 2Gi\n"})}),"\n",(0,r.jsx)(s.h2,{id:"deleting-a-postgresql-service-instance",children:"Deleting a PostgreSQL Service Instance"}),"\n",(0,r.jsxs)(s.p,{children:["Deleting a service instance with the name ",(0,r.jsx)(s.code,{children:"sample-pg-cluster"}),":"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s delete pg instance --name sample-pg-cluster\n"})}),"\n",(0,r.jsx)(s.p,{children:"Or by providing an explicit namespace:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s delete pg instance --name sample-pg-cluster -n default\n"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note"}),": If the service instance doesn't exist, a warning is printed and the command exists with the\nreturn code ",(0,r.jsx)(s.code,{children:"0"})," as the desired state of the service instance being delete is reached."]}),"\n",(0,r.jsx)(s.h2,{id:"applying-a-sql-file-to-a-postgresql-service-instance",children:"Applying a SQL File to a PostgreSQL Service Instance"}),"\n",(0,r.jsxs)(s.p,{children:["Uploading a SQL file, executing it using ",(0,r.jsx)(s.code,{children:"psql"})," and deleting the file can be done with:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster\n"})}),"\n",(0,r.jsx)(s.p,{children:"The file is uploaded to the current primary pod of the service instance."}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note"}),": Ensure that, during the execution of the command, there is no change of the primary node for a given clustered service instance as otherwise the file upload may fail or target the wrong pod."]}),"\n",(0,r.jsxs)(s.p,{children:["Use ",(0,r.jsx)(s.code,{children:"--yes"})," to skip the confirmation prompt."]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster --yes\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Use ",(0,r.jsx)(s.code,{children:"--no-delete"})," to leave the file in the pod:"]}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster --no-delete\n"})}),"\n",(0,r.jsx)(s.h2,{id:"applying-a-sql-statement-to-a-postgresql-service-instance",children:"Applying a SQL Statement to a PostgreSQL Service Instance"}),"\n",(0,r.jsx)(s.p,{children:"Applying a SQL statement on the primary pod of a PostgreSQL service instance can be accomplished with:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:'a9s pg apply -i sample-pg-cluster --sql "select count(*) from posts" --yes\n'})}),"\n",(0,r.jsx)(s.h2,{id:"creating-a-backup-of-a-postgresql-service-instance",children:"Creating a Backup of a PostgreSQL Service Instance"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg backup --name sample-pg-cluster-backup-1 -i sample-pg-cluster\n"})}),"\n",(0,r.jsx)(s.h2,{id:"restoring-a-backup-of-postgresql-service-instance",children:"Restoring a Backup of PostgreSQL Service Instance"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg restore --name sample-pg-cluster-restore-1 -b sample-pg-cluster-backup-1 -i sample-pg-cluster\n"})}),"\n",(0,r.jsx)(s.h2,{id:"creating-a-postgresql-service-binding",children:"Creating a PostgreSQL Service Binding"}),"\n",(0,r.jsx)(s.p,{children:"A Service Binding is an entity facilitating the secure consumption of a service instance.\nBy creating a service instance, a Postgres user is created along with a corresponding Kubernetes Secret."}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s create pg servicebinding --name sb-clustered-1 -i sample-pg-cluster\n"})}),"\n",(0,r.jsxs)(s.p,{children:["Will therefore create a Kubernetes Secret named ",(0,r.jsx)(s.code,{children:"sb-clustered-1-service-binding"})," and provide the following\nkeys containing everything an application needs to connect to the PostgreSQL service instance:"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.code,{children:"database"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.code,{children:"instance_service"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.code,{children:"password"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.code,{children:"username"})}),"\n"]}),"\n",(0,r.jsx)(s.h1,{id:"cleaning-up",children:"Cleaning Up"}),"\n",(0,r.jsx)(s.p,{children:"In order to delete the cluster run:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"a9s delete cluster a8s\n"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Note"}),": This will not delete config files."]}),"\n",(0,r.jsx)(s.p,{children:"Config files are stored in the cluster working directory."}),"\n",(0,r.jsx)(s.p,{children:"They can be removed with:"}),"\n",(0,r.jsx)(s.pre,{children:(0,r.jsx)(s.code,{className:"language-bash",children:"rm -rf $( a9s cluster pwd )\n"})})]})}function h(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>t,x:()=>c});var i=n(6540);const r={},a=i.createContext(r);function t(e){const s=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),i.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d9bdb70b.c08b2995.js b/assets/js/d9bdb70b.c08b2995.js deleted file mode 100644 index 5efe88d..0000000 --- a/assets/js/d9bdb70b.c08b2995.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[3347],{908:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>a,metadata:()=>c,toc:()=>o});var i=n(4848),r=n(8453);const a={id:"a9s-cli",title:"a9s CLI",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind"]},t="a9s CLI",c={id:"a9s-cli",title:"a9s CLI",description:"anynines provides a command line tool called a9s to facilitate application development, devops tasks and interact with selected anynines products.",source:"@site/versioned_docs/version-0.13.0/a9s-cli.md",sourceDirName:".",slug:"/a9s-cli",permalink:"/docs/0.13.0/a9s-cli",draft:!1,unlisted:!1,tags:[{inline:!0,label:"a9s cli",permalink:"/docs/0.13.0/tags/a-9-s-cli"},{inline:!0,label:"a9s hub",permalink:"/docs/0.13.0/tags/a-9-s-hub"},{inline:!0,label:"a9s data services",permalink:"/docs/0.13.0/tags/a-9-s-data-services"},{inline:!0,label:"a8s data services",permalink:"/docs/0.13.0/tags/a-8-s-data-services"},{inline:!0,label:"a9s postgres",permalink:"/docs/0.13.0/tags/a-9-s-postgres"},{inline:!0,label:"a8s postgres",permalink:"/docs/0.13.0/tags/a-8-s-postgres"},{inline:!0,label:"data service",permalink:"/docs/0.13.0/tags/data-service"},{inline:!0,label:"introduction",permalink:"/docs/0.13.0/tags/introduction"},{inline:!0,label:"kubernetes",permalink:"/docs/0.13.0/tags/kubernetes"},{inline:!0,label:"minikube",permalink:"/docs/0.13.0/tags/minikube"},{inline:!0,label:"kind",permalink:"/docs/0.13.0/tags/kind"}],version:"0.13.0",frontMatter:{id:"a9s-cli",title:"a9s CLI",tags:["a9s cli","a9s hub","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","kubernetes","minikube","kind"],keywords:["a9s cli","a9s hub","a9s platform","a9s data services","a8s data services","a9s postgres","a8s postgres","data service","introduction","postgresql","kubernetes","minikube","kind"]}},l={},o=[{value:"Use Cases",id:"use-cases",level:2},{value:"a8s
Stack",id:"a8s-stack",level:3},{value:"Cold-Run",id:"cold-run",level:2},{value:"Setting Up a Working Directory",id:"setting-up-a-working-directory",level:3},{value:"Configuring the Backup Store",id:"configuring-the-backup-store",level:3},{value:"Skip Checking Prerequisites",id:"skip-checking-prerequisites",level:2},{value:"Number of Kubernetes Nodes",id:"number-of-kubernetes-nodes",level:2},{value:"Cluster Memory",id:"cluster-memory",level:2},{value:"Deployment Version",id:"deployment-version",level:2},{value:"Kubernetes Provider",id:"kubernetes-provider",level:2},{value:"Backup Infrastructure Region",id:"backup-infrastructure-region",level:2},{value:"Unattended Mode",id:"unattended-mode",level:2},{value:"Printing the Working Directory",id:"printing-the-working-directory",level:2},{value:"Creating a PostgreSQL Service Instance",id:"creating-a-postgresql-service-instance",level:2},{value:"Creating PostgreSQL Service Instance YAML Without Applying it",id:"creating-postgresql-service-instance-yaml-without-applying-it",level:3},{value:"Creating a Custom PostgreSQL Service Instance",id:"creating-a-custom-postgresql-service-instance",level:3},{value:"Deleting a PostgreSQL Service Instance",id:"deleting-a-postgresql-service-instance",level:2},{value:"Applying a SQL File to a PostgreSQL Service Instance",id:"applying-a-sql-file-to-a-postgresql-service-instance",level:2},{value:"Applying a SQL Statement to a PostgreSQL Service Instance",id:"applying-a-sql-statement-to-a-postgresql-service-instance",level:2},{value:"Creating a Backup of a PostgreSQL Service Instance",id:"creating-a-backup-of-a-postgresql-service-instance",level:2},{value:"Restoring a Backup of PostgreSQL Service Instance",id:"restoring-a-backup-of-postgresql-service-instance",level:2},{value:"Creating a PostgreSQL Service Binding",id:"creating-a-postgresql-service-binding",level:2}];function d(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.h1,{id:"a9s-cli",children:"a9s CLI"}),"\n",(0,i.jsxs)(s.p,{children:["anynines provides a command line tool called ",(0,i.jsx)(s.code,{children:"a9s"})," to facilitate application development, devops tasks and interact with selected anynines products."]}),"\n",(0,i.jsx)(s.h2,{id:"use-cases",children:"Use Cases"}),"\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.code,{children:"a9s"})," CLI can be used to install and use the following stacks:"]}),"\n",(0,i.jsxs)(s.h3,{id:"a8s-stack",children:[(0,i.jsx)(s.code,{children:"a8s"})," Stack"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Install a local Kubernetes cluster (",(0,i.jsx)(s.code,{children:"minikube"})," or ",(0,i.jsx)(s.code,{children:"kind"}),")."]}),"\n",(0,i.jsxs)(s.li,{children:["Install the ",(0,i.jsx)(s.a,{href:"https://cert-manager.io/",children:"cert-manager"}),"."]}),"\n",(0,i.jsx)(s.li,{children:"Install a local Minio object store for storing Backups."}),"\n",(0,i.jsxs)(s.li,{children:["Install the a8s PostgreSQL Operator PostgreSQL supporting","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["creating dedicated PostgreSQL clusters with","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"synchronous and asynchronous streaming replication."}),"\n",(0,i.jsx)(s.li,{children:"automatic failure detection and automatic failover."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.li,{children:"backup and restore capabilities storing backups in an S3 compatible object store such as AWS S3 or Minio."}),"\n",(0,i.jsx)(s.li,{children:"ability to easily create database users and Kubernetes Secrets by using the Service Bindings abstraction"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["Easily apply ",(0,i.jsx)(s.code,{children:".sql"})," files and SQL commands to PostgreSQL clusters."]}),"\n"]}),"\n",(0,i.jsx)(s.h1,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Using the backup/restore feature of a8s PostgreSQL requires an S3 compatible endpoint."}),"\n",(0,i.jsxs)(s.li,{children:["Install Go (if you want ",(0,i.jsx)(s.code,{children:"go env"})," to identify your OS and arch)."]}),"\n",(0,i.jsx)(s.li,{children:"Install Git."}),"\n",(0,i.jsx)(s.li,{children:"Install Docker."}),"\n",(0,i.jsx)(s.li,{children:"Install Kubectl."}),"\n",(0,i.jsx)(s.li,{children:"Install Kind and/or Minikube."}),"\n",(0,i.jsxs)(s.li,{children:["Install the ",(0,i.jsx)(s.a,{href:"https://cert-manager.io/docs/reference/cmctl/",children:"cert-manager CLI"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.h1,{id:"installing-the-cli",children:"Installing the CLI"}),"\n",(0,i.jsxs)(s.p,{children:["In order to install the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI execute the following shell script:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"RELEASE=$(curl -L -s https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/stable.txt); OS=$(go env GOOS); ARCH=$(go env GOARCH); curl -fsSL -o a9s https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/releases/$RELEASE/a9s-$OS-$ARCH\n \nsudo chmod 755 a9s\nsudo mv a9s /usr/local/bin\n"})}),"\n",(0,i.jsxs)(s.p,{children:["This will download the ",(0,i.jsx)(s.code,{children:"a9s"})," binary suitable for your architecture and move it to ",(0,i.jsx)(s.code,{children:"/usr/local/bin"}),".\nDepending on your system you have to adjust the ",(0,i.jsx)(s.code,{children:"PATH"})," variable or move the binary to a folder that's already in the ",(0,i.jsx)(s.code,{children:"PATH"}),"."]}),"\n",(0,i.jsx)(s.h1,{id:"using-the-cli",children:"Using the CLI"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s\n"})}),"\n",(0,i.jsx)(s.h1,{id:"creating-a-local-a8s-postgres-cluster",children:"Creating a Local a8s Postgres Cluster"}),"\n",(0,i.jsxs)(s.p,{children:["Create a local Kubernetes cluster using ",(0,i.jsx)(s.code,{children:"Minikube"})," or ",(0,i.jsx)(s.code,{children:"Kind"}),", ",(0,i.jsx)(s.strong,{children:"install a8s PostgreSQL"})," including its dependencies as well as a local ",(0,i.jsx)(s.a,{href:"https://min.io/",children:"Minio"})," object store."]}),"\n",(0,i.jsxs)(s.p,{children:["Get ready for ",(0,i.jsx)(s.strong,{children:"local development of applications with PostgreSQL"})," and/or ",(0,i.jsx)(s.strong,{children:"experimentation with a8s Postgres"})," by issuing the command:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s\n"})}),"\n",(0,i.jsx)(s.p,{children:"Recommended is 12 GB of free memory for the creation of three cluster nodes with each 4 GB. The number of nodes and memory size can be adjusted."}),"\n",(0,i.jsx)(s.h2,{id:"cold-run",children:"Cold-Run"}),"\n",(0,i.jsx)(s.p,{children:"When creating a cluster for the first time, a few setup steps will have to be taken which need to be performed only once:"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Setting up a working directory for the use with the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI. ",(0,i.jsx)(s.strong,{children:"This step asks for your confirmation of the proposed directory."})]}),"\n",(0,i.jsx)(s.li,{children:"Configuring the access credentials for the S3 compatible object store which is needed to use the backup/restore feature of a8s Postgres. This step is performed automatically."}),"\n",(0,i.jsxs)(s.li,{children:["Cloning deployment resources required by the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI to create a cluster. This step is performed automatically."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"setting-up-a-working-directory",children:"Setting Up a Working Directory"}),"\n",(0,i.jsxs)(s.p,{children:["The working directory is where are ",(0,i.jsx)(s.code,{children:"a9s"})," CLI related resources will go. This includes ",(0,i.jsx)(s.code,{children:"yaml"})," specifications being cloned from remote repositories, but also those generated by the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI for your convenience."]}),"\n",(0,i.jsxs)(s.p,{children:["Once established, the working directory is stored in the ",(0,i.jsx)(s.code,{children:"~/.a9s"})," configuration file."]}),"\n",(0,i.jsxs)(s.p,{children:["The default working directory is ",(0,i.jsx)(s.code,{children:"~/a9s"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"Alternatively, provide a custom working directory at the corresponding prompt."}),"\n",(0,i.jsx)(s.h3,{id:"configuring-the-backup-store",children:"Configuring the Backup Store"}),"\n",(0,i.jsx)(s.p,{children:"A non-prod Minio object store is installed in your local Kubernetes cluster and is automatically configured as the default backup store for a8s PostgreSQL backups."}),"\n",(0,i.jsxs)(s.p,{children:["If you want to use an alternative backup store, see ",(0,i.jsx)(s.code,{children:"a9s create cluster a8s --help"})," for the defaults of your particular CLI version and list of configuration options."]}),"\n",(0,i.jsx)(s.p,{children:"Most S3 compatible object stores, including AWS S3 itself of course, should work."}),"\n",(0,i.jsx)(s.h2,{id:"skip-checking-prerequisites",children:"Skip Checking Prerequisites"}),"\n",(0,i.jsx)(s.p,{children:"It is possible to skip the verification of prerequisites. This includes skipping the search for: required shell commands, a running Docker daemon and a running Kubernetes cluster."}),"\n",(0,i.jsxs)(s.p,{children:["In order to skip precheck use the ",(0,i.jsx)(s.code,{children:"--no-precheck"})," option:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --no-precheck\n"})}),"\n",(0,i.jsx)(s.h2,{id:"number-of-kubernetes-nodes",children:"Number of Kubernetes Nodes"}),"\n",(0,i.jsx)(s.p,{children:"Specifying the number of Nodes in the Kubernetes cluster:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --cluster-nr-of-nodes 1\n"})}),"\n",(0,i.jsx)(s.h2,{id:"cluster-memory",children:"Cluster Memory"}),"\n",(0,i.jsxs)(s.p,{children:["Specifying the memory of ",(0,i.jsx)(s.strong,{children:"each"})," Node of the Kubernetes cluster:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --cluster-memory 4gb\n"})}),"\n",(0,i.jsx)(s.h2,{id:"deployment-version",children:"Deployment Version"}),"\n",(0,i.jsxs)(s.p,{children:["The deployment version refers to the version of manifests used for installing software. Deployment versions are managed by anynines in a Git repository. The deployment version option allows you to select a particular version of the deployment manifests identified by ",(0,i.jsx)(s.strong,{children:"Git tags"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["Select a particular release by providing the ",(0,i.jsx)(s.code,{children:"--deployment-version"})," parameter:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --deployment-version v1.2.0\n"})}),"\n",(0,i.jsx)(s.p,{children:"Use:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --deployment-version latest\n"})}),"\n",(0,i.jsx)(s.p,{children:"To get the latest, untagged version of the deployment manifests."}),"\n",(0,i.jsx)(s.h2,{id:"kubernetes-provider",children:"Kubernetes Provider"}),"\n",(0,i.jsxs)(s.p,{children:["When creating a Kubernetes cluster, the mechanism to manage the cluster can be selected by specifying the ",(0,i.jsx)(s.code,{children:"--provider"})," option:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s -p kind \na9s create cluster a8s -p minikube (default)\n"})}),"\n",(0,i.jsx)(s.p,{children:"Follow the instructions to learn about available sub commands."}),"\n",(0,i.jsx)(s.h2,{id:"backup-infrastructure-region",children:"Backup Infrastructure Region"}),"\n",(0,i.jsxs)(s.p,{children:["When using the backup and restore functionality, a backup infrastructure region must be specified by using the ",(0,i.jsx)(s.code,{children:"--backup-region"})," option:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --backup-region us-east-1\n"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note"}),": By default, an existing ",(0,i.jsx)(s.code,{children:"backup-config.yaml"})," will be used. Hence, if you intend to change\nyour backup config, remove the existing ",(0,i.jsx)(s.code,{children:"backup-config.yaml"}),", first:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"rm a8s-deployment/deploy/a8s/backup-config/backup-store-config.yaml\n"})}),"\n",(0,i.jsx)(s.h2,{id:"unattended-mode",children:"Unattended Mode"}),"\n",(0,i.jsxs)(s.p,{children:["It is possible to skip all yes-no questions by ",(0,i.jsx)(s.strong,{children:"enabling the unattended mode"})," by passing the ",(0,i.jsx)(s.code,{children:"-y"})," or ",(0,i.jsx)(s.code,{children:"--yes"})," flag:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create cluster a8s --yes\n"})}),"\n",(0,i.jsx)(s.h2,{id:"printing-the-working-directory",children:"Printing the Working Directory"}),"\n",(0,i.jsxs)(s.p,{children:["The working directory is stored in the ",(0,i.jsx)(s.code,{children:"~/.a8s"})," configuration file. The working directory contains all resources downloaded and generated by the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI."]}),"\n",(0,i.jsx)(s.p,{children:"To print the working directory execute:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s cluster pwd\n"})}),"\n",(0,i.jsx)(s.h1,{id:"a8s-postgresql",children:"a8s PostgreSQL"}),"\n",(0,i.jsxs)(s.p,{children:["A selected subset of the a8s PostgreSQL features are available through the ",(0,i.jsx)(s.code,{children:"a9s"})," CLI."]}),"\n",(0,i.jsx)(s.h2,{id:"creating-a-postgresql-service-instance",children:"Creating a PostgreSQL Service Instance"}),"\n",(0,i.jsxs)(s.p,{children:["Creating a service instance with the name ",(0,i.jsx)(s.code,{children:"sample-pg-cluster"}),":"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --name sample-pg-cluster\n"})}),"\n",(0,i.jsxs)(s.p,{children:["The generated YAML specification will be stored in the ",(0,i.jsx)(s.code,{children:"usermanifests"}),"."]}),"\n",(0,i.jsx)(s.h3,{id:"creating-postgresql-service-instance-yaml-without-applying-it",children:"Creating PostgreSQL Service Instance YAML Without Applying it"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --name sample-pg-cluster --no-apply\n"})}),"\n",(0,i.jsxs)(s.p,{children:["The generated YAML specification will be stored in the ",(0,i.jsx)(s.code,{children:"usermanifests"})," but ",(0,i.jsx)(s.code,{children:"kubectl apply"})," won't be executed."]}),"\n",(0,i.jsx)(s.h3,{id:"creating-a-custom-postgresql-service-instance",children:"Creating a Custom PostgreSQL Service Instance"}),"\n",(0,i.jsx)(s.p,{children:"The command:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg instance --api-version v1beta3 --name sample-pg-cluster --namespace default --replicas 3 --requests-cpu 200m --limits-memory 200Mi --service-version 14 --volume-size 2Gi\n"})}),"\n",(0,i.jsxs)(s.p,{children:["Will generate a YAML spec called ",(0,i.jsx)(s.code,{children:"usermanifests/my-pg-instance.yaml"})," with the following content:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-yaml",children:"apiVersion: postgresql.anynines.com/v1beta3\nkind: Postgresql\nmetadata:\n name: my-pg\nspec:\n replicas: 3\n resources:\n limits:\n memory: 200m\n requests:\n cpu: 200m\n version: 14\n volumeSize: 2Gi\n"})}),"\n",(0,i.jsx)(s.h2,{id:"deleting-a-postgresql-service-instance",children:"Deleting a PostgreSQL Service Instance"}),"\n",(0,i.jsxs)(s.p,{children:["Deleting a service instance with the name ",(0,i.jsx)(s.code,{children:"sample-pg-cluster"}),":"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s delete pg instance --name sample-pg-cluster\n"})}),"\n",(0,i.jsx)(s.p,{children:"Or by providing an explicit namespace:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s delete pg instance --name sample-pg-cluster -n default\n"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note"}),": If the service instance doesn't exist, a warning is printed and the command exists with the\nreturn code ",(0,i.jsx)(s.code,{children:"0"})," as the desired state of the service instance being delete is reached."]}),"\n",(0,i.jsx)(s.h2,{id:"applying-a-sql-file-to-a-postgresql-service-instance",children:"Applying a SQL File to a PostgreSQL Service Instance"}),"\n",(0,i.jsxs)(s.p,{children:["Uploading a SQL file, executing it using ",(0,i.jsx)(s.code,{children:"psql"})," and deleting the file can be done with:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster\n"})}),"\n",(0,i.jsx)(s.p,{children:"The file is uploaded to the current primary pod of the service instance."}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note"}),": Ensure that, during the execution of the command, there is no change of the primary node for a given clustered service instance as otherwise the file upload may fail or target the wrong pod."]}),"\n",(0,i.jsxs)(s.p,{children:["Use ",(0,i.jsx)(s.code,{children:"--yes"})," to skip the confirmation prompt."]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster --yes\n"})}),"\n",(0,i.jsxs)(s.p,{children:["Use ",(0,i.jsx)(s.code,{children:"--no-delete"})," to leave the file in the pod:"]}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s pg apply --file /path/to/sql/file --service-instance sample-pg-cluster --no-delete\n"})}),"\n",(0,i.jsx)(s.h2,{id:"applying-a-sql-statement-to-a-postgresql-service-instance",children:"Applying a SQL Statement to a PostgreSQL Service Instance"}),"\n",(0,i.jsx)(s.p,{children:"Applying a SQL statement on the primary pod of a PostgreSQL service instance can be accomplished with:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:'a9s pg apply -i sample-pg-cluster --sql "select count(*) from posts" --yes\n'})}),"\n",(0,i.jsx)(s.h2,{id:"creating-a-backup-of-a-postgresql-service-instance",children:"Creating a Backup of a PostgreSQL Service Instance"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg backup --name sample-pg-cluster-backup-1 -i sample-pg-cluster\n"})}),"\n",(0,i.jsx)(s.h2,{id:"restoring-a-backup-of-postgresql-service-instance",children:"Restoring a Backup of PostgreSQL Service Instance"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg restore --name sample-pg-cluster-restore-1 -b sample-pg-cluster-backup-1 -i sample-pg-cluster\n"})}),"\n",(0,i.jsx)(s.h2,{id:"creating-a-postgresql-service-binding",children:"Creating a PostgreSQL Service Binding"}),"\n",(0,i.jsx)(s.p,{children:"A Service Binding is an entity facilitating the secure consumption of a service instance.\nBy creating a service instance, a Postgres user is created along with a corresponding Kubernetes Secret."}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s create pg servicebinding --name sb-clustered-1 -i sample-pg-cluster\n"})}),"\n",(0,i.jsxs)(s.p,{children:["Will therefore create a Kubernetes Secret named ",(0,i.jsx)(s.code,{children:"sb-clustered-1-service-binding"})," and provide the following\nkeys containing everything an application needs to connect to the PostgreSQL service instance:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"database"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"instance_service"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"password"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.code,{children:"username"})}),"\n"]}),"\n",(0,i.jsx)(s.h1,{id:"cleaning-up",children:"Cleaning Up"}),"\n",(0,i.jsx)(s.p,{children:"In order to delete the cluster run:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"a9s delete cluster a8s\n"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Note"}),": This will not delete config files."]}),"\n",(0,i.jsx)(s.p,{children:"Config files are stored in the cluster working directory."}),"\n",(0,i.jsx)(s.p,{children:"They can be removed with:"}),"\n",(0,i.jsx)(s.pre,{children:(0,i.jsx)(s.code,{className:"language-bash",children:"rm -rf $( a9s cluster pwd )\n"})})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453:(e,s,n)=>{n.d(s,{R:()=>t,x:()=>c});var i=n(6540);const r={},a=i.createContext(r);function t(e){const s=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),i.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/df203c0f.b9302607.js b/assets/js/df203c0f.b9302607.js deleted file mode 100644 index 8c3cd9f..0000000 --- a/assets/js/df203c0f.b9302607.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[4279],{7570:(e,n,t)=>{t.d(n,{A:()=>F});var i=t(6540),s=t(4848);function o(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=i.Children.toArray(e),t=n.find((e=>i.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),o=n.filter((e=>e!==t)),l=t?.props.children;return{mdxAdmonitionTitle:l,rest:o.length>0?(0,s.jsx)(s.Fragment,{children:o}):null}}(e.children),o=e.title??n;return{...e,...o&&{title:o},children:t}}var l=t(4164),a=t(6885),r=t(8570);const c={admonition:"admonition_xJq3",admonitionHeading:"admonitionHeading_Gvgb",admonitionIcon:"admonitionIcon_Rf37",admonitionContent:"admonitionContent_BuS1"};function d(e){let{type:n,className:t,children:i}=e;return(0,s.jsx)("div",{className:(0,l.A)(r.G.common.admonition,r.G.common.admonitionType(n),c.admonition,t),children:i})}function u(e){let{icon:n,title:t}=e;return(0,s.jsxs)("div",{className:c.admonitionHeading,children:[(0,s.jsx)("span",{className:c.admonitionIcon,children:n}),t]})}function h(e){let{children:n}=e;return n?(0,s.jsx)("div",{className:c.admonitionContent,children:n}):null}function m(e){const{type:n,icon:t,title:i,children:o,className:l}=e;return(0,s.jsxs)(d,{type:n,className:l,children:[i||t?(0,s.jsx)(u,{title:i,icon:t}):null,(0,s.jsx)(h,{children:o})]})}function g(e){return(0,s.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const x={icon:(0,s.jsx)(g,{}),title:(0,s.jsx)(a.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function f(e){return(0,s.jsx)(m,{...x,...e,className:(0,l.A)("alert alert--secondary",e.className),children:e.children})}function j(e){return(0,s.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const p={icon:(0,s.jsx)(j,{}),title:(0,s.jsx)(a.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function v(e){return(0,s.jsx)(m,{...p,...e,className:(0,l.A)("alert alert--success",e.className),children:e.children})}function A(e){return(0,s.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const N={icon:(0,s.jsx)(A,{}),title:(0,s.jsx)(a.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function w(e){return(0,s.jsx)(m,{...N,...e,className:(0,l.A)("alert alert--info",e.className),children:e.children})}function T(e){return(0,s.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const b={icon:(0,s.jsx)(T,{}),title:(0,s.jsx)(a.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function y(e){return(0,s.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const z={icon:(0,s.jsx)(y,{}),title:(0,s.jsx)(a.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const C={icon:(0,s.jsx)(T,{}),title:(0,s.jsx)(a.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const M={...{note:f,tip:v,info:w,warning:function(e){return(0,s.jsx)(m,{...b,...e,className:(0,l.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,s.jsx)(m,{...z,...e,className:(0,l.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,s.jsx)(f,{title:"secondary",...e}),important:e=>(0,s.jsx)(w,{title:"important",...e}),success:e=>(0,s.jsx)(v,{title:"success",...e}),caution:function(e){return(0,s.jsx)(m,{...C,...e,className:(0,l.A)("alert alert--warning",e.className),children:e.children})}}};function F(e){const n=o(e),t=(i=n.type,M[i]||(console.warn(`No admonition component found for admonition type "${i}". Using Info as fallback.`),M.info));var i;return(0,s.jsx)(t,{...n})}},4594:(e,n,t)=>{t.r(n),t.d(n,{default:()=>j});t(6540);var i=t(4164),s=t(7083),o=t(5540),l=t(4714),a=t(8570),r=t(6885),c=t(6758),d=t(8105),u=t(2067),h=t(4848);function m(e){const n=function(){const{selectMessage:e}=(0,o.W)();return n=>e(n,(0,r.T)({id:"theme.docs.tagDocListPageTitle.nDocsTagged",description:'Pluralized label for "{count} docs tagged". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One doc tagged|{count} docs tagged"},{count:n}))}();return(0,r.T)({id:"theme.docs.tagDocListPageTitle",description:"The title of the page for a docs tag",message:'{nDocsTagged} with "{tagName}"'},{nDocsTagged:n(e.tag.count),tagName:e.tag.label})}function g(e){let{doc:n}=e;return(0,h.jsxs)("article",{className:"margin-vert--lg",children:[(0,h.jsx)(s.A,{to:n.permalink,children:(0,h.jsx)(u.A,{as:"h2",children:n.title})}),n.description&&(0,h.jsx)("p",{children:n.description})]})}function x(e){let{title:n,tag:t}=e;return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(l.be,{title:n,description:t.description}),(0,h.jsx)(c.A,{tag:"doc_tag_doc_list"})]})}function f(e){let{tag:n,title:t}=e;return(0,h.jsx)(l.e3,{className:(0,i.A)(a.G.page.docsTagDocListPage),children:(0,h.jsx)("div",{className:"container margin-vert--lg",children:(0,h.jsx)("div",{className:"row",children:(0,h.jsxs)("main",{className:"col col--8 col--offset-2",children:[n.unlisted&&(0,h.jsx)(d.A,{}),(0,h.jsxs)("header",{className:"margin-bottom--xl",children:[(0,h.jsx)(u.A,{as:"h1",children:t}),n.description&&(0,h.jsx)("p",{children:n.description}),(0,h.jsx)(s.A,{href:n.allTagsPath,children:(0,h.jsx)(r.A,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View All Tags"})})]}),(0,h.jsx)("section",{className:"margin-vert--lg",children:n.items.map((e=>(0,h.jsx)(g,{doc:e},e.id)))})]})})})})}function j(e){const n=m(e);return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(x,{...e,title:n}),(0,h.jsx)(f,{...e,title:n})]})}},8105:(e,n,t)=>{t.d(n,{A:()=>m});t(6540);var i=t(4164),s=t(6885),o=t(4993),l=t(4848);function a(){return(0,l.jsx)(s.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function r(){return(0,l.jsx)(s.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,l.jsx)(o.A,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}var d=t(8570),u=t(7570);function h(e){let{className:n}=e;return(0,l.jsx)(u.A,{type:"caution",title:(0,l.jsx)(a,{}),className:(0,i.A)(n,d.G.common.unlistedBanner),children:(0,l.jsx)(r,{})})}function m(e){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(c,{}),(0,l.jsx)(h,{...e})]})}},5540:(e,n,t)=>{t.d(n,{W:()=>c});var i=t(6540),s=t(1059);const o=["zero","one","two","few","many","other"];function l(e){return o.filter((n=>e.includes(n)))}const a={locale:"en",pluralForms:l(["one","other"]),select:e=>1===e?"one":"other"};function r(){const{i18n:{currentLocale:e}}=(0,s.A)();return(0,i.useMemo)((()=>{try{return function(e){const n=new Intl.PluralRules(e);return{locale:e,pluralForms:l(n.resolvedOptions().pluralCategories),select:e=>n.select(e)}}(e)}catch(n){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${n.message}\n`),a}}),[e])}function c(){const e=r();return{selectMessage:(n,t)=>function(e,n,t){const i=e.split("|");if(1===i.length)return i[0];i.length>t.pluralForms.length&&console.error(`For locale=${t.locale}, a maximum of ${t.pluralForms.length} plural forms are expected (${t.pluralForms.join(",")}), but the message contains ${i.length}: ${e}`);const s=t.select(n),o=t.pluralForms.indexOf(s);return i[Math.min(o,i.length-1)]}(t,n,e)}}}}]); \ No newline at end of file diff --git a/assets/js/df203c0f.ceea1448.js b/assets/js/df203c0f.ceea1448.js new file mode 100644 index 0000000..88c550b --- /dev/null +++ b/assets/js/df203c0f.ceea1448.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[4279],{4182:(e,n,t)=>{t.d(n,{A:()=>k});var i=t(6540),s=t(4848);function l(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=i.Children.toArray(e),t=n.find((e=>i.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),l=n.filter((e=>e!==t)),r=t?.props.children;return{mdxAdmonitionTitle:r,rest:l.length>0?(0,s.jsx)(s.Fragment,{children:l}):null}}(e.children),l=e.title??n;return{...e,...l&&{title:l},children:t}}var r=t(4164),c=t(3230),o=t(8630);const a="admonition_xJq3",d="admonitionHeading_Gvgb",u="admonitionIcon_Rf37",h="admonitionContent_BuS1";function m(e){let{type:n,className:t,children:i}=e;return(0,s.jsx)("div",{className:(0,r.A)(o.G.common.admonition,o.G.common.admonitionType(n),a,t),children:i})}function g(e){let{icon:n,title:t}=e;return(0,s.jsxs)("div",{className:d,children:[(0,s.jsx)("span",{className:u,children:n}),t]})}function f(e){let{children:n}=e;return n?(0,s.jsx)("div",{className:h,children:n}):null}function x(e){const{type:n,icon:t,title:i,children:l,className:r}=e;return(0,s.jsxs)(m,{type:n,className:r,children:[i||t?(0,s.jsx)(g,{title:i,icon:t}):null,(0,s.jsx)(f,{children:l})]})}function p(e){return(0,s.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const j={icon:(0,s.jsx)(p,{}),title:(0,s.jsx)(c.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function v(e){return(0,s.jsx)(x,{...j,...e,className:(0,r.A)("alert alert--secondary",e.className),children:e.children})}function A(e){return(0,s.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const N={icon:(0,s.jsx)(A,{}),title:(0,s.jsx)(c.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function b(e){return(0,s.jsx)(x,{...N,...e,className:(0,r.A)("alert alert--success",e.className),children:e.children})}function T(e){return(0,s.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const w={icon:(0,s.jsx)(T,{}),title:(0,s.jsx)(c.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function y(e){return(0,s.jsx)(x,{...w,...e,className:(0,r.A)("alert alert--info",e.className),children:e.children})}function z(e){return(0,s.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const M={icon:(0,s.jsx)(z,{}),title:(0,s.jsx)(c.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function C(e){return(0,s.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const F={icon:(0,s.jsx)(C,{}),title:(0,s.jsx)(c.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const B={icon:(0,s.jsx)(z,{}),title:(0,s.jsx)(c.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const _={...{note:v,tip:b,info:y,warning:function(e){return(0,s.jsx)(x,{...M,...e,className:(0,r.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,s.jsx)(x,{...F,...e,className:(0,r.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,s.jsx)(v,{title:"secondary",...e}),important:e=>(0,s.jsx)(y,{title:"important",...e}),success:e=>(0,s.jsx)(b,{title:"success",...e}),caution:function(e){return(0,s.jsx)(x,{...B,...e,className:(0,r.A)("alert alert--warning",e.className),children:e.children})}}};function k(e){const n=l(e),t=(i=n.type,_[i]||(console.warn(`No admonition component found for admonition type "${i}". Using Info as fallback.`),_.info));var i;return(0,s.jsx)(t,{...n})}},8811:(e,n,t)=>{t.d(n,{A:()=>a});t(6540);var i=t(4164),s=t(6907),l=t(8630),r=t(4182),c=t(4848);function o(e){let{className:n}=e;return(0,c.jsx)(r.A,{type:"caution",title:(0,c.jsx)(s.Rc,{}),className:(0,i.A)(n,l.G.common.unlistedBanner),children:(0,c.jsx)(s.Uh,{})})}function a(e){return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(s.AE,{}),(0,c.jsx)(o,{...e})]})}},6958:(e,n,t)=>{t.r(n),t.d(n,{default:()=>p});t(6540);var i=t(4164),s=t(4783),l=t(7824),r=t(6644),c=t(8630),o=t(3230),a=t(1210),d=t(8811),u=t(5225),h=t(4848);function m(e){const n=function(){const{selectMessage:e}=(0,l.W)();return n=>e(n,(0,o.T)({id:"theme.docs.tagDocListPageTitle.nDocsTagged",description:'Pluralized label for "{count} docs tagged". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One doc tagged|{count} docs tagged"},{count:n}))}();return(0,o.T)({id:"theme.docs.tagDocListPageTitle",description:"The title of the page for a docs tag",message:'{nDocsTagged} with "{tagName}"'},{nDocsTagged:n(e.tag.count),tagName:e.tag.label})}function g(e){let{doc:n}=e;return(0,h.jsxs)("article",{className:"margin-vert--lg",children:[(0,h.jsx)(s.A,{to:n.permalink,children:(0,h.jsx)(u.A,{as:"h2",children:n.title})}),n.description&&(0,h.jsx)("p",{children:n.description})]})}function f(e){let{title:n,tag:t}=e;return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(r.be,{title:n,description:t.description}),(0,h.jsx)(a.A,{tag:"doc_tag_doc_list"})]})}function x(e){let{tag:n,title:t}=e;return(0,h.jsx)(r.e3,{className:(0,i.A)(c.G.page.docsTagDocListPage),children:(0,h.jsx)("div",{className:"container margin-vert--lg",children:(0,h.jsx)("div",{className:"row",children:(0,h.jsxs)("main",{className:"col col--8 col--offset-2",children:[n.unlisted&&(0,h.jsx)(d.A,{}),(0,h.jsxs)("header",{className:"margin-bottom--xl",children:[(0,h.jsx)(u.A,{as:"h1",children:t}),n.description&&(0,h.jsx)("p",{children:n.description}),(0,h.jsx)(s.A,{href:n.allTagsPath,children:(0,h.jsx)(o.A,{id:"theme.tags.tagsPageLink",description:"The label of the link targeting the tag list page",children:"View all tags"})})]}),(0,h.jsx)("section",{className:"margin-vert--lg",children:n.items.map((e=>(0,h.jsx)(g,{doc:e},e.id)))})]})})})})}function p(e){const n=m(e);return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(f,{...e,title:n}),(0,h.jsx)(x,{...e,title:n})]})}},6907:(e,n,t)=>{t.d(n,{AE:()=>o,Rc:()=>r,TT:()=>d,Uh:()=>c,Yh:()=>a});t(6540);var i=t(3230),s=t(1141),l=t(4848);function r(){return(0,l.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function c(){return(0,l.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function o(){return(0,l.jsx)(s.A,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function a(){return(0,l.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function d(){return(0,l.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}},7824:(e,n,t)=>{t.d(n,{W:()=>a});var i=t(6540),s=t(7639);const l=["zero","one","two","few","many","other"];function r(e){return l.filter((n=>e.includes(n)))}const c={locale:"en",pluralForms:r(["one","other"]),select:e=>1===e?"one":"other"};function o(){const{i18n:{currentLocale:e}}=(0,s.A)();return(0,i.useMemo)((()=>{try{return function(e){const n=new Intl.PluralRules(e);return{locale:e,pluralForms:r(n.resolvedOptions().pluralCategories),select:e=>n.select(e)}}(e)}catch(n){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${n.message}\n`),c}}),[e])}function a(){const e=o();return{selectMessage:(n,t)=>function(e,n,t){const i=e.split("|");if(1===i.length)return i[0];i.length>t.pluralForms.length&&console.error(`For locale=${t.locale}, a maximum of ${t.pluralForms.length} plural forms are expected (${t.pluralForms.join(",")}), but the message contains ${i.length}: ${e}`);const s=t.select(n),l=t.pluralForms.indexOf(s);return i[Math.min(l,i.length-1)]}(t,n,e)}}}}]); \ No newline at end of file diff --git a/assets/js/e555076a.e18bced2.js b/assets/js/e555076a.e18bced2.js deleted file mode 100644 index e5d2020..0000000 --- a/assets/js/e555076a.e18bced2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[7799],{2244:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>o});var t=s(4848),a=s(8453);const i={id:"hands-on-tutorial-a8s-pg-a9s-cli",title:"Deploying a Demo App using a8s PostgreSQL",tags:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind"],keywords:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind","postgresql","web app"]},r="Overview",c={id:"hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli",title:"Deploying a Demo App using a8s PostgreSQL",description:"What you will accomplish",source:"@site/versioned_docs/version-0.13.0/hands-on-tutorials/a9s-cli-a8s-postgresql.md",sourceDirName:"hands-on-tutorials",slug:"/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli",permalink:"/docs/0.13.0/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli",draft:!1,unlisted:!1,tags:[{inline:!0,label:"a9s hub",permalink:"/docs/0.13.0/tags/a-9-s-hub"},{inline:!0,label:"a9s cli",permalink:"/docs/0.13.0/tags/a-9-s-cli"},{inline:!0,label:"a8s data services",permalink:"/docs/0.13.0/tags/a-8-s-data-services"},{inline:!0,label:"a8s postgres",permalink:"/docs/0.13.0/tags/a-8-s-postgres"},{inline:!0,label:"data service",permalink:"/docs/0.13.0/tags/data-service"},{inline:!0,label:"tutorial",permalink:"/docs/0.13.0/tags/tutorial"},{inline:!0,label:"kubernetes",permalink:"/docs/0.13.0/tags/kubernetes"},{inline:!0,label:"minikube",permalink:"/docs/0.13.0/tags/minikube"},{inline:!0,label:"kind",permalink:"/docs/0.13.0/tags/kind"}],version:"0.13.0",frontMatter:{id:"hands-on-tutorial-a8s-pg-a9s-cli",title:"Deploying a Demo App using a8s PostgreSQL",tags:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind"],keywords:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind","postgresql","web app"]}},l={},o=[{value:"What you will accomplish",id:"what-you-will-accomplish",level:2},{value:"What you will learn",id:"what-you-will-learn",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Creating a Kubernetes Cluster with a8s PostgreSQL",id:"step-1-creating-a-kubernetes-cluster-with-a8s-postgresql",level:2},{value:"Step 1.1: Initial Configuration on the First a9s create cluster Execution",id:"step-11-initial-configuration-on-the-first-a9s-create-cluster-execution",level:3},{value:"What's Happening During the Installation",id:"whats-happening-during-the-installation",level:3},{value:"Cert-Manager",id:"cert-manager",level:4},{value:"a8s PostgreSQL",id:"a8s-postgresql",level:4},{value:"Step 2: Creating a PostgreSQL Cluster",id:"step-2-creating-a-postgresql-cluster",level:2},{value:"Inspecting the Service Instance",id:"inspecting-the-service-instance",level:3},{value:"Step 3: Creating a Service Binding",id:"step-3-creating-a-service-binding",level:2},{value:"Step 4: Deploying a Demo Application",id:"step-4-deploying-a-demo-application",level:2},{value:"Step 5: Interacting with PostgreSQL",id:"step-5-interacting-with-postgresql",level:2},{value:"Applying a Local SQL File",id:"applying-a-local-sql-file",level:3},{value:"Applying an SQL String",id:"applying-an-sql-string",level:3},{value:"Step 6: Creating and Restoring a Backup",id:"step-6-creating-and-restoring-a-backup",level:2},{value:"Creating a Backup",id:"creating-a-backup",level:3},{value:"Restoring a Backup",id:"restoring-a-backup",level:3},{value:"Congratulations",id:"congratulations",level:2},{value:"What to do next?",id:"what-to-do-next",level:2},{value:"Links",id:"links",level:2}];function d(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"overview",children:"Overview"}),"\n",(0,t.jsx)(n.h2,{id:"what-you-will-accomplish",children:"What you will accomplish"}),"\n",(0,t.jsxs)(n.p,{children:["In this tutorial you will learn how to ",(0,t.jsx)(n.strong,{children:"create a local Kubernetes cluster"}),", fully equipped ",(0,t.jsx)(n.strong,{children:"with a PostgreSQL"})," operator, ready for you to deploy a PostgreSQL database instance for ",(0,t.jsx)(n.strong,{children:"developing your application"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"what-you-will-learn",children:"What you will learn"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Install the ",(0,t.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"a9s CLI"})]}),"\n",(0,t.jsx)(n.li,{children:"Create a local Kubernetes cluster"}),"\n",(0,t.jsxs)(n.li,{children:["Install ",(0,t.jsx)(n.a,{href:"https://cert-manager.io/docs/",children:"cert-manager"})]}),"\n",(0,t.jsx)(n.li,{children:"Install a8s PostgreSQL"}),"\n",(0,t.jsx)(n.li,{children:"Create a PostgreSQL database instance"}),"\n",(0,t.jsx)(n.li,{children:"Create a PostgreSQL user"}),"\n",(0,t.jsx)(n.li,{children:"Connect to the PostgreSQL database"}),"\n",(0,t.jsx)(n.li,{children:"Deploy a demo application"}),"\n",(0,t.jsx)(n.li,{children:"Connect the application to the PostgreSQL database"}),"\n",(0,t.jsx)(n.li,{children:"Create a backup"}),"\n",(0,t.jsx)(n.li,{children:"Restore a backup"}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["MacOS / Linux","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"Other platforms, including Windows, may work but are currently untested."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://www.docker.com/",children:"Docker"})}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://minikube.sigs.k8s.io/docs/start/",children:"Minikube"})," or ",(0,t.jsx)(n.a,{href:"https://kind.sigs.k8s.io/",children:"Kind"})]}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"a9s CLI"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"https://kubernetes.io/docs/reference/kubectl/",children:"Kubectl"})}),"\n",(0,t.jsx)(n.li,{children:"Optional for backup/restore: AWS S3 Bucket with credentials"}),"\n"]}),"\n",(0,t.jsx)(n.h1,{id:"implementation",children:"Implementation"}),"\n",(0,t.jsxs)(n.p,{children:["In this tutorial you will be using the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI to facilitate the creation of both a local Kubernetes cluster and a PostgreSQL database instance."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"a9s"})," CLI will guide you through the process while providing you with transparency and ability to set your own pace. Transparency means that you will see the exact commands to be executed. By default, the commands are executed only after you have confirmed the execution by pressing the ",(0,t.jsx)(n.code,{children:"ENTER"})," key. This allows you to have a closer look at the command and/or the YAML specifications to understand what the current step in the tutorial is about. If all you care about is the result, the ",(0,t.jsx)(n.code,{children:"--yes"})," option will answer all yes-no questions with yes. See ",(0,t.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"[1]"})," for documentation and source code of the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI."]}),"\n",(0,t.jsx)(n.h2,{id:"step-1-creating-a-kubernetes-cluster-with-a8s-postgresql",children:"Step 1: Creating a Kubernetes Cluster with a8s PostgreSQL"}),"\n",(0,t.jsx)(n.p,{children:"In this section you will create a Kubernetes cluster with a8s PostgreSQL and all its dependencies:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create cluster a8s\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Per default, ",(0,t.jsx)(n.code,{children:"minikube"})," will be used. In case you prefer ",(0,t.jsx)(n.code,{children:"kind"})," you can use the ",(0,t.jsx)(n.code,{children:"--provider"})," option:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create cluster a8s --provider kind\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The remainder of the tutorial works equally for both ",(0,t.jsx)(n.code,{children:"minikube"})," and ",(0,t.jsx)(n.code,{children:"kind"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"step-11-initial-configuration-on-the-first-a9s-create-cluster-execution",children:"Step 1.1: Initial Configuration on the First a9s create cluster Execution"}),"\n",(0,t.jsx)(n.p,{children:"When creating a cluster for the first time, a few setup steps will have to be taken which need to be performed only once:"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Setting up a working directory for the use with the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI. ",(0,t.jsx)(n.strong,{children:"This step asks for your confirmation of the proposed directory."})]}),"\n",(0,t.jsx)(n.li,{children:"Configuring the access credentials for the S3 compatible object store which is needed to use the backup/restore feature of a8s Postgres. This step is performed automatically."}),"\n",(0,t.jsxs)(n.li,{children:["Cloning deployment resources required by the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI to create a cluster. This step is performed automatically."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"whats-happening-during-the-installation",children:"What's Happening During the Installation"}),"\n",(0,t.jsx)(n.p,{children:"After the initial configuration, the Kubernetes cluster is being created."}),"\n",(0,t.jsx)(n.h4,{id:"cert-manager",children:"Cert-Manager"}),"\n",(0,t.jsxs)(n.p,{children:["Once the Kubernetes cluster is ready, the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI proceeds with the installation of the ",(0,t.jsx)(n.a,{href:"https://cert-manager.io/docs/",children:"cert-manager"}),". The cert-manager is a Kubernetes extension handling TLS certificates. Among others, in a8s PostgreSQL TSL certificates are used for securing the communication between Kubernetes and the operator."]}),"\n",(0,t.jsx)(n.h4,{id:"a8s-postgresql",children:"a8s PostgreSQL"}),"\n",(0,t.jsxs)(n.p,{children:["With the cert-manager being ready, the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI continues and installs the a8s PostgreSQL components. Namely, this is"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"The PostgreSQL operator"}),"\n",(0,t.jsx)(n.li,{children:"The Service Binding controller"}),"\n",(0,t.jsx)(n.li,{children:"The Backup Manager"}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.strong,{children:"PostgreSQL Operator"})," is responsible for creating and managing ",(0,t.jsx)(n.em,{children:"Service Instances"}),", that is dedicated PostgreSQL servers represented by a single or a cluster of Pods."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.strong,{children:"Service Binding Controller"}),", as the name suggests, is responsible for creating so-called ",(0,t.jsx)(n.em,{children:"Service Bindings"}),". A Service Binding represents ",(0,t.jsx)(n.strong,{children:"a unique set of credentials"})," connecting a database client, such as an application and a Service Instance, in this case a PostgreSQL instance. In the case of a8s PostgreSQL, a Service Binding contains a ",(0,t.jsx)(n.strong,{children:"username/password"})," combination as well as other information necessary to establish a connection such as the ",(0,t.jsx)(n.strong,{children:"hostname"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.strong,{children:"Backup Manager"})," is responsible for managing backup and restore requests and dispatching them to the ",(0,t.jsx)(n.em,{children:"Backup Agents"})," located alongside Postgres Service Instances. It is the Backup Agent of a Service Instance that actually triggers the execution, encryption, compression and streaming of backup and restore operations."]}),"\n",(0,t.jsxs)(n.p,{children:["After ",(0,t.jsx)(n.em,{children:"waiting for a8s Postgres Control Plane to become ready"})," the message ",(0,t.jsx)(n.code,{children:"\ud83c\udf89 The a8s Postgres Control Plane appears to be ready. All expected pods are running."})," indicates that ",(0,t.jsx)(n.strong,{children:"the installation of a8s PostgreSQL was successful"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"step-2-creating-a-postgresql-cluster",children:"Step 2: Creating a PostgreSQL Cluster"}),"\n",(0,t.jsxs)(n.p,{children:["In order to keep all tutorial resources in one place, create a Kubernetes ",(0,t.jsx)(n.code,{children:"tutorial"})," namespace:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl create namespace tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Now that the a8s PostgreSQL Operator and the ",(0,t.jsx)(n.code,{children:"tutorial"})," namespace is ready, it's time to create a database."]}),"\n",(0,t.jsxs)(n.p,{children:["Using the ",(0,t.jsx)(n.code,{children:"a9s"})," CLI the process is as simple as:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create pg instance --name clustered-instance --replicas 3 -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["This creates a clustered PostgreSQL instance named ",(0,t.jsx)(n.code,{children:"clustered-instance"})," represented as a StatefulSet with ",(0,t.jsx)(n.code,{children:"3"})," Pods. Each Pod runs a PostgreSQL process."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Note"}),": The ",(0,t.jsx)(n.code,{children:"a9s CLI"})," does not shield you the YAML specs is generated. Quite the opposite, it is intended to provide you with meaningful templates to start with. ",(0,t.jsxs)(n.strong,{children:["You can find all YAML specs generated by the ",(0,t.jsx)(n.code,{children:"a9s CLI"})," in the ",(0,t.jsx)(n.code,{children:"usermanifests"})," folder in your a9s working directory"]}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"ls $(a9s cluster pwd)/usermanifests\n"})}),"\n",(0,t.jsx)(n.h3,{id:"inspecting-the-service-instance",children:"Inspecting the Service Instance"}),"\n",(0,t.jsx)(n.p,{children:"It's worth inspecting the PostgreSQL Service Instance to see what the a8s PostgreSQL Operator has created:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get postgresqls -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME AGE\nclustered-instance 131m\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"postgresql"})," object named ",(0,t.jsx)(n.code,{children:"clustered-instance"}),", as the name suggests, represents your PostgreSQL instance. It is implemented by a set of Kubernetes Services and a StatefulSet."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get statefulsets -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The operator has created a Kubernetes StatefulSet with the name ",(0,t.jsx)(n.code,{children:"clustered-instance"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME READY AGE\nclustered-instance 3/3 89m\n"})}),"\n",(0,t.jsx)(n.p,{children:"And the StatefulSet, in turn, manages three Pods, namely:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get pods -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"The following Pods:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME READY STATUS RESTARTS AGE\nclustered-instance-0 3/3 Running 0 70m\nclustered-instance-1 3/3 Running 0 68m\nclustered-instance-2 3/3 Running 0 66m\n"})}),"\n",(0,t.jsx)(n.p,{children:"Have a closer look at one of them:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl describe pod clustered-instance-0 -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Especially, look at the ",(0,t.jsx)(n.code,{children:"Labels"})," section in the output:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"Name: clustered-instance-0\nNamespace: tutorial\nPriority: 0\nService Account: clustered-instance\nNode: a8s-demo-m02/192.168.58.3\nStart Time: Tue, 12 Mar 2024 08:15:39 +0100\nLabels: a8s.a9s/dsi-group=postgresql.anynines.com\n a8s.a9s/dsi-kind=Postgresql\n a8s.a9s/dsi-name=clustered-instance\n a8s.a9s/replication-role=master\n apps.kubernetes.io/pod-index=0\n controller-revision-hash=clustered-instance-749699f5b9\n statefulset.kubernetes.io/pod-name=clustered-instance-0\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The label ",(0,t.jsx)(n.code,{children:"a8s.a9s/replication-role=master"})," indicates that the Pod ",(0,t.jsx)(n.code,{children:"clustered-instance-0"})," is the ",(0,t.jsx)(n.strong,{children:"primary"})," PostgreSQL server for the asynchronous streaming replication within the cluster. Don't worry if you are not familiar with this terminology. Just bare in mind that ",(0,t.jsx)(n.strong,{children:"all data altering SQL statements always need to go to the primary Pod"}),". There's a mechanism in place that will help with this."]}),"\n",(0,t.jsx)(n.p,{children:"By executing:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get services -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You will see a ",(0,t.jsx)(n.code,{children:"clustered-instance-master"})," Kubernetes service:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nclustered-instance-config ClusterIP None74m\nclustered-instance-master ClusterIP 10.105.7.211 5432/TCP,8008/TCP 75m\n"})}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsxs)(n.strong,{children:["The ",(0,t.jsx)(n.code,{children:"clustered-instance-master"})," service provides a reference to the primary PostgreSQL server within the clustered Service Instance"]}),". As the cluster comes with failure-detection and automatic failover capabilities, the primary role may be assigned to another Pod in the cluster during leading election. However, the ",(0,t.jsx)(n.code,{children:"clustered-instance-master"})," service will be updated so that any application connecting through the ",(0,t.jsx)(n.code,{children:"clustered-instance-master"})," service automatically connects to the ",(0,t.jsx)(n.strong,{children:"current"})," primary."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Congratulations \ud83c\udf89"}),", you've managed to create yourself a highly available PostgreSQL cluster using asynchronous streaming replication."]}),"\n",(0,t.jsx)(n.h2,{id:"step-3-creating-a-service-binding",children:"Step 3: Creating a Service Binding"}),"\n",(0,t.jsxs)(n.p,{children:["In order to prepare the deployment of an application, the database need to be configured to ",(0,t.jsx)(n.strong,{children:"grant the application access to the PostgreSQL service instance"}),". Granting an application running in Kubernetes access to a PostgreSQL database involves the following steps:"]}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Create a unique set of access credentials including a database role as well as a corresponding password."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Creating a Kubernetes Secret containing the credentials."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The credential set should be unique to the application and the data service instance. So if a second application, such as a worker process, needs access, a separate credential set and Kubernetes Secret is to be created."}),"\n",(0,t.jsxs)(n.p,{children:["With a8s PostgreSQL the process of creating access credentials on-demand is referred to as creating ",(0,t.jsx)(n.em,{children:"Service Bindings"}),". In other words, ",(0,t.jsx)(n.strong,{children:"a Service Binding in a8s PostgreSQL is a database role, password which is then stored in a Kubernetes Secret"})," to be used by exactly one application."]}),"\n",(0,t.jsxs)(n.p,{children:["Think about the implication of managing Service Bindings using the Kubernetes API. Instead of writing custom scripts connecting to the database, the creation of a database user is as simple as creating a Kubernetes object. Therefore, ",(0,t.jsx)(n.strong,{children:"Service Bindings facilitate deployments to multiple Kubernetes environments describing application systems entirely using Kubernetes objects"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"Creating a Service Binding is easy:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create pg servicebinding --name sb-sample -n tutorial -i clustered-instance\n"})}),"\n",(0,t.jsx)(n.p,{children:"Have a look at the resources that have been generated:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get servicebindings -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME AGE\nsb-sample 6s\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"servicebinding"})," object named ",(0,t.jsx)(n.code,{children:"sb-sample"})," is owned by the a8s PostgreSQL Operator or, more precisely, the ServiceBindingController. As part of the Service Binding, a Kubernetes Secret has been created:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get secrets -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME TYPE DATA AGE\npostgres.credentials.clustered-instance Opaque 2 9m16s\nsb-sample-service-binding Opaque 4 25s\nstandby.credentials.clustered-instance Opaque 2 9m16s\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Investigate the Secret ",(0,t.jsx)(n.code,{children:"sb-sample-service-binding"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get secret sb-sample-service-binding -n tutorial -o yaml\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-yaml",children:'apiVersion: v1\ndata:\n database: YTlzX2FwcHNfZGVmYXVsdF9kYg==\n instance_service: Y2x1c3RlcmVkLWluc3RhbmNlLW1hc3Rlci50dXRvcmlhbA==\n password: bk1wNGI2WHdMeXUwYVkzWmF4ekExS1VURTNzM2xham4=\n username: YThzLXNiLWN4cDZCMFRUQg==\nimmutable: true\nkind: Secret\nmetadata:\n creationTimestamp: "2024-03-12T14:50:33Z"\n finalizers:\n - a8s.anynines.com/servicebinding.controller\n labels:\n service-binding: "true"\n name: sb-sample-service-binding\n namespace: tutorial\n ownerReferences:\n - apiVersion: servicebindings.anynines.com/v1beta3\n blockOwnerDeletion: true\n controller: true\n kind: ServiceBinding\n name: sb-sample\n uid: e4636254-433a-4e82-a46b-e79fd7f25f58\n resourceVersion: "2648"\n uid: ebee4e29-4796-4e9a-8114-ec4d546644a9\ntype: Opaque\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Note that the values in the ",(0,t.jsx)(n.code,{children:"data"})," hash aren't readable right away as they are base64 encoded. Values can be decoded using the ",(0,t.jsx)(n.code,{children:"base64"})," command, for example:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"database:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'echo "YTlzX2FwcHNfZGVmYXVsdF9kYg==" | base64 --decode\na9s_apps_default_db\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"instance_service:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'echo "Y2x1c3RlcmVkLWluc3RhbmNlLW1hc3Rlci50dXRvcmlhbA==" | base64 --decode\nclustered-instance-master.tutorial\n'})}),"\n",(0,t.jsxs)(n.p,{children:["Given a Service name, the generic naming pattern in Kubernetes to derive its DNS entry is: ",(0,t.jsx)(n.code,{children:"{service-name}.{namespace}.svc.{cluster-domain:cluster.local}"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["Assuming that your Kubernetes' cluster domain is the default ",(0,t.jsx)(n.code,{children:"cluster.local"}),", this means that the primary (formerly master) node of your PostgreSQL cluster is reachable via the DNS entry: ",(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"clustered-instance-master.tutorial.svc.cluster.local"})}),"."]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"username:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'echo "YThzLXNiLWN4cDZCMFRUQg==" | base64 --decode\na8s-sb-cxp6B0TTB\n'})}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.code,{children:"password:"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'echo "bk1wNGI2WHdMeXUwYVkzWmF4ekExS1VURTNzM2xham4=" | base64 --decode\nnMp4b6XwLyu0aY3ZaxzA1KUTE3s3lajn\n'})}),"\n",(0,t.jsxs)(n.p,{children:["As you can see, the secret ",(0,t.jsx)(n.code,{children:"sb-sample-service-binding"})," contains all relevant information required by an application to connect to your PostgreSQL instance."]}),"\n",(0,t.jsx)(n.h2,{id:"step-4-deploying-a-demo-application",children:"Step 4: Deploying a Demo Application"}),"\n",(0,t.jsx)(n.p,{children:"With the PostgreSQL database at hand, an exemplary application can be deployed."}),"\n",(0,t.jsx)(n.p,{children:"The demo app has already been checked out for you. Hence, installing it just a single command away:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl apply -k $(a9s cluster pwd)/a8s-demo/demo-postgresql-app -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"service/demo-app created\ndeployment.apps/demo-app created\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The demo app consists of a Kubernetes Service and a Deployment both named ",(0,t.jsx)(n.code,{children:"demo-app"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"You can verify that the app is running by executing:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl get pods -n tutorial -l app=demo-app\n"})}),"\n",(0,t.jsx)(n.p,{children:"Output:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"NAME READY STATUS RESTARTS AGE\ndemo-app-65f6dd4445-glgc4 1/1 Running 0 81s\n"})}),"\n",(0,t.jsxs)(n.p,{children:["In order to access the app locally, create a port forward mapping the container port ",(0,t.jsx)(n.code,{children:"3000"})," your local machine's port ",(0,t.jsx)(n.code,{children:"8080"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"kubectl port-forward service/demo-app -n tutorial 8080:3000\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Then navigate your browser to: ",(0,t.jsx)(n.a,{href:"http://localhost:8080",children:"http://localhost:8080"})]}),"\n",(0,t.jsx)(n.h2,{id:"step-5-interacting-with-postgresql",children:"Step 5: Interacting with PostgreSQL"}),"\n",(0,t.jsxs)(n.p,{children:["Once you've created a PostgreSQL Service Instance, you can use the ",(0,t.jsx)(n.code,{children:"a9s CLI"})," to interact with it."]}),"\n",(0,t.jsx)(n.h3,{id:"applying-a-local-sql-file",children:"Applying a Local SQL File"}),"\n",(0,t.jsx)(n.p,{children:"Although not the preferred way to load seed data into a production database, during development it might be handy to execute a SQL file to a PostgreSQL instance. This allows executing one or multiple SQL statements conveniently."}),"\n",(0,t.jsx)(n.p,{children:"Download an exemplary SQL file:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"curl https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/demo_data.sql -o demo_data.sql\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Executing an SQL file is as simple as using the ",(0,t.jsx)(n.code,{children:"--file"})," option:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s pg apply --file demo_data.sql -i clustered-instance -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"a9s CLI"})," will determine the replication leader, upload, execute and delete the SQL file."]}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"--no-delete"})," option can be used during debugging of erroneous SQL statements\nas the SQL file remains in the PostgreSQL Leader's Pod."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s pg apply --file demo_data.sql -i clustered-instance -n tutorial --no-delete\n"})}),"\n",(0,t.jsx)(n.p,{children:"With the SQL file still available in the Pod, statements can be quickly altered and re-tested."}),"\n",(0,t.jsx)(n.h3,{id:"applying-an-sql-string",children:"Applying an SQL String"}),"\n",(0,t.jsxs)(n.p,{children:["It is also possible to execute a SQL string containing one or several SQL statements by using the ",(0,t.jsx)(n.code,{children:"--sql"})," option:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,t.jsx)(n.p,{children:"The output of the command will be printed on the screen, for example:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"Output from the Pod:\n \ncount \n-------\n 10 \n(1 row)\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Again, the ",(0,t.jsx)(n.code,{children:"pg apply"})," commands are not meant to interact with production databases but may become handy during debugging and local development."]}),"\n",(0,t.jsxs)(n.p,{children:["Be aware that these commands are executed by the privileged ",(0,t.jsx)(n.code,{children:"postgres"})," user. Schemas (tables) created by the ",(0,t.jsx)(n.code,{children:"postgres"})," user may not be accessible by roles (users) created in conjunction with Service Bindings. You will then have to grant access privileges to the Service Binding role."]}),"\n",(0,t.jsx)(n.h2,{id:"step-6-creating-and-restoring-a-backup",children:"Step 6: Creating and Restoring a Backup"}),"\n",(0,t.jsx)(n.p,{children:"Assuming you have configured the backup store and provided access credentials to an AWS S3 compatible object store, try creating and restoring a backup for your application."}),"\n",(0,t.jsx)(n.h3,{id:"creating-a-backup",children:"Creating a Backup"}),"\n",(0,t.jsx)(n.p,{children:"Creating a backup can be achieved with a single command:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create pg backup --name clustered-backup-1 -i clustered-instance -n tutorial\n"})}),"\n",(0,t.jsx)(n.p,{children:"With a closer look at the output you will notice that a backup is also specified by a YAML specification and thus is done in a declarative way. You express that you want a backup to be created:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-YAML",children:"apiVersion: backups.anynines.com/v1beta3\nkind: Backup\nmetadata:\n name: clustered-backup-1\n namespace: tutorial\nspec:\n serviceInstance:\n apiGroup: postgresql.anynines.com\n kind: Postgresql\n name: clustered-instance\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The a8s Backup Manager is the responsible for making the backup happen. It does that by locating the Service Instance ",(0,t.jsx)(n.code,{children:"clustered-instance"})," which also runs the ",(0,t.jsx)(n.code,{children:"a8s Backup Agent"}),". This agent is then executing the PostgreSQL backup command and, depending on its configuration, compressing, encrypting and streaming the backup to the backup object store (S3)."]}),"\n",(0,t.jsx)(n.h3,{id:"restoring-a-backup",children:"Restoring a Backup"}),"\n",(0,t.jsxs)(n.p,{children:["In order to experience the value of a backup, simulate a data loss by issueing the following ",(0,t.jsx)(n.code,{children:"DELETE"})," statement:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "DELETE FROM posts"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Verify the destructive effect on your data by counting the number of posts:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,t.jsx)(n.p,{children:"And/or reloading the demo-app."}),"\n",(0,t.jsx)(n.p,{children:"Once you've confirmed that all blog posts are gone, it's time to recover the data from the backup."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"a9s create pg restore --name clustered-restore-1 -b clustered-backup-1 -i clustered-instance -n tutorial\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Again, apply the ",(0,t.jsx)(n.code,{children:"COUNT"})," or reload the website to see that the restore has brought back all blog posts."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,t.jsx)(n.p,{children:"Some engineers say that a convenient backup/restore functionality at your disposal improves the quality of sleep by 37% \ud83d\ude09."}),"\n",(0,t.jsx)(n.h2,{id:"congratulations",children:"Congratulations"}),"\n",(0,t.jsx)(n.p,{children:"With just a few commands, you have created a local Kubernetes cluster, installed the a8s PostgreSQL Control Plane including all its dependencies. Furthermore, you have provisioned an PostgreSQL cluster consisting of three Pods providing you with an asynchronous streaming cluster supporting automatic failure detection, lead-election and failover. Deploying the demo application you've also experienced the convenience of Service Bindings and their automatic creation of Kubernetes Secrets. The backup and restore experiment then illustrated how effortless handling a production database can be."}),"\n",(0,t.jsx)(n.p,{children:"Did you every think that running a production database as an application developer with full self-service could be so easy?"}),"\n",(0,t.jsx)(n.h2,{id:"what-to-do-next",children:"What to do next?"}),"\n",(0,t.jsxs)(n.p,{children:["Wait, there's more to it! This hands-on tutorial merely scratched the surface. Did you see that the ",(0,t.jsx)(n.code,{children:"a9s CLI"})," has created many YAML manifests stored in the ",(0,t.jsx)(n.code,{children:"usermanifests"})," folder of your working directory? This is a good place to start tweaking your manifests and start your own experiments."]}),"\n",(0,t.jsx)(n.p,{children:"If you want to learn more about a8s PostgreSQL feel free to have a look at the documentation at TODO."}),"\n",(0,t.jsxs)(n.p,{children:["For more about the ",(0,t.jsx)(n.code,{children:"a9s CLI"})," have a look at ",(0,t.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"https://github.com/anynines/a9s-cli-v2"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"links",children:"Links"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["a9s CLI documentation and source, ",(0,t.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"https://github.com/anynines/a9s-cli-v2"})]}),"\n",(0,t.jsxs)(n.li,{children:["PostgreSQL documentation, Log-Shipping Standby Servers, ",(0,t.jsx)(n.a,{href:"https://www.postgresql.org/docs/current/warm-standby.html",children:"https://www.postgresql.org/docs/current/warm-standby.html"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>c});var t=s(6540);const a={},i=t.createContext(a);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e555076a.ef159516.js b/assets/js/e555076a.ef159516.js new file mode 100644 index 0000000..fc0f5aa --- /dev/null +++ b/assets/js/e555076a.ef159516.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[7799],{7670:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","title":"Deploying a Demo App using a8s PostgreSQL","description":"What you will accomplish","source":"@site/versioned_docs/version-0.13.0/hands-on-tutorials/a9s-cli-a8s-postgresql.md","sourceDirName":"hands-on-tutorials","slug":"/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","permalink":"/docs/0.13.0/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","draft":false,"unlisted":false,"tags":[{"inline":true,"label":"a9s hub","permalink":"/docs/0.13.0/tags/a-9-s-hub"},{"inline":true,"label":"a9s cli","permalink":"/docs/0.13.0/tags/a-9-s-cli"},{"inline":true,"label":"a8s data services","permalink":"/docs/0.13.0/tags/a-8-s-data-services"},{"inline":true,"label":"a8s postgres","permalink":"/docs/0.13.0/tags/a-8-s-postgres"},{"inline":true,"label":"data service","permalink":"/docs/0.13.0/tags/data-service"},{"inline":true,"label":"tutorial","permalink":"/docs/0.13.0/tags/tutorial"},{"inline":true,"label":"kubernetes","permalink":"/docs/0.13.0/tags/kubernetes"},{"inline":true,"label":"minikube","permalink":"/docs/0.13.0/tags/minikube"},{"inline":true,"label":"kind","permalink":"/docs/0.13.0/tags/kind"}],"version":"0.13.0","frontMatter":{"id":"hands-on-tutorial-a8s-pg-a9s-cli","title":"Deploying a Demo App using a8s PostgreSQL","tags":["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind"],"keywords":["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind","postgresql","web app"]}}');var a=s(4848),i=s(8453);const r={id:"hands-on-tutorial-a8s-pg-a9s-cli",title:"Deploying a Demo App using a8s PostgreSQL",tags:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind"],keywords:["a9s hub","a9s cli","a8s data services","a8s postgres","data service","tutorial","kubernetes","minikube","kind","postgresql","web app"]},c="Overview",l={},o=[{value:"What you will accomplish",id:"what-you-will-accomplish",level:2},{value:"What you will learn",id:"what-you-will-learn",level:2},{value:"Prerequisites",id:"prerequisites",level:2},{value:"Step 1: Creating a Kubernetes Cluster with a8s PostgreSQL",id:"step-1-creating-a-kubernetes-cluster-with-a8s-postgresql",level:2},{value:"Step 1.1: Initial Configuration on the First a9s create cluster Execution",id:"step-11-initial-configuration-on-the-first-a9s-create-cluster-execution",level:3},{value:"What's Happening During the Installation",id:"whats-happening-during-the-installation",level:3},{value:"Cert-Manager",id:"cert-manager",level:4},{value:"a8s PostgreSQL",id:"a8s-postgresql",level:4},{value:"Step 2: Creating a PostgreSQL Cluster",id:"step-2-creating-a-postgresql-cluster",level:2},{value:"Inspecting the Service Instance",id:"inspecting-the-service-instance",level:3},{value:"Step 3: Creating a Service Binding",id:"step-3-creating-a-service-binding",level:2},{value:"Step 4: Deploying a Demo Application",id:"step-4-deploying-a-demo-application",level:2},{value:"Step 5: Interacting with PostgreSQL",id:"step-5-interacting-with-postgresql",level:2},{value:"Applying a Local SQL File",id:"applying-a-local-sql-file",level:3},{value:"Applying an SQL String",id:"applying-an-sql-string",level:3},{value:"Step 6: Creating and Restoring a Backup",id:"step-6-creating-and-restoring-a-backup",level:2},{value:"Creating a Backup",id:"creating-a-backup",level:3},{value:"Restoring a Backup",id:"restoring-a-backup",level:3},{value:"Congratulations",id:"congratulations",level:2},{value:"What to do next?",id:"what-to-do-next",level:2},{value:"Links",id:"links",level:2}];function d(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"overview",children:"Overview"})}),"\n",(0,a.jsx)(n.h2,{id:"what-you-will-accomplish",children:"What you will accomplish"}),"\n",(0,a.jsxs)(n.p,{children:["In this tutorial you will learn how to ",(0,a.jsx)(n.strong,{children:"create a local Kubernetes cluster"}),", fully equipped ",(0,a.jsx)(n.strong,{children:"with a PostgreSQL"})," operator, ready for you to deploy a PostgreSQL database instance for ",(0,a.jsx)(n.strong,{children:"developing your application"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"what-you-will-learn",children:"What you will learn"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["Install the ",(0,a.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"a9s CLI"})]}),"\n",(0,a.jsx)(n.li,{children:"Create a local Kubernetes cluster"}),"\n",(0,a.jsxs)(n.li,{children:["Install ",(0,a.jsx)(n.a,{href:"https://cert-manager.io/docs/",children:"cert-manager"})]}),"\n",(0,a.jsx)(n.li,{children:"Install a8s PostgreSQL"}),"\n",(0,a.jsx)(n.li,{children:"Create a PostgreSQL database instance"}),"\n",(0,a.jsx)(n.li,{children:"Create a PostgreSQL user"}),"\n",(0,a.jsx)(n.li,{children:"Connect to the PostgreSQL database"}),"\n",(0,a.jsx)(n.li,{children:"Deploy a demo application"}),"\n",(0,a.jsx)(n.li,{children:"Connect the application to the PostgreSQL database"}),"\n",(0,a.jsx)(n.li,{children:"Create a backup"}),"\n",(0,a.jsx)(n.li,{children:"Restore a backup"}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:["MacOS / Linux","\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Other platforms, including Windows, may work but are currently untested."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://www.docker.com/",children:"Docker"})}),"\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.a,{href:"https://minikube.sigs.k8s.io/docs/start/",children:"Minikube"})," or ",(0,a.jsx)(n.a,{href:"https://kind.sigs.k8s.io/",children:"Kind"})]}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"a9s CLI"})}),"\n",(0,a.jsx)(n.li,{children:(0,a.jsx)(n.a,{href:"https://kubernetes.io/docs/reference/kubectl/",children:"Kubectl"})}),"\n",(0,a.jsx)(n.li,{children:"Optional for backup/restore: AWS S3 Bucket with credentials"}),"\n"]}),"\n",(0,a.jsx)(n.h1,{id:"implementation",children:"Implementation"}),"\n",(0,a.jsxs)(n.p,{children:["In this tutorial you will be using the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI to facilitate the creation of both a local Kubernetes cluster and a PostgreSQL database instance."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"a9s"})," CLI will guide you through the process while providing you with transparency and ability to set your own pace. Transparency means that you will see the exact commands to be executed. By default, the commands are executed only after you have confirmed the execution by pressing the ",(0,a.jsx)(n.code,{children:"ENTER"})," key. This allows you to have a closer look at the command and/or the YAML specifications to understand what the current step in the tutorial is about. If all you care about is the result, the ",(0,a.jsx)(n.code,{children:"--yes"})," option will answer all yes-no questions with yes. See ",(0,a.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"[1]"})," for documentation and source code of the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI."]}),"\n",(0,a.jsx)(n.h2,{id:"step-1-creating-a-kubernetes-cluster-with-a8s-postgresql",children:"Step 1: Creating a Kubernetes Cluster with a8s PostgreSQL"}),"\n",(0,a.jsx)(n.p,{children:"In this section you will create a Kubernetes cluster with a8s PostgreSQL and all its dependencies:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create cluster a8s\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Per default, ",(0,a.jsx)(n.code,{children:"minikube"})," will be used. In case you prefer ",(0,a.jsx)(n.code,{children:"kind"})," you can use the ",(0,a.jsx)(n.code,{children:"--provider"})," option:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create cluster a8s --provider kind\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The remainder of the tutorial works equally for both ",(0,a.jsx)(n.code,{children:"minikube"})," and ",(0,a.jsx)(n.code,{children:"kind"}),"."]}),"\n",(0,a.jsx)(n.h3,{id:"step-11-initial-configuration-on-the-first-a9s-create-cluster-execution",children:"Step 1.1: Initial Configuration on the First a9s create cluster Execution"}),"\n",(0,a.jsx)(n.p,{children:"When creating a cluster for the first time, a few setup steps will have to be taken which need to be performed only once:"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["Setting up a working directory for the use with the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI. ",(0,a.jsx)(n.strong,{children:"This step asks for your confirmation of the proposed directory."})]}),"\n",(0,a.jsx)(n.li,{children:"Configuring the access credentials for the S3 compatible object store which is needed to use the backup/restore feature of a8s Postgres. This step is performed automatically."}),"\n",(0,a.jsxs)(n.li,{children:["Cloning deployment resources required by the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI to create a cluster. This step is performed automatically."]}),"\n"]}),"\n",(0,a.jsx)(n.h3,{id:"whats-happening-during-the-installation",children:"What's Happening During the Installation"}),"\n",(0,a.jsx)(n.p,{children:"After the initial configuration, the Kubernetes cluster is being created."}),"\n",(0,a.jsx)(n.h4,{id:"cert-manager",children:"Cert-Manager"}),"\n",(0,a.jsxs)(n.p,{children:["Once the Kubernetes cluster is ready, the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI proceeds with the installation of the ",(0,a.jsx)(n.a,{href:"https://cert-manager.io/docs/",children:"cert-manager"}),". The cert-manager is a Kubernetes extension handling TLS certificates. Among others, in a8s PostgreSQL TSL certificates are used for securing the communication between Kubernetes and the operator."]}),"\n",(0,a.jsx)(n.h4,{id:"a8s-postgresql",children:"a8s PostgreSQL"}),"\n",(0,a.jsxs)(n.p,{children:["With the cert-manager being ready, the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI continues and installs the a8s PostgreSQL components. Namely, this is"]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"The PostgreSQL operator"}),"\n",(0,a.jsx)(n.li,{children:"The Service Binding controller"}),"\n",(0,a.jsx)(n.li,{children:"The Backup Manager"}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.strong,{children:"PostgreSQL Operator"})," is responsible for creating and managing ",(0,a.jsx)(n.em,{children:"Service Instances"}),", that is dedicated PostgreSQL servers represented by a single or a cluster of Pods."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.strong,{children:"Service Binding Controller"}),", as the name suggests, is responsible for creating so-called ",(0,a.jsx)(n.em,{children:"Service Bindings"}),". A Service Binding represents ",(0,a.jsx)(n.strong,{children:"a unique set of credentials"})," connecting a database client, such as an application and a Service Instance, in this case a PostgreSQL instance. In the case of a8s PostgreSQL, a Service Binding contains a ",(0,a.jsx)(n.strong,{children:"username/password"})," combination as well as other information necessary to establish a connection such as the ",(0,a.jsx)(n.strong,{children:"hostname"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.strong,{children:"Backup Manager"})," is responsible for managing backup and restore requests and dispatching them to the ",(0,a.jsx)(n.em,{children:"Backup Agents"})," located alongside Postgres Service Instances. It is the Backup Agent of a Service Instance that actually triggers the execution, encryption, compression and streaming of backup and restore operations."]}),"\n",(0,a.jsxs)(n.p,{children:["After ",(0,a.jsx)(n.em,{children:"waiting for a8s Postgres Control Plane to become ready"})," the message ",(0,a.jsx)(n.code,{children:"\ud83c\udf89 The a8s Postgres Control Plane appears to be ready. All expected pods are running."})," indicates that ",(0,a.jsx)(n.strong,{children:"the installation of a8s PostgreSQL was successful"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"step-2-creating-a-postgresql-cluster",children:"Step 2: Creating a PostgreSQL Cluster"}),"\n",(0,a.jsxs)(n.p,{children:["In order to keep all tutorial resources in one place, create a Kubernetes ",(0,a.jsx)(n.code,{children:"tutorial"})," namespace:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl create namespace tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Now that the a8s PostgreSQL Operator and the ",(0,a.jsx)(n.code,{children:"tutorial"})," namespace is ready, it's time to create a database."]}),"\n",(0,a.jsxs)(n.p,{children:["Using the ",(0,a.jsx)(n.code,{children:"a9s"})," CLI the process is as simple as:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create pg instance --name clustered-instance --replicas 3 -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["This creates a clustered PostgreSQL instance named ",(0,a.jsx)(n.code,{children:"clustered-instance"})," represented as a StatefulSet with ",(0,a.jsx)(n.code,{children:"3"})," Pods. Each Pod runs a PostgreSQL process."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Note"}),": The ",(0,a.jsx)(n.code,{children:"a9s CLI"})," does not shield you the YAML specs is generated. Quite the opposite, it is intended to provide you with meaningful templates to start with. ",(0,a.jsxs)(n.strong,{children:["You can find all YAML specs generated by the ",(0,a.jsx)(n.code,{children:"a9s CLI"})," in the ",(0,a.jsx)(n.code,{children:"usermanifests"})," folder in your a9s working directory"]}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"ls $(a9s cluster pwd)/usermanifests\n"})}),"\n",(0,a.jsx)(n.h3,{id:"inspecting-the-service-instance",children:"Inspecting the Service Instance"}),"\n",(0,a.jsx)(n.p,{children:"It's worth inspecting the PostgreSQL Service Instance to see what the a8s PostgreSQL Operator has created:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get postgresqls -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME AGE\nclustered-instance 131m\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"postgresql"})," object named ",(0,a.jsx)(n.code,{children:"clustered-instance"}),", as the name suggests, represents your PostgreSQL instance. It is implemented by a set of Kubernetes Services and a StatefulSet."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get statefulsets -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The operator has created a Kubernetes StatefulSet with the name ",(0,a.jsx)(n.code,{children:"clustered-instance"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME READY AGE\nclustered-instance 3/3 89m\n"})}),"\n",(0,a.jsx)(n.p,{children:"And the StatefulSet, in turn, manages three Pods, namely:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get pods -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"The following Pods:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME READY STATUS RESTARTS AGE\nclustered-instance-0 3/3 Running 0 70m\nclustered-instance-1 3/3 Running 0 68m\nclustered-instance-2 3/3 Running 0 66m\n"})}),"\n",(0,a.jsx)(n.p,{children:"Have a closer look at one of them:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl describe pod clustered-instance-0 -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Especially, look at the ",(0,a.jsx)(n.code,{children:"Labels"})," section in the output:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"Name: clustered-instance-0\nNamespace: tutorial\nPriority: 0\nService Account: clustered-instance\nNode: a8s-demo-m02/192.168.58.3\nStart Time: Tue, 12 Mar 2024 08:15:39 +0100\nLabels: a8s.a9s/dsi-group=postgresql.anynines.com\n a8s.a9s/dsi-kind=Postgresql\n a8s.a9s/dsi-name=clustered-instance\n a8s.a9s/replication-role=master\n apps.kubernetes.io/pod-index=0\n controller-revision-hash=clustered-instance-749699f5b9\n statefulset.kubernetes.io/pod-name=clustered-instance-0\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The label ",(0,a.jsx)(n.code,{children:"a8s.a9s/replication-role=master"})," indicates that the Pod ",(0,a.jsx)(n.code,{children:"clustered-instance-0"})," is the ",(0,a.jsx)(n.strong,{children:"primary"})," PostgreSQL server for the asynchronous streaming replication within the cluster. Don't worry if you are not familiar with this terminology. Just bare in mind that ",(0,a.jsx)(n.strong,{children:"all data altering SQL statements always need to go to the primary Pod"}),". There's a mechanism in place that will help with this."]}),"\n",(0,a.jsx)(n.p,{children:"By executing:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get services -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["You will see a ",(0,a.jsx)(n.code,{children:"clustered-instance-master"})," Kubernetes service:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE\nclustered-instance-config ClusterIP None 74m\nclustered-instance-master ClusterIP 10.105.7.211 5432/TCP,8008/TCP 75m\n"})}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsxs)(n.strong,{children:["The ",(0,a.jsx)(n.code,{children:"clustered-instance-master"})," service provides a reference to the primary PostgreSQL server within the clustered Service Instance"]}),". As the cluster comes with failure-detection and automatic failover capabilities, the primary role may be assigned to another Pod in the cluster during leading election. However, the ",(0,a.jsx)(n.code,{children:"clustered-instance-master"})," service will be updated so that any application connecting through the ",(0,a.jsx)(n.code,{children:"clustered-instance-master"})," service automatically connects to the ",(0,a.jsx)(n.strong,{children:"current"})," primary."]}),"\n",(0,a.jsxs)(n.p,{children:[(0,a.jsx)(n.strong,{children:"Congratulations \ud83c\udf89"}),", you've managed to create yourself a highly available PostgreSQL cluster using asynchronous streaming replication."]}),"\n",(0,a.jsx)(n.h2,{id:"step-3-creating-a-service-binding",children:"Step 3: Creating a Service Binding"}),"\n",(0,a.jsxs)(n.p,{children:["In order to prepare the deployment of an application, the database need to be configured to ",(0,a.jsx)(n.strong,{children:"grant the application access to the PostgreSQL service instance"}),". Granting an application running in Kubernetes access to a PostgreSQL database involves the following steps:"]}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Create a unique set of access credentials including a database role as well as a corresponding password."}),"\n"]}),"\n",(0,a.jsxs)(n.li,{children:["\n",(0,a.jsx)(n.p,{children:"Creating a Kubernetes Secret containing the credentials."}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(n.p,{children:"The credential set should be unique to the application and the data service instance. So if a second application, such as a worker process, needs access, a separate credential set and Kubernetes Secret is to be created."}),"\n",(0,a.jsxs)(n.p,{children:["With a8s PostgreSQL the process of creating access credentials on-demand is referred to as creating ",(0,a.jsx)(n.em,{children:"Service Bindings"}),". In other words, ",(0,a.jsx)(n.strong,{children:"a Service Binding in a8s PostgreSQL is a database role, password which is then stored in a Kubernetes Secret"})," to be used by exactly one application."]}),"\n",(0,a.jsxs)(n.p,{children:["Think about the implication of managing Service Bindings using the Kubernetes API. Instead of writing custom scripts connecting to the database, the creation of a database user is as simple as creating a Kubernetes object. Therefore, ",(0,a.jsx)(n.strong,{children:"Service Bindings facilitate deployments to multiple Kubernetes environments describing application systems entirely using Kubernetes objects"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"Creating a Service Binding is easy:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create pg servicebinding --name sb-sample -n tutorial -i clustered-instance\n"})}),"\n",(0,a.jsx)(n.p,{children:"Have a look at the resources that have been generated:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get servicebindings -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME AGE\nsb-sample 6s\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"servicebinding"})," object named ",(0,a.jsx)(n.code,{children:"sb-sample"})," is owned by the a8s PostgreSQL Operator or, more precisely, the ServiceBindingController. As part of the Service Binding, a Kubernetes Secret has been created:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get secrets -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME TYPE DATA AGE\npostgres.credentials.clustered-instance Opaque 2 9m16s\nsb-sample-service-binding Opaque 4 25s\nstandby.credentials.clustered-instance Opaque 2 9m16s\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Investigate the Secret ",(0,a.jsx)(n.code,{children:"sb-sample-service-binding"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get secret sb-sample-service-binding -n tutorial -o yaml\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-yaml",children:'apiVersion: v1\ndata:\n database: YTlzX2FwcHNfZGVmYXVsdF9kYg==\n instance_service: Y2x1c3RlcmVkLWluc3RhbmNlLW1hc3Rlci50dXRvcmlhbA==\n password: bk1wNGI2WHdMeXUwYVkzWmF4ekExS1VURTNzM2xham4=\n username: YThzLXNiLWN4cDZCMFRUQg==\nimmutable: true\nkind: Secret\nmetadata:\n creationTimestamp: "2024-03-12T14:50:33Z"\n finalizers:\n - a8s.anynines.com/servicebinding.controller\n labels:\n service-binding: "true"\n name: sb-sample-service-binding\n namespace: tutorial\n ownerReferences:\n - apiVersion: servicebindings.anynines.com/v1beta3\n blockOwnerDeletion: true\n controller: true\n kind: ServiceBinding\n name: sb-sample\n uid: e4636254-433a-4e82-a46b-e79fd7f25f58\n resourceVersion: "2648"\n uid: ebee4e29-4796-4e9a-8114-ec4d546644a9\ntype: Opaque\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Note that the values in the ",(0,a.jsx)(n.code,{children:"data"})," hash aren't readable right away as they are base64 encoded. Values can be decoded using the ",(0,a.jsx)(n.code,{children:"base64"})," command, for example:"]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.code,{children:"database:"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'echo "YTlzX2FwcHNfZGVmYXVsdF9kYg==" | base64 --decode\na9s_apps_default_db\n'})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.code,{children:"instance_service:"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'echo "Y2x1c3RlcmVkLWluc3RhbmNlLW1hc3Rlci50dXRvcmlhbA==" | base64 --decode\nclustered-instance-master.tutorial\n'})}),"\n",(0,a.jsxs)(n.p,{children:["Given a Service name, the generic naming pattern in Kubernetes to derive its DNS entry is: ",(0,a.jsx)(n.code,{children:"{service-name}.{namespace}.svc.{cluster-domain:cluster.local}"}),"."]}),"\n",(0,a.jsxs)(n.p,{children:["Assuming that your Kubernetes' cluster domain is the default ",(0,a.jsx)(n.code,{children:"cluster.local"}),", this means that the primary (formerly master) node of your PostgreSQL cluster is reachable via the DNS entry: ",(0,a.jsx)(n.strong,{children:(0,a.jsx)(n.code,{children:"clustered-instance-master.tutorial.svc.cluster.local"})}),"."]}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.code,{children:"username:"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'echo "YThzLXNiLWN4cDZCMFRUQg==" | base64 --decode\na8s-sb-cxp6B0TTB\n'})}),"\n",(0,a.jsx)(n.p,{children:(0,a.jsx)(n.code,{children:"password:"})}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'echo "bk1wNGI2WHdMeXUwYVkzWmF4ekExS1VURTNzM2xham4=" | base64 --decode\nnMp4b6XwLyu0aY3ZaxzA1KUTE3s3lajn\n'})}),"\n",(0,a.jsxs)(n.p,{children:["As you can see, the secret ",(0,a.jsx)(n.code,{children:"sb-sample-service-binding"})," contains all relevant information required by an application to connect to your PostgreSQL instance."]}),"\n",(0,a.jsx)(n.h2,{id:"step-4-deploying-a-demo-application",children:"Step 4: Deploying a Demo Application"}),"\n",(0,a.jsx)(n.p,{children:"With the PostgreSQL database at hand, an exemplary application can be deployed."}),"\n",(0,a.jsx)(n.p,{children:"The demo app has already been checked out for you. Hence, installing it just a single command away:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl apply -k $(a9s cluster pwd)/a8s-demo/demo-postgresql-app -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"service/demo-app created\ndeployment.apps/demo-app created\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The demo app consists of a Kubernetes Service and a Deployment both named ",(0,a.jsx)(n.code,{children:"demo-app"}),"."]}),"\n",(0,a.jsx)(n.p,{children:"You can verify that the app is running by executing:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl get pods -n tutorial -l app=demo-app\n"})}),"\n",(0,a.jsx)(n.p,{children:"Output:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"NAME READY STATUS RESTARTS AGE\ndemo-app-65f6dd4445-glgc4 1/1 Running 0 81s\n"})}),"\n",(0,a.jsxs)(n.p,{children:["In order to access the app locally, create a port forward mapping the container port ",(0,a.jsx)(n.code,{children:"3000"})," your local machine's port ",(0,a.jsx)(n.code,{children:"8080"}),":"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"kubectl port-forward service/demo-app -n tutorial 8080:3000\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Then navigate your browser to: ",(0,a.jsx)(n.a,{href:"http://localhost:8080",children:"http://localhost:8080"})]}),"\n",(0,a.jsx)(n.h2,{id:"step-5-interacting-with-postgresql",children:"Step 5: Interacting with PostgreSQL"}),"\n",(0,a.jsxs)(n.p,{children:["Once you've created a PostgreSQL Service Instance, you can use the ",(0,a.jsx)(n.code,{children:"a9s CLI"})," to interact with it."]}),"\n",(0,a.jsx)(n.h3,{id:"applying-a-local-sql-file",children:"Applying a Local SQL File"}),"\n",(0,a.jsx)(n.p,{children:"Although not the preferred way to load seed data into a production database, during development it might be handy to execute a SQL file to a PostgreSQL instance. This allows executing one or multiple SQL statements conveniently."}),"\n",(0,a.jsx)(n.p,{children:"Download an exemplary SQL file:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"curl https://a9s-cli-v2-fox4ce5.s3.eu-central-1.amazonaws.com/demo_data.sql -o demo_data.sql\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Executing an SQL file is as simple as using the ",(0,a.jsx)(n.code,{children:"--file"})," option:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s pg apply --file demo_data.sql -i clustered-instance -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"a9s CLI"})," will determine the replication leader, upload, execute and delete the SQL file."]}),"\n",(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"--no-delete"})," option can be used during debugging of erroneous SQL statements\nas the SQL file remains in the PostgreSQL Leader's Pod."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s pg apply --file demo_data.sql -i clustered-instance -n tutorial --no-delete\n"})}),"\n",(0,a.jsx)(n.p,{children:"With the SQL file still available in the Pod, statements can be quickly altered and re-tested."}),"\n",(0,a.jsx)(n.h3,{id:"applying-an-sql-string",children:"Applying an SQL String"}),"\n",(0,a.jsxs)(n.p,{children:["It is also possible to execute a SQL string containing one or several SQL statements by using the ",(0,a.jsx)(n.code,{children:"--sql"})," option:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,a.jsx)(n.p,{children:"The output of the command will be printed on the screen, for example:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"Output from the Pod:\n \ncount \n-------\n 10 \n(1 row)\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Again, the ",(0,a.jsx)(n.code,{children:"pg apply"})," commands are not meant to interact with production databases but may become handy during debugging and local development."]}),"\n",(0,a.jsxs)(n.p,{children:["Be aware that these commands are executed by the privileged ",(0,a.jsx)(n.code,{children:"postgres"})," user. Schemas (tables) created by the ",(0,a.jsx)(n.code,{children:"postgres"})," user may not be accessible by roles (users) created in conjunction with Service Bindings. You will then have to grant access privileges to the Service Binding role."]}),"\n",(0,a.jsx)(n.h2,{id:"step-6-creating-and-restoring-a-backup",children:"Step 6: Creating and Restoring a Backup"}),"\n",(0,a.jsx)(n.p,{children:"Assuming you have configured the backup store and provided access credentials to an AWS S3 compatible object store, try creating and restoring a backup for your application."}),"\n",(0,a.jsx)(n.h3,{id:"creating-a-backup",children:"Creating a Backup"}),"\n",(0,a.jsx)(n.p,{children:"Creating a backup can be achieved with a single command:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create pg backup --name clustered-backup-1 -i clustered-instance -n tutorial\n"})}),"\n",(0,a.jsx)(n.p,{children:"With a closer look at the output you will notice that a backup is also specified by a YAML specification and thus is done in a declarative way. You express that you want a backup to be created:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-YAML",children:"apiVersion: backups.anynines.com/v1beta3\nkind: Backup\nmetadata:\n name: clustered-backup-1\n namespace: tutorial\nspec:\n serviceInstance:\n apiGroup: postgresql.anynines.com\n kind: Postgresql\n name: clustered-instance\n"})}),"\n",(0,a.jsxs)(n.p,{children:["The a8s Backup Manager is the responsible for making the backup happen. It does that by locating the Service Instance ",(0,a.jsx)(n.code,{children:"clustered-instance"})," which also runs the ",(0,a.jsx)(n.code,{children:"a8s Backup Agent"}),". This agent is then executing the PostgreSQL backup command and, depending on its configuration, compressing, encrypting and streaming the backup to the backup object store (S3)."]}),"\n",(0,a.jsx)(n.h3,{id:"restoring-a-backup",children:"Restoring a Backup"}),"\n",(0,a.jsxs)(n.p,{children:["In order to experience the value of a backup, simulate a data loss by issueing the following ",(0,a.jsx)(n.code,{children:"DELETE"})," statement:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "DELETE FROM posts"\n'})}),"\n",(0,a.jsx)(n.p,{children:"Verify the destructive effect on your data by counting the number of posts:"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,a.jsx)(n.p,{children:"And/or reloading the demo-app."}),"\n",(0,a.jsx)(n.p,{children:"Once you've confirmed that all blog posts are gone, it's time to recover the data from the backup."}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:"a9s create pg restore --name clustered-restore-1 -b clustered-backup-1 -i clustered-instance -n tutorial\n"})}),"\n",(0,a.jsxs)(n.p,{children:["Again, apply the ",(0,a.jsx)(n.code,{children:"COUNT"})," or reload the website to see that the restore has brought back all blog posts."]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-bash",children:'a9s pg apply -i clustered-instance -n tutorial --sql "SELECT COUNT(*) FROM posts"\n'})}),"\n",(0,a.jsx)(n.p,{children:"Some engineers say that a convenient backup/restore functionality at your disposal improves the quality of sleep by 37% \ud83d\ude09."}),"\n",(0,a.jsx)(n.h2,{id:"congratulations",children:"Congratulations"}),"\n",(0,a.jsx)(n.p,{children:"With just a few commands, you have created a local Kubernetes cluster, installed the a8s PostgreSQL Control Plane including all its dependencies. Furthermore, you have provisioned an PostgreSQL cluster consisting of three Pods providing you with an asynchronous streaming cluster supporting automatic failure detection, lead-election and failover. Deploying the demo application you've also experienced the convenience of Service Bindings and their automatic creation of Kubernetes Secrets. The backup and restore experiment then illustrated how effortless handling a production database can be."}),"\n",(0,a.jsx)(n.p,{children:"Did you every think that running a production database as an application developer with full self-service could be so easy?"}),"\n",(0,a.jsx)(n.h2,{id:"what-to-do-next",children:"What to do next?"}),"\n",(0,a.jsxs)(n.p,{children:["Wait, there's more to it! This hands-on tutorial merely scratched the surface. Did you see that the ",(0,a.jsx)(n.code,{children:"a9s CLI"})," has created many YAML manifests stored in the ",(0,a.jsx)(n.code,{children:"usermanifests"})," folder of your working directory? This is a good place to start tweaking your manifests and start your own experiments."]}),"\n",(0,a.jsx)(n.p,{children:"If you want to learn more about a8s PostgreSQL feel free to have a look at the documentation at TODO."}),"\n",(0,a.jsxs)(n.p,{children:["For more about the ",(0,a.jsx)(n.code,{children:"a9s CLI"})," have a look at ",(0,a.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"https://github.com/anynines/a9s-cli-v2"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"links",children:"Links"}),"\n",(0,a.jsxs)(n.ol,{children:["\n",(0,a.jsxs)(n.li,{children:["a9s CLI documentation and source, ",(0,a.jsx)(n.a,{href:"https://github.com/anynines/a9s-cli-v2",children:"https://github.com/anynines/a9s-cli-v2"})]}),"\n",(0,a.jsxs)(n.li,{children:["PostgreSQL documentation, Log-Shipping Standby Servers, ",(0,a.jsx)(n.a,{href:"https://www.postgresql.org/docs/current/warm-standby.html",children:"https://www.postgresql.org/docs/current/warm-standby.html"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>c});var t=s(6540);const a={},i=t.createContext(a);function r(e){const n=t.useContext(i);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e8006827.003e4256.js b/assets/js/e8006827.003e4256.js deleted file mode 100644 index bc67d7f..0000000 --- a/assets/js/e8006827.003e4256.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[5859],{5222:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>g,frontMatter:()=>s,metadata:()=>d,toc:()=>i});var t=a(4848),l=a(8453);const s={tags:["a9s","changelog","release"],keywords:["a9s","changelog","release"],slug:"changelog-0.11.1",title:"0.11.1",date:new Date("2024-02-29T00:00:00.000Z")},o=void 0,d={permalink:"/changelog/changelog-0.11.1",source:"@site/changelog/2024-02-29-version-0.11.1.md",title:"0.11.1",description:"Added",date:"2024-02-29T00:00:00.000Z",tags:[{inline:!0,label:"a9s",permalink:"/changelog/tags/a-9-s"},{inline:!0,label:"changelog",permalink:"/changelog/tags/changelog"},{inline:!0,label:"release",permalink:"/changelog/tags/release"}],readingTime:.045,hasTruncateMarker:!1,authors:[],frontMatter:{tags:["a9s","changelog","release"],keywords:["a9s","changelog","release"],slug:"changelog-0.11.1",title:"0.11.1",date:"2024-02-29T00:00:00.000Z"},unlisted:!1},r={authorsImageUrls:[]},i=[{value:"Added",id:"added",level:3},{value:"Changed",id:"changed",level:3},{value:"Removed",id:"removed",level:3},{value:"Fixed",id:"fixed",level:3}];function c(e){const n={h2:"h2",h3:"h3",...(0,l.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h2,{id:""}),"\n",(0,t.jsx)(n.h3,{id:"added",children:"Added"}),"\n",(0,t.jsx)(n.h3,{id:"changed",children:"Changed"}),"\n",(0,t.jsx)(n.h3,{id:"removed",children:"Removed"}),"\n",(0,t.jsx)(n.h3,{id:"fixed",children:"Fixed"})]})}function g(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},8453:(e,n,a)=>{a.d(n,{R:()=>o,x:()=>d});var t=a(6540);const l={},s=t.createContext(l);function o(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:o(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e8006827.0559b266.js b/assets/js/e8006827.0559b266.js new file mode 100644 index 0000000..16a819e --- /dev/null +++ b/assets/js/e8006827.0559b266.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[5859],{5222:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>d,contentTitle:()=>r,default:()=>g,frontMatter:()=>o,metadata:()=>t,toc:()=>i});var t=a(9328),s=a(4848),l=a(8453);const o={tags:["a9s","changelog","release"],keywords:["a9s","changelog","release"],slug:"changelog-0.11.1",title:"0.11.1",date:new Date("2024-02-29T00:00:00.000Z")},r=void 0,d={authorsImageUrls:[]},i=[{value:"Added",id:"added",level:3},{value:"Changed",id:"changed",level:3},{value:"Removed",id:"removed",level:3},{value:"Fixed",id:"fixed",level:3}];function c(e){const n={h2:"h2",h3:"h3",...(0,l.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:""}),"\n",(0,s.jsx)(n.h3,{id:"added",children:"Added"}),"\n",(0,s.jsx)(n.h3,{id:"changed",children:"Changed"}),"\n",(0,s.jsx)(n.h3,{id:"removed",children:"Removed"}),"\n",(0,s.jsx)(n.h3,{id:"fixed",children:"Fixed"})]})}function g(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453:(e,n,a)=>{a.d(n,{R:()=>o,x:()=>r});var t=a(6540);const s={},l=t.createContext(s);function o(e){const n=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(l.Provider,{value:n},e.children)}},9328:e=>{e.exports=JSON.parse('{"permalink":"/changelog/changelog-0.11.1","source":"@site/changelog/2024-02-29-version-0.11.1.md","title":"0.11.1","description":"Added","date":"2024-02-29T00:00:00.000Z","tags":[{"inline":true,"label":"a9s","permalink":"/changelog/tags/a-9-s"},{"inline":true,"label":"changelog","permalink":"/changelog/tags/changelog"},{"inline":true,"label":"release","permalink":"/changelog/tags/release"}],"readingTime":0.045,"hasTruncateMarker":false,"authors":[],"frontMatter":{"tags":["a9s","changelog","release"],"keywords":["a9s","changelog","release"],"slug":"changelog-0.11.1","title":"0.11.1","date":"2024-02-29T00:00:00.000Z"},"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/edcf5004.ab594cb8.js b/assets/js/edcf5004.ab594cb8.js new file mode 100644 index 0000000..3b8db6a --- /dev/null +++ b/assets/js/edcf5004.ab594cb8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[888],{9268:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>i,metadata:()=>s,toc:()=>u});const s=JSON.parse('{"id":"hands-on-tutorials/hands-on-tutorials-index","title":"Hands-On Tutorials","description":"The hands-on tutorials guide you through practical experiments using the a9s CLI to learn about Kubernetes, data services and application development.","source":"@site/versioned_docs/version-0.14.0/hands-on-tutorials/index.md","sourceDirName":"hands-on-tutorials","slug":"/hands-on-tutorials/","permalink":"/docs/hands-on-tutorials/","draft":false,"unlisted":false,"tags":[{"inline":true,"label":"a9s CLI","permalink":"/docs/tags/a-9-s-cli"},{"inline":true,"label":"tutorials","permalink":"/docs/tags/tutorials"},{"inline":true,"label":"a9s Hub","permalink":"/docs/tags/a-9-s-hub"}],"version":"0.14.0","frontMatter":{"id":"hands-on-tutorials-index","title":"Hands-On Tutorials","tags":["a9s CLI","tutorials","a9s Hub"],"keywords":["a9s CLI","tutorials","a9s Hub"]}}');var a=n(4848),o=n(8453);const i={id:"hands-on-tutorials-index",title:"Hands-On Tutorials",tags:["a9s CLI","tutorials","a9s Hub"],keywords:["a9s CLI","tutorials","a9s Hub"]},r="Hands-On-Tutorials",l={},u=[{value:"Deploying an application with PostgreSQL to a local Kubernetes cluster.",id:"deploying-an-application-with-postgresql-to-a-local-kubernetes-cluster",level:2}];function d(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"hands-on-tutorials",children:"Hands-On-Tutorials"})}),"\n",(0,a.jsxs)(t.p,{children:["The hands-on tutorials guide you through practical experiments using the ",(0,a.jsx)(t.code,{children:"a9s"})," CLI to learn about Kubernetes, data services and application development."]}),"\n",(0,a.jsx)(t.h2,{id:"deploying-an-application-with-postgresql-to-a-local-kubernetes-cluster",children:"Deploying an application with PostgreSQL to a local Kubernetes cluster."}),"\n",(0,a.jsxs)(t.p,{children:["In this tutorial you will use the ",(0,a.jsx)(t.code,{children:"a9s"})," CLI to provision a local Kubernetes cluster using Kind or Minikube, install a PostgreSQL operator, deploy a demo application, load data into the database as well as perform backup and restore operations."]}),"\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.a,{href:"/docs/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/",children:"Go to the PostgreSQL Tutorial"})})]})}function c(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>r});var s=n(6540);const a={},o=s.createContext(a);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/edcf5004.c34992e0.js b/assets/js/edcf5004.c34992e0.js deleted file mode 100644 index 4fb5847..0000000 --- a/assets/js/edcf5004.c34992e0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[888],{3500:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>r,toc:()=>u});var s=n(4848),a=n(8453);const o={id:"hands-on-tutorials-index",title:"Hands-On Tutorials",tags:["a9s CLI","tutorials","a9s Hub"],keywords:["a9s CLI","tutorials","a9s Hub"]},i="Hands-On-Tutorials",r={id:"hands-on-tutorials/hands-on-tutorials-index",title:"Hands-On Tutorials",description:"The hands-on tutorials guide you through practical experiments using the a9s CLI to learn about Kubernetes, data services and application development.",source:"@site/versioned_docs/version-0.14.0/hands-on-tutorials/index.md",sourceDirName:"hands-on-tutorials",slug:"/hands-on-tutorials/",permalink:"/docs/hands-on-tutorials/",draft:!1,unlisted:!1,tags:[{inline:!0,label:"a9s CLI",permalink:"/docs/tags/a-9-s-cli"},{inline:!0,label:"tutorials",permalink:"/docs/tags/tutorials"},{inline:!0,label:"a9s Hub",permalink:"/docs/tags/a-9-s-hub"}],version:"0.14.0",frontMatter:{id:"hands-on-tutorials-index",title:"Hands-On Tutorials",tags:["a9s CLI","tutorials","a9s Hub"],keywords:["a9s CLI","tutorials","a9s Hub"]}},l={},u=[{value:"Deploying an application with PostgreSQL to a local Kubernetes cluster.",id:"deploying-an-application-with-postgresql-to-a-local-kubernetes-cluster",level:2}];function d(t){const e={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",...(0,a.R)(),...t.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(e.h1,{id:"hands-on-tutorials",children:"Hands-On-Tutorials"}),"\n",(0,s.jsxs)(e.p,{children:["The hands-on tutorials guide you through practical experiments using the ",(0,s.jsx)(e.code,{children:"a9s"})," CLI to learn about Kubernetes, data services and application development."]}),"\n",(0,s.jsx)(e.h2,{id:"deploying-an-application-with-postgresql-to-a-local-kubernetes-cluster",children:"Deploying an application with PostgreSQL to a local Kubernetes cluster."}),"\n",(0,s.jsxs)(e.p,{children:["In this tutorial you will use the ",(0,s.jsx)(e.code,{children:"a9s"})," CLI to provision a local Kubernetes cluster using Kind or Minikube, install a PostgreSQL operator, deploy a demo application, load data into the database as well as perform backup and restore operations."]}),"\n",(0,s.jsx)(e.p,{children:(0,s.jsx)(e.a,{href:"/docs/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/",children:"Go to the PostgreSQL Tutorial"})})]})}function c(t={}){const{wrapper:e}={...(0,a.R)(),...t.components};return e?(0,s.jsx)(e,{...t,children:(0,s.jsx)(d,{...t})}):d(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>i,x:()=>r});var s=n(6540);const a={},o=s.createContext(a);function i(t){const e=s.useContext(o);return s.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function r(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(a):t.components||a:i(t.components),s.createElement(o.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/fd3e93ab.42a4a3b7.js b/assets/js/fd3e93ab.42a4a3b7.js deleted file mode 100644 index 3df87e8..0000000 --- a/assets/js/fd3e93ab.42a4a3b7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[6008],{6851:(t,e,n)=>{n.r(e),n.d(e,{assets:()=>r,contentTitle:()=>i,default:()=>c,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var a=n(4848),s=n(8453);const o={id:"hands-on-tutorials-index",title:"Hands-On Tutorials",tags:["a9s CLI","tutorials","a9s Hub"],keywords:["a9s CLI","tutorials","a9s Hub"]},i="Hands-On-Tutorials",l={id:"hands-on-tutorials/hands-on-tutorials-index",title:"Hands-On Tutorials",description:"The hands-on tutorials guide you through practical experiments using the a9s CLI to learn about Kubernetes, data services and application development.",source:"@site/docs/hands-on-tutorials/index.md",sourceDirName:"hands-on-tutorials",slug:"/hands-on-tutorials/",permalink:"/docs/develop/hands-on-tutorials/",draft:!1,unlisted:!1,tags:[{inline:!0,label:"a9s CLI",permalink:"/docs/develop/tags/a-9-s-cli"},{inline:!0,label:"tutorials",permalink:"/docs/develop/tags/tutorials"},{inline:!0,label:"a9s Hub",permalink:"/docs/develop/tags/a-9-s-hub"}],version:"current",frontMatter:{id:"hands-on-tutorials-index",title:"Hands-On Tutorials",tags:["a9s CLI","tutorials","a9s Hub"],keywords:["a9s CLI","tutorials","a9s Hub"]},sidebar:"tutorialSidebar",previous:{title:"a9s CLI Klutch",permalink:"/docs/develop/a9s-cli-klutch"},next:{title:"Deploying a Demo App using a8s PostgreSQL",permalink:"/docs/develop/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli"}},r={},d=[{value:"Deploying an application with PostgreSQL to a local Kubernetes cluster.",id:"deploying-an-application-with-postgresql-to-a-local-kubernetes-cluster",level:2}];function u(t){const e={a:"a",code:"code",h1:"h1",h2:"h2",p:"p",...(0,s.R)(),...t.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(e.h1,{id:"hands-on-tutorials",children:"Hands-On-Tutorials"}),"\n",(0,a.jsxs)(e.p,{children:["The hands-on tutorials guide you through practical experiments using the ",(0,a.jsx)(e.code,{children:"a9s"})," CLI to learn about Kubernetes, data services and application development."]}),"\n",(0,a.jsx)(e.h2,{id:"deploying-an-application-with-postgresql-to-a-local-kubernetes-cluster",children:"Deploying an application with PostgreSQL to a local Kubernetes cluster."}),"\n",(0,a.jsxs)(e.p,{children:["In this tutorial you will use the ",(0,a.jsx)(e.code,{children:"a9s"})," CLI to provision a local Kubernetes cluster using Kind or Minikube, install a PostgreSQL operator, deploy a demo application, load data into the database as well as perform backup and restore operations."]}),"\n",(0,a.jsx)(e.p,{children:(0,a.jsx)(e.a,{href:"/docs/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/",children:"Go to the PostgreSQL Tutorial"})})]})}function c(t={}){const{wrapper:e}={...(0,s.R)(),...t.components};return e?(0,a.jsx)(e,{...t,children:(0,a.jsx)(u,{...t})}):u(t)}},8453:(t,e,n)=>{n.d(e,{R:()=>i,x:()=>l});var a=n(6540);const s={},o=a.createContext(s);function i(t){const e=a.useContext(o);return a.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function l(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(s):t.components||s:i(t.components),a.createElement(o.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/fd3e93ab.b4a0fd1b.js b/assets/js/fd3e93ab.b4a0fd1b.js new file mode 100644 index 0000000..3023d2e --- /dev/null +++ b/assets/js/fd3e93ab.b4a0fd1b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[6008],{4780:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>c,frontMatter:()=>i,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"hands-on-tutorials/hands-on-tutorials-index","title":"Hands-On Tutorials","description":"The hands-on tutorials guide you through practical experiments using the a9s CLI to learn about Kubernetes, data services and application development.","source":"@site/docs/hands-on-tutorials/index.md","sourceDirName":"hands-on-tutorials","slug":"/hands-on-tutorials/","permalink":"/docs/develop/hands-on-tutorials/","draft":false,"unlisted":false,"tags":[{"inline":true,"label":"a9s CLI","permalink":"/docs/develop/tags/a-9-s-cli"},{"inline":true,"label":"tutorials","permalink":"/docs/develop/tags/tutorials"},{"inline":true,"label":"a9s Hub","permalink":"/docs/develop/tags/a-9-s-hub"}],"version":"current","frontMatter":{"id":"hands-on-tutorials-index","title":"Hands-On Tutorials","tags":["a9s CLI","tutorials","a9s Hub"],"keywords":["a9s CLI","tutorials","a9s Hub"]},"sidebar":"tutorialSidebar","previous":{"title":"a9s CLI Klutch","permalink":"/docs/develop/a9s-cli-klutch"},"next":{"title":"Deploying a Demo App using a8s PostgreSQL","permalink":"/docs/develop/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli"}}');var n=a(4848),o=a(8453);const i={id:"hands-on-tutorials-index",title:"Hands-On Tutorials",tags:["a9s CLI","tutorials","a9s Hub"],keywords:["a9s CLI","tutorials","a9s Hub"]},r="Hands-On-Tutorials",l={},d=[{value:"Deploying an application with PostgreSQL to a local Kubernetes cluster.",id:"deploying-an-application-with-postgresql-to-a-local-kubernetes-cluster",level:2}];function u(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.header,{children:(0,n.jsx)(t.h1,{id:"hands-on-tutorials",children:"Hands-On-Tutorials"})}),"\n",(0,n.jsxs)(t.p,{children:["The hands-on tutorials guide you through practical experiments using the ",(0,n.jsx)(t.code,{children:"a9s"})," CLI to learn about Kubernetes, data services and application development."]}),"\n",(0,n.jsx)(t.h2,{id:"deploying-an-application-with-postgresql-to-a-local-kubernetes-cluster",children:"Deploying an application with PostgreSQL to a local Kubernetes cluster."}),"\n",(0,n.jsxs)(t.p,{children:["In this tutorial you will use the ",(0,n.jsx)(t.code,{children:"a9s"})," CLI to provision a local Kubernetes cluster using Kind or Minikube, install a PostgreSQL operator, deploy a demo application, load data into the database as well as perform backup and restore operations."]}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.a,{href:"/docs/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/",children:"Go to the PostgreSQL Tutorial"})})]})}function c(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},8453:(e,t,a)=>{a.d(t,{R:()=>i,x:()=>r});var s=a(6540);const n={},o=s.createContext(n);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.31207828.js b/assets/js/main.31207828.js new file mode 100644 index 0000000..30b0bac --- /dev/null +++ b/assets/js/main.31207828.js @@ -0,0 +1,2 @@ +/*! For license information please see main.31207828.js.LICENSE.txt */ +(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[8792],{2413:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});n(6540);var r=n(3259),o=n.n(r),a=n(4054);const i={"00a997aa":[()=>n.e(7211).then(n.t.bind(n,7591,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-a-8-s-data-services-f43.json",7591],"017bd477":[()=>n.e(1239).then(n.t.bind(n,7983,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-kubernetes-df1.json",7983],"01a85c17":[()=>Promise.all([n.e(1869),n.e(8209)]).then(n.bind(n,9321)),"@theme/BlogTagsListPage",9321],"02875b28":[()=>n.e(7041).then(n.bind(n,3828)),"@site/docs/a9s-cli-index.md",3828],"02c8af25":[()=>n.e(4342).then(n.t.bind(n,1126,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-tutorials-fbb.json",1126],"0914dfc1":[()=>n.e(3459).then(n.bind(n,4956)),"@site/versioned_docs/version-0.14.0/a9s-cli-a8s.md",4956],"109e9327":[()=>n.e(1543).then(n.t.bind(n,9808,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-tutorial-68d.json",9808],"11b43341":[()=>n.e(2256).then(n.t.bind(n,5293,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-7fc.json",5293],"11b7a020":[()=>n.e(4369).then(n.t.bind(n,5905,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-a-9-s-hub-4dc.json",5905],"13ead1de":[()=>n.e(9821).then(n.bind(n,9453)),"@site/docs/a9s-cli-klutch.md",9453],"14ebb456":[()=>n.e(6082).then(n.bind(n,2384)),"@site/versioned_docs/version-0.14.0/hands-on-tutorials/a9s-cli-a8s-postgresql.md",2384],"167c766c":[()=>n.e(7510).then(n.bind(n,7562)),"@site/changelog/2024-02-29-version-0.11.1.md?truncated=true",7562],17896441:[()=>Promise.all([n.e(1869),n.e(5280),n.e(8401)]).then(n.bind(n,949)),"@theme/DocItem",949],"17ceec3f":[()=>n.e(9092).then(n.t.bind(n,9528,19)),"@generated/docusaurus-plugin-content-blog/default/p/changelog-archive-82b.json",9528],"18991abe":[()=>n.e(1187).then(n.t.bind(n,4879,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-a-9-s-data-services-99d.json",4879],"19f0d3e7":[()=>n.e(5700).then(n.t.bind(n,7465,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-a-8-s-postgres-519.json",7465],"1bed8fa8":[()=>n.e(6156).then(n.bind(n,6672)),"@site/versioned_docs/version-0.13.0/hands-on-tutorials/index.md",6672],"1cc1e508":[()=>n.e(2993).then(n.t.bind(n,7798,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-a-9-s-hub-331.json",7798],"1cd7d199":[()=>n.e(7775).then(n.bind(n,5272)),"@site/versioned_docs/version-0.13.1/a9s-cli.md",5272],"1e6038a0":[()=>n.e(5445).then(n.t.bind(n,2080,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-a-9-s-hub-8c6.json",2080],"1f391b9e":[()=>Promise.all([n.e(1869),n.e(5280),n.e(6061)]).then(n.bind(n,9972)),"@theme/MDXPage",9972],"1fd819d3":[()=>n.e(4887).then(n.t.bind(n,7522,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-a-9-s-postgres-eff.json",7522],"20da2af4":[()=>n.e(7349).then(n.t.bind(n,1832,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-a-9-s-data-services-237.json",1832],"21aa04c8":[()=>n.e(1311).then(n.bind(n,7401)),"@site/versioned_docs/version-0.13.1/hands-on-tutorials/index.md",7401],"25e181b4":[()=>n.e(4409).then(n.t.bind(n,8100,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-kubernetes-72c.json",8100],"2d1935e8":[()=>n.e(1536).then(n.t.bind(n,343,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-minikube-171.json",343],"2ead3a23":[()=>n.e(3202).then(n.t.bind(n,2936,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-a-9-s-cli-23a.json",2936],"34a91cba":[()=>n.e(6927).then(n.t.bind(n,6840,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-kind-e95.json",6840],"36994c47":[()=>n.e(9858).then(n.t.bind(n,5516,19)),"@generated/docusaurus-plugin-content-blog/default/__plugin.json",5516],"36c171c8":[()=>n.e(9393).then(n.t.bind(n,275,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-e14.json",275],"3720c009":[()=>Promise.all([n.e(1869),n.e(4787)]).then(n.bind(n,5429)),"@theme/DocTagsListPage",5429],"3841b242":[()=>n.e(945).then(n.t.bind(n,4510,19)),"@generated/docusaurus-plugin-content-blog/default/p/changelog-tags-changelog-e9f.json",4510],"393be207":[()=>n.e(4134).then(n.bind(n,6607)),"@site/src/pages/markdown-page.md",6607],"394f3b94":[()=>n.e(2457).then(n.t.bind(n,9179,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-kubernetes-5bb.json",9179],"3f735f2f":[()=>n.e(1155).then(n.t.bind(n,2779,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-introduction-fc4.json",2779],"42ebd64a":[()=>n.e(3399).then(n.bind(n,4150)),"@site/versioned_docs/version-0.13.1/hands-on-tutorials/a9s-cli-a8s-postgresql.md",4150],"47bcf3f9":[()=>n.e(4751).then(n.t.bind(n,3374,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-935.json",3374],"49ba2875":[()=>n.e(9651).then(n.t.bind(n,730,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-tutorials-a60.json",730],"4fa24cac":[()=>n.e(4807).then(n.t.bind(n,4724,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-minikube-790.json",4724],"4fba34d3":[()=>n.e(5856).then(n.t.bind(n,5690,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-a-9-s-postgres-f63.json",5690],"564fc82a":[()=>n.e(1830).then(n.t.bind(n,7962,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-a-8-s-data-services-f05.json",7962],"569be754":[()=>n.e(2752).then(n.t.bind(n,5736,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-kind-bc7.json",5736],"5815bd71":[()=>n.e(2920).then(n.t.bind(n,7903,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-a-9-s-hub-5fc.json",7903],"58277bbf":[()=>n.e(1734).then(n.t.bind(n,4843,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-kind-997.json",4843],"587d9a20":[()=>n.e(4829).then(n.bind(n,657)),"@site/docs/hands-on-tutorials/a9s-cli-a8s-postgresql.md",657],"59a86f76":[()=>n.e(4261).then(n.t.bind(n,6765,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-data-service-4f5.json",6765],"5a9cefb8":[()=>n.e(558).then(n.t.bind(n,4163,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-a-9-s-cli-09f.json",4163],"5d826cac":[()=>n.e(8231).then(n.t.bind(n,3222,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-tutorials-115.json",3222],"5e95c892":[()=>n.e(9647).then(n.bind(n,3124)),"@theme/DocsRoot",3124],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"5fcb3aa6":[()=>n.e(5904).then(n.t.bind(n,7488,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-a-9-s-postgres-c5d.json",7488],"5feb6b60":[()=>n.e(7901).then(n.t.bind(n,2190,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-kind-d93.json",2190],"6772df6c":[()=>n.e(1818).then(n.t.bind(n,6786,19)),"@generated/docusaurus-plugin-content-blog/default/p/changelog-tags-f07.json",6786],"6875c492":[()=>Promise.all([n.e(1869),n.e(5280),n.e(3648),n.e(4813)]).then(n.bind(n,6942)),"@theme/BlogTagsPostsPage",6942],"7321275f":[()=>n.e(1478).then(n.t.bind(n,2234,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-eee.json",2234],"7a733630":[()=>n.e(9143).then(n.t.bind(n,8666,19)),"@generated/docusaurus-plugin-content-blog/default/p/changelog-tags-release-b69.json",8666],"7c1241f1":[()=>n.e(8746).then(n.t.bind(n,4411,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-a-9-s-postgres-723.json",4411],"7fa8dbab":[()=>n.e(2800).then(n.t.bind(n,4027,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-a-8-s-postgres-7d5.json",4027],"801cbd99":[()=>n.e(6935).then(n.t.bind(n,7659,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-tutorial-d81.json",7659],"814f3328":[()=>n.e(7472).then(n.t.bind(n,5513,19)),"~blog/default/blog-post-list-prop-default.json",5513],83869130:[()=>n.e(3765).then(n.t.bind(n,4533,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-a-9-s-data-services-dea.json",4533],"83e7349b":[()=>n.e(6700).then(n.t.bind(n,5264,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-introduction-92b.json",5264],"8a22d297":[()=>n.e(8520).then(n.t.bind(n,8011,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-klutch-b06.json",8011],"8b11db2f":[()=>n.e(9585).then(n.t.bind(n,2173,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-tutorials-b55.json",2173],"91cfe65a":[()=>n.e(33).then(n.t.bind(n,3223,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-a-8-s-data-services-4b3.json",3223],"92f3bebb":[()=>n.e(4684).then(n.bind(n,7669)),"@site/versioned_docs/version-0.14.0/a9s-cli-index.md",7669],"9765d1f4":[()=>n.e(4519).then(n.t.bind(n,9731,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-d36.json",9731],"9877f6c0":[()=>n.e(4743).then(n.t.bind(n,5826,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-a-9-s-data-services-06a.json",5826],"9e4087bc":[()=>n.e(2711).then(n.bind(n,5496)),"@theme/BlogArchivePage",5496],"9f646831":[()=>n.e(3618).then(n.t.bind(n,3520,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-a-8-s-postgres-457.json",3520],"9fd9d706":[()=>n.e(554).then(n.t.bind(n,6583,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-tutorial-a3a.json",6583],a019e40b:[()=>n.e(8419).then(n.t.bind(n,7474,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-15b.json",7474],a46e34d1:[()=>n.e(755).then(n.t.bind(n,1436,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-a-9-s-cli-eae.json",1436],a4b8ed33:[()=>n.e(2475).then(n.t.bind(n,2307,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-introduction-e13.json",2307],a6aa9e1f:[()=>Promise.all([n.e(1869),n.e(5280),n.e(3648),n.e(7643)]).then(n.bind(n,2783)),"@theme/BlogListPage",2783],a7456010:[()=>n.e(1235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,2881)),"@theme/DocVersionRoot",2881],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,8001)),"@theme/DocRoot",8001],aa7dd896:[()=>n.e(1413).then(n.t.bind(n,6514,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-kubernetes-3f2.json",6514],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],acecf23e:[()=>n.e(1903).then(n.t.bind(n,1912,19)),"~blog/default/blogMetadata-default.json",1912],af805925:[()=>n.e(8603).then(n.bind(n,7008)),"@site/docs/a9s-cli-a8s.md",7008],b2c0482b:[()=>n.e(5018).then(n.t.bind(n,9377,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-701.json",9377],b5cf070d:[()=>n.e(9476).then(n.t.bind(n,6614,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-minikube-f24.json",6614],b6021fd9:[()=>n.e(1285).then(n.t.bind(n,3280,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-minikube-9f0.json",3280],bf00b630:[()=>n.e(8173).then(n.t.bind(n,8092,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-a-8-s-data-services-39f.json",8092],c3f580cd:[()=>n.e(19).then(n.t.bind(n,9991,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-klutch-f68.json",9991],c4f5d8e4:[()=>Promise.all([n.e(1869),n.e(2634)]).then(n.bind(n,3709)),"@site/src/pages/index.js",3709],c76a67aa:[()=>n.e(3645).then(n.t.bind(n,9542,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-tutorial-117.json",9542],c80e5f88:[()=>n.e(7502).then(n.t.bind(n,1576,19)),"@generated/docusaurus-plugin-content-blog/default/p/changelog-tags-a-9-s-a2d.json",1576],ca1c37e3:[()=>n.e(9481).then(n.t.bind(n,2954,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-a-8-s-postgres-079.json",2954],ccb09cf4:[()=>n.e(1633).then(n.t.bind(n,3010,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-df3.json",3010],ccc49370:[()=>Promise.all([n.e(1869),n.e(5280),n.e(3648),n.e(3249)]).then(n.bind(n,1917)),"@theme/BlogPostPage",1917],cedda78d:[()=>n.e(7191).then(n.bind(n,104)),"@site/versioned_docs/version-0.14.0/a9s-cli-klutch.md",104],d9bdb70b:[()=>n.e(3347).then(n.bind(n,9220)),"@site/versioned_docs/version-0.13.0/a9s-cli.md",9220],df203c0f:[()=>Promise.all([n.e(1869),n.e(4279)]).then(n.bind(n,6958)),"@theme/DocTagDocListPage",6958],e264bb36:[()=>n.e(3871).then(n.t.bind(n,4861,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-data-service-7f9.json",4861],e2a9a4b8:[()=>n.e(3801).then(n.t.bind(n,3635,19)),"@generated/docusaurus-plugin-content-blog/default/p/changelog-534.json",3635],e555076a:[()=>n.e(7799).then(n.bind(n,7670)),"@site/versioned_docs/version-0.13.0/hands-on-tutorials/a9s-cli-a8s-postgresql.md",7670],e5ee3500:[()=>n.e(6995).then(n.t.bind(n,5259,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-data-service-5ee.json",5259],e8006827:[()=>n.e(5859).then(n.bind(n,5222)),"@site/changelog/2024-02-29-version-0.11.1.md",5222],e90aeb31:[()=>n.e(2485).then(n.t.bind(n,4058,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-data-service-ea0.json",4058],edcf5004:[()=>n.e(888).then(n.bind(n,9268)),"@site/versioned_docs/version-0.14.0/hands-on-tutorials/index.md",9268],f015a59b:[()=>n.e(6976).then(n.t.bind(n,3560,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-a-9-s-cli-b7e.json",3560],fa875745:[()=>n.e(8150).then(n.t.bind(n,7728,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-introduction-1b9.json",7728],fd3e93ab:[()=>n.e(6008).then(n.bind(n,4780)),"@site/docs/hands-on-tutorials/index.md",4780]};var s=n(4848);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(1604),u=n(3363);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(2560).then(n.bind(n,2560)),modules:["@theme/NotFound"],webpack:()=>[2560],render(e,t){const n=e.default;return(0,s.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},f=[],p=[],h=(0,c.A)(r);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],f.push(r[1]),p.push(r[2]))})),o().Map({loading:l,loader:d,modules:f,webpack:()=>p,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const l=o.__props;return delete o.__props,(0,s.jsx)(u.W,{value:i,children:(0,s.jsx)(a,{...o,...l,...n})})}})}const f=[{path:"/changelog/",component:d("/changelog/","e55"),exact:!0},{path:"/changelog/archive/",component:d("/changelog/archive/","7bb"),exact:!0},{path:"/changelog/changelog-0.11.1/",component:d("/changelog/changelog-0.11.1/","01b"),exact:!0},{path:"/changelog/tags/",component:d("/changelog/tags/","edf"),exact:!0},{path:"/changelog/tags/a-9-s/",component:d("/changelog/tags/a-9-s/","741"),exact:!0},{path:"/changelog/tags/changelog/",component:d("/changelog/tags/changelog/","d3c"),exact:!0},{path:"/changelog/tags/release/",component:d("/changelog/tags/release/","c43"),exact:!0},{path:"/markdown-page/",component:d("/markdown-page/","54d"),exact:!0},{path:"/docs/",component:d("/docs/","2b9"),routes:[{path:"/docs/0.13.0/",component:d("/docs/0.13.0/","50f"),routes:[{path:"/docs/0.13.0/tags/",component:d("/docs/0.13.0/tags/","4bd"),exact:!0},{path:"/docs/0.13.0/tags/a-8-s-data-services/",component:d("/docs/0.13.0/tags/a-8-s-data-services/","4ea"),exact:!0},{path:"/docs/0.13.0/tags/a-8-s-postgres/",component:d("/docs/0.13.0/tags/a-8-s-postgres/","08d"),exact:!0},{path:"/docs/0.13.0/tags/a-9-s-cli/",component:d("/docs/0.13.0/tags/a-9-s-cli/","71e"),exact:!0},{path:"/docs/0.13.0/tags/a-9-s-data-services/",component:d("/docs/0.13.0/tags/a-9-s-data-services/","0a6"),exact:!0},{path:"/docs/0.13.0/tags/a-9-s-hub/",component:d("/docs/0.13.0/tags/a-9-s-hub/","693"),exact:!0},{path:"/docs/0.13.0/tags/a-9-s-postgres/",component:d("/docs/0.13.0/tags/a-9-s-postgres/","ae2"),exact:!0},{path:"/docs/0.13.0/tags/data-service/",component:d("/docs/0.13.0/tags/data-service/","378"),exact:!0},{path:"/docs/0.13.0/tags/introduction/",component:d("/docs/0.13.0/tags/introduction/","1a7"),exact:!0},{path:"/docs/0.13.0/tags/kind/",component:d("/docs/0.13.0/tags/kind/","2f5"),exact:!0},{path:"/docs/0.13.0/tags/kubernetes/",component:d("/docs/0.13.0/tags/kubernetes/","a0e"),exact:!0},{path:"/docs/0.13.0/tags/minikube/",component:d("/docs/0.13.0/tags/minikube/","5e3"),exact:!0},{path:"/docs/0.13.0/tags/tutorial/",component:d("/docs/0.13.0/tags/tutorial/","1f4"),exact:!0},{path:"/docs/0.13.0/tags/tutorials/",component:d("/docs/0.13.0/tags/tutorials/","30e"),exact:!0},{path:"/docs/0.13.0/",component:d("/docs/0.13.0/","daf"),routes:[{path:"/docs/0.13.0/a9s-cli/",component:d("/docs/0.13.0/a9s-cli/","913"),exact:!0},{path:"/docs/0.13.0/hands-on-tutorials/",component:d("/docs/0.13.0/hands-on-tutorials/","849"),exact:!0},{path:"/docs/0.13.0/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/",component:d("/docs/0.13.0/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/","6e3"),exact:!0}]}]},{path:"/docs/0.13.1/",component:d("/docs/0.13.1/","b99"),routes:[{path:"/docs/0.13.1/tags/",component:d("/docs/0.13.1/tags/","653"),exact:!0},{path:"/docs/0.13.1/tags/a-8-s-data-services/",component:d("/docs/0.13.1/tags/a-8-s-data-services/","c65"),exact:!0},{path:"/docs/0.13.1/tags/a-8-s-postgres/",component:d("/docs/0.13.1/tags/a-8-s-postgres/","4ea"),exact:!0},{path:"/docs/0.13.1/tags/a-9-s-cli/",component:d("/docs/0.13.1/tags/a-9-s-cli/","40c"),exact:!0},{path:"/docs/0.13.1/tags/a-9-s-data-services/",component:d("/docs/0.13.1/tags/a-9-s-data-services/","113"),exact:!0},{path:"/docs/0.13.1/tags/a-9-s-hub/",component:d("/docs/0.13.1/tags/a-9-s-hub/","6e2"),exact:!0},{path:"/docs/0.13.1/tags/a-9-s-postgres/",component:d("/docs/0.13.1/tags/a-9-s-postgres/","d6f"),exact:!0},{path:"/docs/0.13.1/tags/data-service/",component:d("/docs/0.13.1/tags/data-service/","40e"),exact:!0},{path:"/docs/0.13.1/tags/introduction/",component:d("/docs/0.13.1/tags/introduction/","89b"),exact:!0},{path:"/docs/0.13.1/tags/kind/",component:d("/docs/0.13.1/tags/kind/","e55"),exact:!0},{path:"/docs/0.13.1/tags/kubernetes/",component:d("/docs/0.13.1/tags/kubernetes/","a5b"),exact:!0},{path:"/docs/0.13.1/tags/minikube/",component:d("/docs/0.13.1/tags/minikube/","df8"),exact:!0},{path:"/docs/0.13.1/tags/tutorial/",component:d("/docs/0.13.1/tags/tutorial/","098"),exact:!0},{path:"/docs/0.13.1/tags/tutorials/",component:d("/docs/0.13.1/tags/tutorials/","e74"),exact:!0},{path:"/docs/0.13.1/",component:d("/docs/0.13.1/","32b"),routes:[{path:"/docs/0.13.1/a9s-cli/",component:d("/docs/0.13.1/a9s-cli/","a10"),exact:!0},{path:"/docs/0.13.1/hands-on-tutorials/",component:d("/docs/0.13.1/hands-on-tutorials/","f26"),exact:!0},{path:"/docs/0.13.1/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/",component:d("/docs/0.13.1/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/","e50"),exact:!0}]}]},{path:"/docs/develop/",component:d("/docs/develop/","db4"),routes:[{path:"/docs/develop/tags/",component:d("/docs/develop/tags/","db9"),exact:!0},{path:"/docs/develop/tags/a-8-s-data-services/",component:d("/docs/develop/tags/a-8-s-data-services/","660"),exact:!0},{path:"/docs/develop/tags/a-8-s-postgres/",component:d("/docs/develop/tags/a-8-s-postgres/","7e4"),exact:!0},{path:"/docs/develop/tags/a-9-s-cli/",component:d("/docs/develop/tags/a-9-s-cli/","be1"),exact:!0},{path:"/docs/develop/tags/a-9-s-data-services/",component:d("/docs/develop/tags/a-9-s-data-services/","097"),exact:!0},{path:"/docs/develop/tags/a-9-s-hub/",component:d("/docs/develop/tags/a-9-s-hub/","e70"),exact:!0},{path:"/docs/develop/tags/a-9-s-postgres/",component:d("/docs/develop/tags/a-9-s-postgres/","973"),exact:!0},{path:"/docs/develop/tags/data-service/",component:d("/docs/develop/tags/data-service/","761"),exact:!0},{path:"/docs/develop/tags/introduction/",component:d("/docs/develop/tags/introduction/","150"),exact:!0},{path:"/docs/develop/tags/kind/",component:d("/docs/develop/tags/kind/","f9d"),exact:!0},{path:"/docs/develop/tags/klutch/",component:d("/docs/develop/tags/klutch/","e53"),exact:!0},{path:"/docs/develop/tags/kubernetes/",component:d("/docs/develop/tags/kubernetes/","f5a"),exact:!0},{path:"/docs/develop/tags/minikube/",component:d("/docs/develop/tags/minikube/","2d9"),exact:!0},{path:"/docs/develop/tags/tutorial/",component:d("/docs/develop/tags/tutorial/","a6f"),exact:!0},{path:"/docs/develop/tags/tutorials/",component:d("/docs/develop/tags/tutorials/","3cf"),exact:!0},{path:"/docs/develop/",component:d("/docs/develop/","b7b"),routes:[{path:"/docs/develop/a9s-cli-a8s/",component:d("/docs/develop/a9s-cli-a8s/","46a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/develop/a9s-cli-klutch/",component:d("/docs/develop/a9s-cli-klutch/","3f5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/develop/a9s-cli/",component:d("/docs/develop/a9s-cli/","c21"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/develop/hands-on-tutorials/",component:d("/docs/develop/hands-on-tutorials/","759"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/develop/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/",component:d("/docs/develop/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/","2c1"),exact:!0,sidebar:"tutorialSidebar"}]}]},{path:"/docs/",component:d("/docs/","923"),routes:[{path:"/docs/tags/",component:d("/docs/tags/","dc9"),exact:!0},{path:"/docs/tags/a-8-s-data-services/",component:d("/docs/tags/a-8-s-data-services/","23d"),exact:!0},{path:"/docs/tags/a-8-s-postgres/",component:d("/docs/tags/a-8-s-postgres/","881"),exact:!0},{path:"/docs/tags/a-9-s-cli/",component:d("/docs/tags/a-9-s-cli/","2ef"),exact:!0},{path:"/docs/tags/a-9-s-data-services/",component:d("/docs/tags/a-9-s-data-services/","896"),exact:!0},{path:"/docs/tags/a-9-s-hub/",component:d("/docs/tags/a-9-s-hub/","b1b"),exact:!0},{path:"/docs/tags/a-9-s-postgres/",component:d("/docs/tags/a-9-s-postgres/","6b3"),exact:!0},{path:"/docs/tags/data-service/",component:d("/docs/tags/data-service/","e35"),exact:!0},{path:"/docs/tags/introduction/",component:d("/docs/tags/introduction/","74a"),exact:!0},{path:"/docs/tags/kind/",component:d("/docs/tags/kind/","d98"),exact:!0},{path:"/docs/tags/klutch/",component:d("/docs/tags/klutch/","fab"),exact:!0},{path:"/docs/tags/kubernetes/",component:d("/docs/tags/kubernetes/","aa9"),exact:!0},{path:"/docs/tags/minikube/",component:d("/docs/tags/minikube/","b66"),exact:!0},{path:"/docs/tags/tutorial/",component:d("/docs/tags/tutorial/","f72"),exact:!0},{path:"/docs/tags/tutorials/",component:d("/docs/tags/tutorials/","443"),exact:!0},{path:"/docs/",component:d("/docs/","ebb"),routes:[{path:"/docs/a9s-cli-a8s/",component:d("/docs/a9s-cli-a8s/","f03"),exact:!0},{path:"/docs/a9s-cli-klutch/",component:d("/docs/a9s-cli-klutch/","7c6"),exact:!0},{path:"/docs/a9s-cli/",component:d("/docs/a9s-cli/","b40"),exact:!0},{path:"/docs/hands-on-tutorials/",component:d("/docs/hands-on-tutorials/","e3a"),exact:!0},{path:"/docs/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/",component:d("/docs/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/","d9e"),exact:!0}]}]}]},{path:"/",component:d("/","2e1"),exact:!0},{path:"*",component:d("*")}]},774:(e,t,n)=>{var r,o;!function(){var a,i,s,l,c,u,d,f,p,h,m,g,y,b,v,w,_,S,k,x,E,O,j,P,C,A,T,I,N,L,R=function(e){var t=new R.Builder;return t.pipeline.add(R.trimmer,R.stopWordFilter,R.stemmer),t.searchPipeline.add(R.stemmer),e.call(t,t),t.build()};R.version="2.3.9",R.utils={},R.utils.warn=(a=this,function(e){a.console&&console.warn&&console.warn(e)}),R.utils.asString=function(e){return null==e?"":e.toString()},R.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r 0){var l=R.utils.clone(t)||{};l.position=[i,s],l.index=o.length,o.push(new R.Token(n.slice(i,a),l))}i=a+1}}return o},R.tokenizer.separator=/[\s\-]+/,R.Pipeline=function(){this._stack=[]},R.Pipeline.registeredFunctions=Object.create(null),R.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&R.utils.warn("Overwriting existing registered function: "+t),e.label=t,R.Pipeline.registeredFunctions[e.label]=e},R.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||R.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},R.Pipeline.load=function(e){var t=new R.Pipeline;return e.forEach((function(e){var n=R.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},R.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){R.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},R.Pipeline.prototype.after=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},R.Pipeline.prototype.before=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},R.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},R.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n 1&&(a e&&(n=o),a!=e);)r=n-t,o=t+Math.floor(r/2),a=this.elements[2*o];return a==e||a>e?2*o:a s?c+=2:i==s&&(t+=n[l+1]*r[c+1],l+=2,c+=2);return t},R.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},R.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t 0){var a,i=o.str.charAt(0);i in o.node.edges?a=o.node.edges[i]:(a=new R.TokenSet,o.node.edges[i]=a),1==o.str.length&&(a.final=!0),r.push({node:a,editsRemaining:o.editsRemaining,str:o.str.slice(1)})}if(0!=o.editsRemaining){if("*"in o.node.edges)var s=o.node.edges["*"];else{s=new R.TokenSet;o.node.edges["*"]=s}if(0==o.str.length&&(s.final=!0),r.push({node:s,editsRemaining:o.editsRemaining-1,str:o.str}),o.str.length>1&&r.push({node:o.node,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)}),1==o.str.length&&(o.node.final=!0),o.str.length>=1){if("*"in o.node.edges)var l=o.node.edges["*"];else{l=new R.TokenSet;o.node.edges["*"]=l}1==o.str.length&&(l.final=!0),r.push({node:l,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)})}if(o.str.length>1){var c,u=o.str.charAt(0),d=o.str.charAt(1);d in o.node.edges?c=o.node.edges[d]:(c=new R.TokenSet,o.node.edges[d]=c),1==o.str.length&&(c.final=!0),r.push({node:c,editsRemaining:o.editsRemaining-1,str:u+o.str.slice(2)})}}}return n},R.TokenSet.fromString=function(e){for(var t=new R.TokenSet,n=t,r=0,o=e.length;r =e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},R.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},R.Index.prototype.search=function(e){return this.query((function(t){new R.QueryParser(e,t).parse()}))},R.Index.prototype.query=function(e){for(var t=new R.Query(this.fields),n=Object.create(null),r=Object.create(null),o=Object.create(null),a=Object.create(null),i=Object.create(null),s=0;s 1?1:e},R.Builder.prototype.k1=function(e){this._k1=e},R.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var o=0;o =this.length)return R.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},R.QueryLexer.prototype.width=function(){return this.pos-this.start},R.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},R.QueryLexer.prototype.backup=function(){this.pos-=1},R.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=R.QueryLexer.EOS&&this.backup()},R.QueryLexer.prototype.more=function(){return this.pos 1&&(e.backup(),e.emit(R.QueryLexer.TERM)),e.ignore(),e.more())return R.QueryLexer.lexText},R.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.EDIT_DISTANCE),R.QueryLexer.lexText},R.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.BOOST),R.QueryLexer.lexText},R.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(R.QueryLexer.TERM)},R.QueryLexer.termSeparator=R.tokenizer.separator,R.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==R.QueryLexer.EOS)return R.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return R.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if(t.match(R.QueryLexer.termSeparator))return R.QueryLexer.lexTerm}else e.escapeCharacter()}},R.QueryParser=function(e,t){this.lexer=new R.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},R.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=R.QueryParser.parseClause;e;)e=e(this);return this.query},R.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},R.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},R.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},R.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case R.QueryLexer.PRESENCE:return R.QueryParser.parsePresence;case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new R.QueryParseError(n,t.start,t.end)}},R.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=R.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=R.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new R.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new R.QueryParseError(n,t.start,t.end)}switch(r.type){case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new R.QueryParseError(n,r.start,r.end)}}},R.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var o=e.peekLexeme();if(null==o){r="expecting term, found nothing";throw new R.QueryParseError(r,t.start,t.end)}if(o.type===R.QueryLexer.TERM)return R.QueryParser.parseTerm;r="expecting term, found '"+o.type+"'";throw new R.QueryParseError(r,o.start,o.end)}},R.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new R.QueryParseError(r,n.start,n.end)}else e.nextClause()}},R.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new R.QueryParseError(r,o.start,o.end)}else e.nextClause()}},R.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new R.QueryParseError(r,o.start,o.end)}else e.nextClause()}},void 0===(o="function"==typeof(r=function(){return R})?r.call(t,n,t,e):r)||(e.exports=o)}()},8848:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>i});var r=n(6540),o=n(4848);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},5022:(e,t,n)=>{"use strict";var r=n(6540),o=n(5338),a=n(545),i=n(4625),s=n(4784),l=n(1712);const c=[n(5300),n(4090),n(5729),n(8252)];var u=n(2413),d=n(6347),f=n(2831),p=n(4848);function h(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var m=n(1141),g=n(7639),y=n(8180),b=n(6957),v=n(6644),w=n(2098),_=n(9503),S=n(1482),k=n(4609),x=n(1210);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.A)(),r=(0,w.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,p.jsxs)(m.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function O(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.A)(),{pathname:r}=(0,d.zy)();return e+(0,k.Ks)((0,y.Ay)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,p.jsxs)(m.A,{children:[(0,p.jsx)("meta",{property:"og:url",content:o}),(0,p.jsx)("link",{rel:"canonical",href:o})]})}function j(){const{i18n:{currentLocale:e}}=(0,g.A)(),{metadata:t,image:n}=(0,b.p)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(m.A,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:_.w})]}),n&&(0,p.jsx)(v.be,{image:n}),(0,p.jsx)(O,{}),(0,p.jsx)(E,{}),(0,p.jsx)(x.A,{tag:S.C,locale:e}),(0,p.jsx)(m.A,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const P=new Map;var C=n(8848),A=n(3366),T=n(6494);function I(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r {const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,T.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),I("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function L(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,f.u)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class R extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.A.canUseDOM?I("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=I("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),L(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(N,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(d.qh,{location:t,render:()=>e})})}}const D=R,F="__docusaurus-base-url-issue-banner-suggestion-container";function M(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '__docusaurus-base-url-issue-banner-container';\n var bannerHtml = ${JSON.stringify(function(e){return`\n \n`}(e)).replace(/{let{route:t}=e;return!0===t.exact})))return P.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return P.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,p.jsx)(D,{location:e,children:Q})}function q(){return(0,p.jsx)(U.A,{children:(0,p.jsx)(A.l,{children:(0,p.jsxs)(C.x,{children:[(0,p.jsxs)(h,{children:[(0,p.jsx)($,{}),(0,p.jsx)(j,{}),(0,p.jsx)(z,{}),(0,p.jsx)(W,{})]}),(0,p.jsx)(V,{})]})})})}var G=n(4054);const K=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Y=n(1604);const Z=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch:e=>{if(!(e=>!J()&&!X.has(e)&&!Z.has(e))(e))return!1;Z.add(e);const t=(0,f.u)(u.A,e).flatMap((e=>{return t=e.route.path,Object.entries(G).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Y.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?K(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),L(e))},te=Object.freeze(ee);function ne(e){let{children:t}=e;return"hash"===s.default.future.experimental_router?(0,p.jsx)(i.I9,{children:t}):(0,p.jsx)(i.Kd,{children:t})}const re=Boolean(!0);if(l.A.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(a.vd,{children:(0,p.jsx)(ne,{children:(0,p.jsx)(q,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(re)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};L(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},3366:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>f});var r=n(6540),o=n(4784);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Develop","isLast":false,"path":"/docs/develop","mainDocId":"a9s-cli-a8s","docs":[{"id":"a9s-cli","path":"/docs/develop/a9s-cli","sidebar":"tutorialSidebar"},{"id":"a9s-cli-a8s","path":"/docs/develop/a9s-cli-a8s","sidebar":"tutorialSidebar"},{"id":"a9s-cli-klutch","path":"/docs/develop/a9s-cli-klutch","sidebar":"tutorialSidebar"},{"id":"hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","path":"/docs/develop/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","sidebar":"tutorialSidebar"},{"id":"hands-on-tutorials/hands-on-tutorials-index","path":"/docs/develop/hands-on-tutorials/","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/develop/a9s-cli-a8s","label":"a9s-cli-a8s"}}}},{"name":"0.14.0","label":"0.14.0","isLast":true,"path":"/docs","mainDocId":"a9s-cli","docs":[{"id":"a9s-cli","path":"/docs/a9s-cli"},{"id":"a9s-cli-a8s","path":"/docs/a9s-cli-a8s"},{"id":"a9s-cli-klutch","path":"/docs/a9s-cli-klutch"},{"id":"hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","path":"/docs/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli"},{"id":"hands-on-tutorials/hands-on-tutorials-index","path":"/docs/hands-on-tutorials/"}],"draftIds":[],"sidebars":{}},{"name":"0.13.1","label":"0.13.1","isLast":false,"path":"/docs/0.13.1","mainDocId":"a9s-cli","docs":[{"id":"a9s-cli","path":"/docs/0.13.1/a9s-cli"},{"id":"hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","path":"/docs/0.13.1/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli"},{"id":"hands-on-tutorials/hands-on-tutorials-index","path":"/docs/0.13.1/hands-on-tutorials/"}],"draftIds":[],"sidebars":{}},{"name":"0.13.0","label":"0.13.0","isLast":false,"path":"/docs/0.13.0","mainDocId":"a9s-cli","docs":[{"id":"a9s-cli","path":"/docs/0.13.0/a9s-cli"},{"id":"hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","path":"/docs/0.13.0/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli"},{"id":"hands-on-tutorials/hands-on-tutorials-index","path":"/docs/0.13.0/hands-on-tutorials/"}],"draftIds":[],"sidebars":{}}],"breadcrumbs":true}},"docusaurus-plugin-google-tag-manager":{"default":{"containerId":"GTM-NZZ5ZVC","id":"default"}},"@cmfcmf/docusaurus-search-local":{"default":{"titleBoost":5,"contentBoost":1,"tagsBoost":3,"parentCategoriesBoost":2,"indexDocSidebarParentCategories":0,"maxSearchResults":8}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(2654);const l=JSON.parse('{"docusaurusVersion":"3.6.3","siteVersion":"1.1.2","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.6.3"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.6.3"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.6.3"},"docusaurus-plugin-google-tag-manager":{"type":"package","name":"@docusaurus/plugin-google-tag-manager","version":"3.6.3"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.6.3"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.6.3"},"@cmfcmf/docusaurus-search-local":{"type":"package","name":"@cmfcmf/docusaurus-search-local","version":"1.2.0"}}}');var c=n(4848);const u={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},d=r.createContext(u);function f(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},3832:(e,t,n)=>{"use strict";n.d(t,{A:()=>m});var r=n(6540),o=n(1712),a=n(1141),i=n(4609),s=n(1297),l=n(3363),c=n(4848);function u(e){let{error:t,tryAgain:n}=e;return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function f(e){let{children:t}=e;return(0,c.jsx)(l.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function p(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(f,{children:(0,c.jsxs)(m,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(s.A,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const h=e=>(0,c.jsx)(p,{...e});class m extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??h)(e)}return e??null}}},1712:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},1141:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(545),o=n(4848);function a(e){return(0,o.jsx)(r.mg,{...e})}},4783:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var r=n(6540),o=n(4625),a=n(4609),i=n(7639),s=n(877),l=n(1712),c=n(7344),u=n(8180),d=n(4848);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:h,isActive:m,"data-noBrokenLinkCheck":g,autoAddBaseUrl:y=!0,...b}=e;const{siteConfig:v}=(0,i.A)(),{trailingSlash:w,baseUrl:_}=v,S=v.future.experimental_router,{withBaseUrl:k}=(0,u.hH)(),x=(0,c.A)(),E=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>E.current));const O=f||p;const j=(0,s.A)(O),P=O?.replace("pathname://","");let C=void 0!==P?(A=P,y&&(e=>e.startsWith("/"))(A)?k(A):A):void 0;var A;"hash"===S&&C?.startsWith("./")&&(C=C?.slice(1)),C&&j&&(C=(0,a.Ks)(C,{trailingSlash:w,baseUrl:_}));const T=(0,r.useRef)(!1),I=n?o.k2:o.N_,N=l.A.canUseIntersectionObserver,L=(0,r.useRef)(),R=()=>{T.current||null==C||(window.docusaurus.preload(C),T.current=!0)};(0,r.useEffect)((()=>(!N&&j&&l.A.canUseDOM&&null!=C&&window.docusaurus.prefetch(C),()=>{N&&L.current&&L.current.disconnect()})),[L,C,N,j]);const D=C?.startsWith("#")??!1,F=!b.target||"_self"===b.target,M=!C||!j||!F||D&&"hash"!==S;g||!D&&M||x.collectLink(C),b.id&&x.collectAnchor(b.id);const B={};return M?(0,d.jsx)("a",{ref:E,href:C,...O&&!j&&{target:"_blank",rel:"noopener noreferrer"},...b,...B}):(0,d.jsx)(I,{...b,onMouseEnter:R,onTouchStart:R,innerRef:e=>{E.current=e,N&&e&&j&&(L.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(L.current.unobserve(e),L.current.disconnect(),null!=C&&window.docusaurus.prefetch(C))}))})),L.current.observe(e))},to:C,...n&&{isActive:m,activeClassName:h},...B})}const p=r.forwardRef(f)},3230:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>l});var r=n(6540),o=n(4848);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(s({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegalchildren",t),new Error("The Docusaurus component only accept simple string values");const i=s({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},4598:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},877:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>o,z:()=>r})},8180:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>s,hH:()=>i});var r=n(6540),o=n(7639),a=n(877);function i(){const{siteConfig:e}=(0,o.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,s=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:o=!1,absolute:i=!1}={},router:s}=e;if(!r||r.startsWith("#")||(0,a.z)(r))return r;if("hash"===s)return r.startsWith("/")?`.${r}`:`./${r}`;if(o)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const l=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+l:l}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:s}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},7344:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},7639:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(3366);function a(){return(0,r.useContext)(o.o)}},6503:(e,t,n)=>{"use strict";n.d(t,{P_:()=>i,kh:()=>a});var r=n(7639),o=n(4598);function a(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}function i(e,t,n){void 0===t&&(t=o.W),void 0===n&&(n={});const r=a(e),i=r?.[t];if(!i&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return i}},1062:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(8848);function a(){return(0,r.useContext)(o.o)}},6494:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);const o=n(1712).A.canUseDOM?r.useLayoutEffect:r.useEffect},3512:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(3363);function a(){const e=r.useContext(o.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},1604:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=i}))}(e),t}},3363:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>a});var r=n(6540),o=n(4848);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:s,children:t})}},6457:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>g,XK:()=>v,g1:()=>b});var r=n(6540),o=n(9802),a=n(4598),i=n(6957),s=n(9900),l=n(4799),c=n(4848);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,s.Wf)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,s.Wf)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,s.Wf)(u(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function h(){const e=(0,o.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,s]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=h();return(0,c.jsx)(p.Provider,{value:n,children:t})}function g(e){let{children:t}=e;return(0,c.jsx)(m,{children:t})}function y(){const e=(0,r.useContext)(p);if(!e)throw new l.dV("DocsPreferredVersionContextProvider");return e}function b(e){void 0===e&&(e=a.W);const t=(0,o.ht)(e),[n,i]=y(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function v(){const e=(0,o.Gy)(),[t]=y();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},3718:(e,t,n)=>{"use strict";n.d(t,{k:()=>a,v:()=>i});var r=n(9802),o=n(6457);function a(e,t){return`docs-${e}-${t}`}function i(){const e=(0,r.Gy)(),t=(0,r.gk)(),n=(0,o.XK)();return[...Object.keys(e).map((function(r){const o=t?.activePlugin.pluginId===r?t.activeVersion:void 0,i=n[r],s=e[r].versions.find((e=>e.isLast));return a(r,(o??i??s).name)}))]}},40:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,t:()=>c});var r=n(6540),o=n(4799),a=n(4848);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(s.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(s);if(e===i)throw new o.dV("DocsSidebarProvider");return e}},5357:(e,t,n)=>{"use strict";n.d(t,{$S:()=>p,B5:()=>x,Nr:()=>f,OF:()=>w,QB:()=>k,Vd:()=>_,Y:()=>b,d1:()=>E,fW:()=>S,w8:()=>g});var r=n(6540),o=n(6347),a=n(2831),i=n(9802),s=n(260),l=n(5167),c=n(6457),u=n(1704),d=n(40);function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}function p(){const{pathname:e}=(0,o.zy)(),t=(0,d.t)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=v({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const h=(e,t)=>void 0!==e&&(0,s.ys)(e,t),m=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||m(e.items,t))}function y(e,t){switch(e.type){case"category":return g(e,t)||e.items.some((e=>y(e,t)));case"link":return!e.unlisted||g(e,t);default:return!0}}function b(e,t){return(0,r.useMemo)((()=>e.filter((e=>y(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,s.ys)(a.href,n)||e(a.items))||"link"===a.type&&(0,s.ys)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function w(){const e=(0,d.t)(),{pathname:t}=(0,o.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function _(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,c.g1)(e),o=(0,i.r7)(e);return(0,r.useMemo)((()=>(0,l.sb)([t,n,o].filter(Boolean))),[t,n,o])}function S(e,t){const n=_(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function k(e,t){const n=_(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,l.sb)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function x(e){let{route:t}=e;const n=(0,o.zy)(),r=(0,u.r)(),i=t.routes,s=i.find((e=>(0,o.B6)(n.pathname,e)));if(!s)return null;const l=s.sidebar,c=l?r.docsSidebars[l]:void 0;return{docElement:(0,a.v)(i),sidebarName:l,sidebarItems:c}}function E(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!f(e)))}},1704:(e,t,n)=>{"use strict";n.d(t,{n:()=>s,r:()=>l});var r=n(6540),o=n(4799),a=n(4848);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new o.dV("DocsVersionProvider");return e}},9802:(e,t,n)=>{"use strict";n.d(t,{d1:()=>l.d1,zK:()=>b,vT:()=>h,gk:()=>m,Gy:()=>f,$S:()=>l.$S,HW:()=>v,vF:()=>u.v,ht:()=>p,g1:()=>c.g1,r7:()=>y,jh:()=>g});var r=n(6347),o=n(6503);const a=e=>e.versions.find((e=>e.isLast));function i(e,t){return[...e.versions].sort(((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0)).find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}function s(e,t){const n=i(e,t),o=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}var l=n(5357),c=n(6457),u=n(3718);const d={},f=()=>(0,o.kh)("docusaurus-plugin-content-docs")??d,p=e=>{try{return(0,o.P_)("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function h(e){void 0===e&&(e={});const t=f(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function m(e){void 0===e&&(e={});const t=h(e),{pathname:n}=(0,r.zy)();if(!t)return;return{activePlugin:t,activeVersion:i(t.pluginData,n)}}function g(e){return p(e).versions}function y(e){const t=p(e);return a(t)}function b(e){const t=p(e),{pathname:n}=(0,r.zy)();return s(t,n)}function v(e){const t=p(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=a(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},5729:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(5947),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},4090:(e,t,n)=>{"use strict";var r=n(1765),o=n(4784);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(4023)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},5225:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(4164),o=n(3230),a=n(6957),i=n(4783),s=n(7344);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(4848);function u(e){let{as:t,id:n,...u}=e;const d=(0,s.A)(),{navbar:{hideOnScroll:f}}=(0,a.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const p=(0,o.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.A)("anchor",f?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":p,title:p,children:"\u200b"})]})}},716:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(4848);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},1297:(e,t,n)=>{"use strict";n.d(t,{A:()=>ui});var r=n(6540),o=n(4164),a=n(3832),i=n(6644),s=n(6347),l=n(3230),c=n(4067),u=n(4848);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,s.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const h=(0,l.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??h,{containerRef:n,onClick:r}=p();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":h,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(8630),y=n(9503);const b={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(m,{className:b.skipToContent})}var w=n(6957),_=n(2);function S(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const k={closeButton:"closeButton_CVFx"};function x(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.A)("clean-btn close",k.closeButton,e.className),children:(0,u.jsx)(S,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function O(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.A)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const j={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function P(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,_.M)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:j.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:j.announcementBarPlaceholder}),(0,u.jsx)(O,{className:j.announcementBarContent}),a&&(0,u.jsx)(x,{onClick:n,className:j.announcementBarClose})]})}var C=n(5755),A=n(4245);var T=n(4799),I=n(763);const N=r.createContext(null);function L(e){let{children:t}=e;const n=function(){const e=(0,C.M)(),t=(0,I.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,T.ZC)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(N.Provider,{value:n,children:t})}function R(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function D(){const e=(0,r.useContext)(N);if(!e)throw new T.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,I.YL)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:R(a)})),[o,a,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=D();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var M=n(7710),B=n(1062);function z(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function H(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,B.A)(),s=(0,l.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.A)(U.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.A)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite","aria-pressed":"dark"===r?"true":"false",children:[(0,u.jsx)(z,{className:(0,o.A)(U.toggleIcon,U.lightToggleIcon)}),(0,u.jsx)($,{className:(0,o.A)(U.toggleIcon,U.darkToggleIcon)})]})})}const V=r.memo(H),Q={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function W(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,M.G)();return r?null:(0,u.jsx)(V,{className:t,buttonClassName:"dark"===n?Q.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var q=n(20);function G(){return(0,u.jsx)(q.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,C.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(S,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(G,{}),(0,u.jsx)(W,{className:"margin-right--md"}),(0,u.jsx)(K,{})]})}var Z=n(4783),X=n(8180),J=n(877);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(716);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...c}=e;const d=(0,X.Ay)(r),f=(0,X.Ay)(t),p=(0,X.Ay)(o,{forcePrependBaseUrl:!0}),h=a&&o&&!(0,J.A)(o),m=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,h&&(0,u.jsx)(te.A,{...s&&{width:12,height:12}})]})};return o?(0,u.jsx)(Z.A,{href:l?p:o,...c,...m}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},...c,...m})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.A)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(4549),se=n(260),le=n(7639);const ce="dropdownNavbarItemMobile_S0Fm";function ue(e,t){return e.some((e=>function(e,t){return!!(0,se.ys)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...s}=e;const l=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,u.jsxs)("div",{ref:l,className:(0,o.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,o.A)("navbar__link",a),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Sa,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function fe(e){let{items:t,className:n,position:a,onClick:i,...l}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.A)(),{pathname:t}=(0,s.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:h}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&h(!d)}),[c,d,h]),(0,u.jsxs)("li",{className:(0,o.A)("menu__list-item",{"menu__list-item--collapsed":f}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.A)(ce,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),p()},children:l.children??l.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:f,children:t.map(((e,t)=>(0,r.createElement)(Sa,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function pe(e){let{mobile:t=!1,...n}=e;const r=t?fe:de;return(0,u.jsx)(r,{...n})}var he=n(2098);function me(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const ge="iconLanguage_nlXk";var ye=n(961);function be(e,t){var n=void 0;return function(){for(var r=arguments.length,o=new Array(r),a=0;a e.length)&&(t=e.length);for(var n=0,r=new Array(t);n e.length)&&(t=e.length);for(var n=0,r=new Array(t);n =0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r =0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function Ie(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 Ne(e){for(var t=1;t =3||2===n&&r>=4||1===n&&r>=10}(e);function n(n,r,o){if(t&&void 0!==o){var a=o[0].__autocomplete_algoliaCredentials,i={"X-Algolia-Application-Id":a.appId,"X-Algolia-API-Key":a.apiKey};e.apply(void 0,[n].concat(Ce(r),[{headers:i}]))}else e.apply(void 0,[n].concat(Ce(r)))}return{init:function(t,n){e("init",{appId:t,apiKey:n})},setAuthenticatedUserToken:function(t){e("setAuthenticatedUserToken",t)},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r 0&&n("clickedObjectIDsAfterSearch",Re(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r 0&&n("clickedObjectIDs",Re(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r 0&&e.apply(void 0,["clickedFilters"].concat(n))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r 0&&n("convertedObjectIDsAfterSearch",Re(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r 0&&n("convertedObjectIDs",Re(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r 0&&e.apply(void 0,["convertedFilters"].concat(n))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r 0&&t.reduce((function(e,t){var n=t.items,r=Te(t,je);return[].concat(Ce(e),Ce(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,n=[],r=0;r 0&&e.apply(void 0,["viewedFilters"].concat(n))}}}function Fe(e){var t=e.items.reduce((function(e,t){var n;return e[t.__autocomplete_indexName]=(null!==(n=e[t.__autocomplete_indexName])&&void 0!==n?n:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function Me(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function Be(e){return Be="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},Be(e)}function ze(e){return function(e){if(Array.isArray(e))return $e(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return $e(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return $e(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function $e(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n 0&&qe({onItemsChange:o,items:n,insights:c,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,n=e.onSelect,r=e.onActive;function o(e){t({algoliaInsightsPlugin:{__algoliaSearchParameters:He(He({},s?{clickAnalytics:!0}:{}),e?{userToken:Ye(e)}:{}),insights:c}})}l("addAlgoliaAgent","insights-plugin"),o(),l("onUserTokenChange",(function(e){o(e)})),l("getUserToken",null,(function(e,t){o(t)})),n((function(e){var t=e.item,n=e.state,r=e.event,o=e.source;Me(t)&&a({state:n,event:r,insights:c,item:t,insightsEvents:[He({eventName:"Item Selected"},ke({item:t,items:o.getItems().filter(Me)}))]})})),r((function(e){var t=e.item,n=e.source,r=e.state,o=e.event;Me(t)&&i({state:r,event:o,insights:c,item:t,insightsEvents:[He({eventName:"Item Active"},ke({item:t,items:n.getItems().filter(Me)}))]})}))},onStateChange:function(e){var t=e.state;d({state:t})},__autocomplete_pluginOptions:e}}function Ke(){var e,t=arguments.length>1?arguments[1]:void 0;return[].concat(ze(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]),["autocomplete-internal"],ze(null!==(e=t.algoliaInsightsPlugin)&&void 0!==e&&e.__automaticInsights?["autocomplete-automatic"]:[]))}function Ye(e){return"number"==typeof e?e.toString():e}function Ze(e){return Ze="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},Ze(e)}function Xe(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 Je(e,t,n){return(t=function(e){var t=function(e,t){if("object"!==Ze(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!==Ze(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===Ze(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function et(e,t,n){var r,o=t.initialState;return{getState:function(){return o},dispatch:function(r,a){var i=function(e){for(var t=1;t e.length)&&(t=e.length);for(var n=0,r=new Array(t);n 0},reshape:function(e){return e.sources}},e),{},{id:null!==(n=e.id)&&void 0!==n?n:lt(),plugins:o,initialState:yt({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var n;null===(n=e.onStateChange)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)}))},onSubmit:function(t){var n;null===(n=e.onSubmit)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)}))},onReset:function(t){var n;null===(n=e.onReset)||void 0===n||n.call(e,t),o.forEach((function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)}))},getSources:function(n){return Promise.all([].concat(ht(o.map((function(e){return e.getSources}))),[e.getSources]).filter(Boolean).map((function(e){return function(e,t){var n=[];return Promise.resolve(e(t)).then((function(e){return Array.isArray(e),Promise.all(e.filter((function(e){return Boolean(e)})).map((function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:Se,onResolve:Se};Object.keys(t).forEach((function(e){t[e].__default=!0}));var r=ut(ut({},t),e);return Promise.resolve(r)})))}))}(e,n)}))).then((function(e){return tt(e)})).then((function(e){return e.map((function(e){return yt(yt({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach((function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)}))},onActive:function(n){e.onActive(n),t.forEach((function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)}))},onResolve:function(n){e.onResolve(n),t.forEach((function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,n)}))}})}))}))},navigator:yt({navigate:function(e){var t=e.itemUrl;r.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,n=r.open(t,"_blank","noopener");null==n||n.focus()},navigateNewWindow:function(e){var t=e.itemUrl;r.open(t,"_blank","noopener")}},e.navigator)})}function wt(e){return wt="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},wt(e)}function _t(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 St(e){for(var t=1;t e.length)&&(t=e.length);for(var n=0,r=new Array(t);n =0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r =0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Qt,Wt,qt,Gt=null,Kt=(Qt=-1,Wt=-1,qt=void 0,function(e){var t=++Qt;return Promise.resolve(e).then((function(e){return qt&&t =0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r =0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var on=/((gt|sm)-|galaxy nexus)|samsung[- ]|samsungbrowser/i;function an(e){return e.nativeEvent||e}function sn(e){return sn="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},sn(e)}var ln=["props","refresh","store"],cn=["inputElement","formElement","panelElement"],un=["inputElement"],dn=["inputElement","maxLength"],fn=["source"],pn=["item","source"];function hn(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 mn(e){for(var t=1;t =0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r =0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function bn(e){var t=e.props,n=e.refresh,r=e.store,o=yn(e,ln);return{getEnvironmentProps:function(e){var n=e.inputElement,o=e.formElement,a=e.panelElement;function i(e){!r.getState().isOpen&&r.pendingRequests.isEmpty()||e.target===n||!1===[o,a].some((function(t){return n=t,r=e.target,n===r||n.contains(r);var n,r}))&&(r.dispatch("blur",null),t.debug||r.pendingRequests.cancelAll())}return mn({onTouchStart:i,onMouseDown:i,onTouchMove:function(e){!1!==r.getState().isOpen&&n===t.environment.document.activeElement&&e.target!==n&&n.blur()}},yn(e,cn))},getRootProps:function(e){return mn({role:"combobox","aria-expanded":r.getState().isOpen,"aria-haspopup":"listbox","aria-controls":r.getState().isOpen?r.getState().collections.map((function(e){var n=e.source;return Zt(t.id,"list",n)})).join(" "):void 0,"aria-labelledby":Zt(t.id,"label")},e)},getFormProps:function(e){e.inputElement;return mn({action:"",noValidate:!0,role:"search",onSubmit:function(a){var i;a.preventDefault(),t.onSubmit(mn({event:a,refresh:n,state:r.getState()},o)),r.dispatch("submit",null),null===(i=e.inputElement)||void 0===i||i.blur()},onReset:function(a){var i;a.preventDefault(),t.onReset(mn({event:a,refresh:n,state:r.getState()},o)),r.dispatch("reset",null),null===(i=e.inputElement)||void 0===i||i.focus()}},yn(e,un))},getLabelProps:function(e){return mn({htmlFor:Zt(t.id,"input"),id:Zt(t.id,"label")},e)},getInputProps:function(e){var a;function i(e){(t.openOnFocus||Boolean(r.getState().query))&&Yt(mn({event:e,props:t,query:r.getState().completion||r.getState().query,refresh:n,store:r},o)),r.dispatch("focus",null)}var s=e||{},l=(s.inputElement,s.maxLength),c=void 0===l?512:l,u=yn(s,dn),d=Mt(r.getState()),f=function(e){return Boolean(e&&e.match(on))}((null===(a=t.environment.navigator)||void 0===a?void 0:a.userAgent)||""),p=t.enterKeyHint||(null!=d&&d.itemUrl&&!f?"go":"search");return mn({"aria-autocomplete":"both","aria-activedescendant":r.getState().isOpen&&null!==r.getState().activeItemId?Zt(t.id,"item-".concat(r.getState().activeItemId),null==d?void 0:d.source):void 0,"aria-controls":r.getState().isOpen?r.getState().collections.map((function(e){var n=e.source;return Zt(t.id,"list",n)})).join(" "):void 0,"aria-labelledby":Zt(t.id,"label"),value:r.getState().completion||r.getState().query,id:Zt(t.id,"input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:p,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:c,type:"search",onChange:function(e){var a=e.currentTarget.value;t.ignoreCompositionEvents&&an(e).isComposing?o.setQuery(a):Yt(mn({event:e,props:t,query:a.slice(0,c),refresh:n,store:r},o))},onCompositionEnd:function(e){Yt(mn({event:e,props:t,query:e.currentTarget.value.slice(0,c),refresh:n,store:r},o))},onKeyDown:function(e){an(e).isComposing||function(e){var t=e.event,n=e.props,r=e.refresh,o=e.store,a=rn(e,Jt);if("ArrowUp"===t.key||"ArrowDown"===t.key){var i=function(){var e=Mt(o.getState()),t=n.environment.document.getElementById(Zt(n.id,"item-".concat(o.getState().activeItemId),null==e?void 0:e.source));t&&(t.scrollIntoViewIfNeeded?t.scrollIntoViewIfNeeded(!1):t.scrollIntoView(!1))},s=function(){var e=Mt(o.getState());if(null!==o.getState().activeItemId&&e){var n=e.item,i=e.itemInputValue,s=e.itemUrl,l=e.source;l.onActive(tn({event:t,item:n,itemInputValue:i,itemUrl:s,refresh:r,source:l,state:o.getState()},a))}};t.preventDefault(),!1===o.getState().isOpen&&(n.openOnFocus||Boolean(o.getState().query))?Yt(tn({event:t,props:n,query:o.getState().query,refresh:r,store:o},a)).then((function(){o.dispatch(t.key,{nextActiveItemId:n.defaultActiveItemId}),s(),setTimeout(i,0)})):(o.dispatch(t.key,{}),s(),i())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every((function(e){return 0===e.items.length})))return void(n.debug||o.pendingRequests.cancelAll());t.preventDefault();var l=Mt(o.getState()),c=l.item,u=l.itemInputValue,d=l.itemUrl,f=l.source;if(t.metaKey||t.ctrlKey)void 0!==d&&(f.onSelect(tn({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:f,state:o.getState()},a)),n.navigator.navigateNewTab({itemUrl:d,item:c,state:o.getState()}));else if(t.shiftKey)void 0!==d&&(f.onSelect(tn({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:f,state:o.getState()},a)),n.navigator.navigateNewWindow({itemUrl:d,item:c,state:o.getState()}));else if(t.altKey);else{if(void 0!==d)return f.onSelect(tn({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:f,state:o.getState()},a)),void n.navigator.navigate({itemUrl:d,item:c,state:o.getState()});Yt(tn({event:t,nextState:{isOpen:!1},props:n,query:u,refresh:r,store:o},a)).then((function(){f.onSelect(tn({event:t,item:c,itemInputValue:u,itemUrl:d,refresh:r,source:f,state:o.getState()},a))}))}}}(mn({event:e,props:t,refresh:n,store:r},o))},onFocus:i,onBlur:Se,onClick:function(n){e.inputElement!==t.environment.document.activeElement||r.getState().isOpen||i(n)}},u)},getPanelProps:function(e){return mn({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},e)},getListProps:function(e){var n=e||{},r=n.source,o=yn(n,fn);return mn({role:"listbox","aria-labelledby":Zt(t.id,"label"),id:Zt(t.id,"list",r)},o)},getItemProps:function(e){var a=e.item,i=e.source,s=yn(e,pn);return mn({id:Zt(t.id,"item-".concat(a.__autocomplete_id),i),role:"option","aria-selected":r.getState().activeItemId===a.__autocomplete_id,onMouseMove:function(e){if(a.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",a.__autocomplete_id);var t=Mt(r.getState());if(null!==r.getState().activeItemId&&t){var i=t.item,s=t.itemInputValue,l=t.itemUrl,c=t.source;c.onActive(mn({event:e,item:i,itemInputValue:s,itemUrl:l,refresh:n,source:c,state:r.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var s=i.getItemInputValue({item:a,state:r.getState()}),l=i.getItemUrl({item:a,state:r.getState()});(l?Promise.resolve():Yt(mn({event:e,nextState:{isOpen:!1},props:t,query:s,refresh:n,store:r},o))).then((function(){i.onSelect(mn({event:e,item:a,itemInputValue:s,itemUrl:l,refresh:n,source:i,state:r.getState()},o))}))}},s)}}}var vn="1.17.8",wn=[{segment:"autocomplete-core",version:vn}];function _n(e){return _n="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},_n(e)}function Sn(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 kn(e){for(var t=1;t =n?null===r?null:0:o}function Pn(e){return Pn="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},Pn(e)}function Cn(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 An(e){for(var t=1;t =5&&((o||!e&&5===r)&&(i.push(r,0,o,n),r=6),e&&(i.push(r,e,0,n),r=6)),o=""},l=0;l "===t?(r=1,o=""):o=t+o[0]:a?t===a?a="":o+=t:'"'===t||"'"===t?a=t:">"===t?(s(),r=1):r&&("="===t?(r=5,n=o,o=""):"/"===t&&(r<5||">"===e[l][c+1])?(s(),3===r&&(i=i[0]),r=i,(i=i[0]).push(2,0,r),r=0):" "===t||"\t"===t||"\n"===t||"\r"===t?(s(),r=2):o+=t),3===r&&"!--"===o&&(r=4,i=i[0])}return s(),i}(e)),t),arguments,[])).length>1?t:t[0]}var $n=function(e){var t=e.environment,n=t.document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("class","aa-SubmitIcon"),n.setAttribute("viewBox","0 0 24 24"),n.setAttribute("width","20"),n.setAttribute("height","20"),n.setAttribute("fill","currentColor");var r=t.document.createElementNS("http://www.w3.org/2000/svg","path");return r.setAttribute("d","M16.041 15.856c-0.034 0.026-0.067 0.055-0.099 0.087s-0.060 0.064-0.087 0.099c-1.258 1.213-2.969 1.958-4.855 1.958-1.933 0-3.682-0.782-4.95-2.050s-2.050-3.017-2.050-4.95 0.782-3.682 2.050-4.95 3.017-2.050 4.95-2.050 3.682 0.782 4.95 2.050 2.050 3.017 2.050 4.95c0 1.886-0.745 3.597-1.959 4.856zM21.707 20.293l-3.675-3.675c1.231-1.54 1.968-3.493 1.968-5.618 0-2.485-1.008-4.736-2.636-6.364s-3.879-2.636-6.364-2.636-4.736 1.008-6.364 2.636-2.636 3.879-2.636 6.364 1.008 4.736 2.636 6.364 3.879 2.636 6.364 2.636c2.125 0 4.078-0.737 5.618-1.968l3.675 3.675c0.391 0.391 1.024 0.391 1.414 0s0.391-1.024 0-1.414z"),n.appendChild(r),n},Un=function(e){var t=e.environment,n=t.document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("class","aa-ClearIcon"),n.setAttribute("viewBox","0 0 24 24"),n.setAttribute("width","18"),n.setAttribute("height","18"),n.setAttribute("fill","currentColor");var r=t.document.createElementNS("http://www.w3.org/2000/svg","path");return r.setAttribute("d","M5.293 6.707l5.293 5.293-5.293 5.293c-0.391 0.391-0.391 1.024 0 1.414s1.024 0.391 1.414 0l5.293-5.293 5.293 5.293c0.391 0.391 1.024 0.391 1.414 0s0.391-1.024 0-1.414l-5.293-5.293 5.293-5.293c0.391-0.391 0.391-1.024 0-1.414s-1.024-0.391-1.414 0l-5.293 5.293-5.293-5.293c-0.391-0.391-1.024-0.391-1.414 0s-0.391 1.024 0 1.414z"),n.appendChild(r),n},Hn=function(e){var t=e.environment.document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("class","aa-LoadingIcon"),t.setAttribute("viewBox","0 0 100 100"),t.setAttribute("width","20"),t.setAttribute("height","20"),t.innerHTML=' \n ',t},Vn=["ontouchstart","ontouchend","ontouchmove","ontouchcancel"];function Qn(e,t,n){e[t]=null===n?"":"number"!=typeof n?n:n+"px"}function Wn(e){this._listeners[e.type](e)}function qn(e,t,n){var r,o,a=e[t];if("style"===t)if("string"==typeof n)e.style=n;else if(null===n)e.style="";else for(t in n)a&&n[t]===a[t]||Qn(e.style,t,n[t]);else"o"===t[0]&&"n"===t[1]?(r=t!==(t=t.replace(/Capture$/,"")),((o=t.toLowerCase())in e||Vn.includes(o))&&(t=o),t=t.slice(2),e._listeners||(e._listeners={}),e._listeners[t]=n,n?a||e.addEventListener(t,Wn,r):e.removeEventListener(t,Wn,r)):"list"!==t&&"tagName"!==t&&"form"!==t&&"type"!==t&&"size"!==t&&"download"!==t&&"href"!==t&&t in e?e[t]=null==n?"":n:"function"!=typeof n&&"dangerouslySetInnerHTML"!==t&&(null==n||!1===n&&!/^ar/.test(t)?e.removeAttribute(t):e.setAttribute(t,n))}function Gn(e){switch(e){case"onChange":return"onInput";case"onCompositionEnd":return"oncompositionend";default:return e}}function Kn(e,t){for(var n in t)qn(e,Gn(n),t[n])}function Yn(e,t){for(var n in t)"o"===n[0]&&"n"===n[1]||qn(e,Gn(n),t[n])}var Zn=["children"];function Xn(e){return function(e){if(Array.isArray(e))return Jn(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return Jn(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Jn(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Jn(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n\n =0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r =0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function tr(e){return function(t,n){var r=n.children,o=void 0===r?[]:r,a=er(n,Zn),i=e.document.createElement(t);return Kn(i,a),i.append.apply(i,Xn(o)),i}}function nr(e){return nr="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},nr(e)}var rr=["autocompleteScopeApi","environment","classNames","getInputProps","getInputPropsCore","isDetached","state"];function or(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 ar(e){for(var t=1;t =0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r =0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function lr(e){return lr="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},lr(e)}function cr(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 ur(e){for(var t=1;t 2&&(i.children=arguments.length>3?pr.call(arguments,2):n),"function"==typeof e&&null!=e.defaultProps)for(a in e.defaultProps)void 0===i[a]&&(i[a]=e.defaultProps[a]);return Tr(e,i,r,o,null)}function Tr(e,t,n,r,o){var a={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:null==o?++mr:o,__i:-1,__u:0};return null==o&&null!=hr.vnode&&hr.vnode(a),a}function Ir(e){return e.children}function Nr(e,t){this.props=e,this.context=t}function Lr(e,t){if(null==t)return e.__?Lr(e.__,e.__i+1):null;for(var n;t t&&gr.sort(vr));Fr.__r=0}function Mr(e,t,n,r,o,a,i,s,l,c,u){var d,f,p,h,m,g,y=r&&r.__k||Er,b=t.length;for(l=Br(n,t,y,l,b),d=0;d0?Tr(i.type,i.props,i.key,i.ref?i.ref:null,i.__v):i).__=e,i.__b=e.__b+1,s=null,-1!==(c=i.__i=$r(i,n,l,d))&&(d--,(s=n[c])&&(s.__u|=2)),null==s||null===s.__v?(-1==c&&f--,"function"!=typeof i.type&&(i.__u|=4)):c!=l&&(c==l-1?f--:c==l+1?f++:(c>l?f--:f++,i.__u|=4))):e.__k[a]=null;if(d)for(a=0;a(null==l||2&l.__u?0:1))for(o=n-1,a=n+1;o>=0||a =0){if((l=t[o])&&!(2&l.__u)&&i==l.key&&s===l.type)return o;o--}if(a 0&&void 0!==arguments[0]?arguments[0]:[];return{get:function(){return e},add:function(t){var n=e[e.length-1];(null==n?void 0:n.isHighlighted)===t.isHighlighted?e[e.length-1]={value:n.value+t.value,isHighlighted:n.isHighlighted}:e.push(t)}}}(n?[{value:n,isHighlighted:!1}]:[]);return t.forEach((function(e){var t=e.split("__/aa-highlight__");r.add({value:t[0],isHighlighted:!0}),""!==t[1]&&r.add({value:t[1],isHighlighted:!1})})),r.get()}function eo(e){return function(e){if(Array.isArray(e))return to(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return to(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return to(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function to(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n ",""":'"',"'":"'"},ao=new RegExp(/\w/i),io=/&(amp|quot|lt|gt|#39);/g,so=RegExp(io.source);function lo(e,t){var n,r,o,a=e[t],i=(null===(n=e[t+1])||void 0===n?void 0:n.isHighlighted)||!0,s=(null===(r=e[t-1])||void 0===r?void 0:r.isHighlighted)||!0;return ao.test((o=a.value)&&so.test(o)?o.replace(io,(function(e){return oo[e]})):o)||s!==i?a.isHighlighted:s}function co(e){return co="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},co(e)}function uo(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 fo(e){for(var t=1;t e.length)&&(t=e.length);for(var n=0,r=new Array(t);n =0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r =0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Co={clearButton:"aa-ClearButton",detachedCancelButton:"aa-DetachedCancelButton",detachedContainer:"aa-DetachedContainer",detachedFormContainer:"aa-DetachedFormContainer",detachedOverlay:"aa-DetachedOverlay",detachedSearchButton:"aa-DetachedSearchButton",detachedSearchButtonIcon:"aa-DetachedSearchButtonIcon",detachedSearchButtonPlaceholder:"aa-DetachedSearchButtonPlaceholder",detachedSearchButtonQuery:"aa-DetachedSearchButtonQuery",form:"aa-Form",input:"aa-Input",inputWrapper:"aa-InputWrapper",inputWrapperPrefix:"aa-InputWrapperPrefix",inputWrapperSuffix:"aa-InputWrapperSuffix",item:"aa-Item",label:"aa-Label",list:"aa-List",loadingIndicator:"aa-LoadingIndicator",panel:"aa-Panel",panelLayout:"aa-PanelLayout aa-Panel--scrollable",root:"aa-Autocomplete",source:"aa-Source",sourceFooter:"aa-SourceFooter",sourceHeader:"aa-SourceHeader",sourceNoResults:"aa-SourceNoResults",submitButton:"aa-SubmitButton"},Ao=function(e,t){var n=e.children;(0,e.render)(n,t)},To={createElement:Ar,Fragment:Ir,render:Zr};function Io(e){var t=e.panelPlacement,n=e.container,r=e.form,o=e.environment,a=n.getBoundingClientRect(),i=(o.pageYOffset||o.document.documentElement.scrollTop||o.document.body.scrollTop||0)+a.top+a.height;switch(t){case"start":return{top:i,left:a.left};case"end":return{top:i,right:o.document.documentElement.clientWidth-(a.left+a.width)};case"full-width":return{top:i,left:0,right:0,width:"unset",maxWidth:"unset"};case"input-wrapper-width":var s=r.getBoundingClientRect();return{top:i,left:s.left,right:o.document.documentElement.clientWidth-(s.left+s.width),width:"unset",maxWidth:"unset"};default:throw new Error("[Autocomplete] The `panelPlacement` value ".concat(JSON.stringify(t)," is not valid."))}}function No(e){return No="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},No(e)}function Lo(){return Lo=Object.assign?Object.assign.bind():function(e){for(var t=1;t e.length)&&(t=e.length);for(var n=0,r=new Array(t);n e.length)&&(t=e.length);for(var n=0,r=new Array(t);n =0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r =0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function Jo(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 ea(e){for(var t=1;t 0;if(!f.value.core.openOnFocus&&!t.query)return n;var r=Boolean(c.current||f.value.renderer.renderNoResults);return!n&&r||n},__autocomplete_metadata:{userAgents:Mo,options:e}}))})),m=ve(ea({collections:[],completion:null,context:{},isOpen:!1,query:"",activeItemId:null,status:"idle"},f.value.core.initialState)),g={getEnvironmentProps:f.value.renderer.getEnvironmentProps,getFormProps:f.value.renderer.getFormProps,getInputProps:f.value.renderer.getInputProps,getItemProps:f.value.renderer.getItemProps,getLabelProps:f.value.renderer.getLabelProps,getListProps:f.value.renderer.getListProps,getPanelProps:f.value.renderer.getPanelProps,getRootProps:f.value.renderer.getRootProps},y={setActiveItemId:h.value.setActiveItemId,setQuery:h.value.setQuery,setCollections:h.value.setCollections,setIsOpen:h.value.setIsOpen,setStatus:h.value.setStatus,setContext:h.value.setContext,refresh:h.value.refresh,navigator:h.value.navigator},b=s((function(){return zn.bind(f.value.renderer.renderer.createElement)})),v=s((function(){return fr({autocomplete:h.value,autocompleteScopeApi:y,classNames:f.value.renderer.classNames,environment:f.value.core.environment,isDetached:p.value,placeholder:f.value.core.placeholder,propGetters:g,setIsModalOpen:k,state:m.current,translations:f.value.renderer.translations})}));function w(){Kn(v.value.panel,{style:p.value?{}:Io({panelPlacement:f.value.renderer.panelPlacement,container:v.value.root,form:v.value.form,environment:f.value.core.environment})})}function _(e){m.current=e;var t={autocomplete:h.value,autocompleteScopeApi:y,classNames:f.value.renderer.classNames,components:f.value.renderer.components,container:f.value.renderer.container,html:b.value,dom:v.value,panelContainer:p.value?v.value.detachedContainer:f.value.renderer.panelContainer,propGetters:g,state:m.current,renderer:f.value.renderer.renderer},n=!it(e)&&!c.current&&f.value.renderer.renderNoResults||f.value.renderer.render;!function(e){var t=e.autocomplete,n=e.autocompleteScopeApi,r=e.dom,o=e.propGetters,a=e.state;Yn(r.root,o.getRootProps(Do({state:a,props:t.getRootProps({})},n))),Yn(r.input,o.getInputProps(Do({state:a,props:t.getInputProps({inputElement:r.input}),inputElement:r.input},n))),Kn(r.label,{hidden:"stalled"===a.status}),Kn(r.loadingIndicator,{hidden:"stalled"!==a.status}),Kn(r.clearButton,{hidden:!a.query}),Kn(r.detachedSearchButtonQuery,{textContent:a.query}),Kn(r.detachedSearchButtonPlaceholder,{hidden:Boolean(a.query)})}(t),function(e,t){var n=t.autocomplete,r=t.autocompleteScopeApi,o=t.classNames,a=t.html,i=t.dom,s=t.panelContainer,l=t.propGetters,c=t.state,u=t.components,d=t.renderer;if(c.isOpen){s.contains(i.panel)||"loading"===c.status||s.appendChild(i.panel),i.panel.classList.toggle("aa-Panel--stalled","stalled"===c.status);var f=c.collections.filter((function(e){var t=e.source,n=e.items;return t.templates.noResults||n.length>0})).map((function(e,t){var i=e.source,s=e.items;return d.createElement("section",{key:t,className:o.source,"data-autocomplete-source-id":i.sourceId},i.templates.header&&d.createElement("div",{className:o.sourceHeader},i.templates.header({components:u,createElement:d.createElement,Fragment:d.Fragment,items:s,source:i,state:c,html:a})),i.templates.noResults&&0===s.length?d.createElement("div",{className:o.sourceNoResults},i.templates.noResults({components:u,createElement:d.createElement,Fragment:d.Fragment,source:i,state:c,html:a})):d.createElement("ul",Lo({className:o.list},l.getListProps(Do({state:c,props:n.getListProps({source:i})},r))),s.map((function(e){var t=n.getItemProps({item:e,source:i});return d.createElement("li",Lo({key:t.id,className:o.item},l.getItemProps(Do({state:c,props:t},r))),i.templates.item({components:u,createElement:d.createElement,Fragment:d.Fragment,item:e,state:c,html:a}))}))),i.templates.footer&&d.createElement("div",{className:o.sourceFooter},i.templates.footer({components:u,createElement:d.createElement,Fragment:d.Fragment,items:s,source:i,state:c,html:a})))})),p=d.createElement(d.Fragment,null,d.createElement("div",{className:o.panelLayout},f),d.createElement("div",{className:"aa-GradientBottom"})),h=f.reduce((function(e,t){return e[t.props["data-autocomplete-source-id"]]=t,e}),{});e(Do(Do({children:p,state:c,sections:f,elements:h},d),{},{components:u,html:a},r),i.panel)}else s.contains(i.panel)&&s.removeChild(i.panel)}(n,t)}function S(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};o();var t,n,r=f.value.renderer,i=r.components,s=Xo(r,Yo);u.current=Ho(s,f.value.core,{components:(t=i,n=function(e){return!e.value.hasOwnProperty("__autocomplete_componentName")},Object.entries(t).reduce((function(e,t){var r=Go(t,2),o=r[0],a=r[1];return n({key:o,value:a})?Wo(Wo({},e),{},qo({},o,a)):e}),{})),initialState:m.current},e),l(),a(),h.value.refresh().then((function(){_(m.current)}))}function k(e){e!==f.value.core.environment.document.body.contains(v.value.detachedOverlay)&&(e?(f.value.core.environment.document.body.appendChild(v.value.detachedOverlay),f.value.core.environment.document.body.classList.add("aa-Detached"),v.value.input.focus()):(f.value.core.environment.document.body.removeChild(v.value.detachedOverlay),f.value.core.environment.document.body.classList.remove("aa-Detached")))}return r((function(){var e=h.value.getEnvironmentProps({formElement:v.value.form,panelElement:v.value.panel,inputElement:v.value.input});return Kn(f.value.core.environment,e),function(){Kn(f.value.core.environment,Object.keys(e).reduce((function(e,t){return ea(ea({},e),{},ta({},t,void 0))}),{}))}})),r((function(){var e=p.value?f.value.core.environment.document.body:f.value.renderer.panelContainer,t=p.value?v.value.detachedOverlay:v.value.panel;return p.value&&m.current.isOpen&&k(!0),_(m.current),function(){e.contains(t)&&(e.removeChild(t),e.classList.remove("aa-Detached"))}})),r((function(){var e=f.value.renderer.container;return e.appendChild(v.value.root),function(){e.removeChild(v.value.root)}})),r((function(){var e=be((function(e){_(e.state)}),0);return d.current=function(t){var n=t.state,r=t.prevState;(p.value&&r.isOpen!==n.isOpen&&k(n.isOpen),p.value||!n.isOpen||r.isOpen||w(),n.query!==r.query)&&f.value.core.environment.document.querySelectorAll(".aa-Panel--scrollable").forEach((function(e){0!==e.scrollTop&&(e.scrollTop=0)}));e({state:n})},function(){d.current=void 0}})),r((function(){var e=be((function(){var e=p.value;p.value=f.value.core.environment.matchMedia(f.value.renderer.detachedMediaQuery).matches,e!==p.value?S({}):requestAnimationFrame(w)}),20);return f.value.core.environment.addEventListener("resize",e),function(){f.value.core.environment.removeEventListener("resize",e)}})),r((function(){if(!p.value)return function(){};function e(e){v.value.detachedContainer.classList.toggle("aa-DetachedContainer--modal",e)}function t(t){e(t.matches)}var n=f.value.core.environment.matchMedia(getComputedStyle(f.value.core.environment.document.documentElement).getPropertyValue("--aa-detached-modal-media-query"));e(n.matches);var r=Boolean(n.addEventListener);return r?n.addEventListener("change",t):n.addListener(t),function(){r?n.removeEventListener("change",t):n.removeListener(t)}})),r((function(){return requestAnimationFrame(w),function(){}})),ea(ea({},y),{},{update:S,destroy:function(){o()}})}var ra=n(1141);const oa=n(774),aa=oa;var ia=n(689),sa=n.n(ia);function la(){const e=(0,s.zy)(),t=(0,s.W6)(),{siteConfig:{baseUrl:n}}=(0,le.A)(),[o,a]=(0,r.useState)({terms:[],isDocsOrBlog:!1});return(0,r.useEffect)((()=>{if(!e.state?.cmfcmfhighlight||0===e.state.cmfcmfhighlight.terms.length)return;a(e.state.cmfcmfhighlight);const{cmfcmfhighlight:n,...r}=e.state;t.replace({...e,state:r})}),[e.state?.cmfcmfhighlight,t,e]),(0,r.useEffect)((()=>{if(0===o.terms.length)return;const e=o.isDocsOrBlog?document.getElementsByTagName("article")[0]:document.getElementsByTagName("main")[0];if(!e)return;const t=new(sa())(e),n={ignoreJoiners:!0};return t.mark(o.terms,n),()=>t.unmark(n)}),[o,n]),null}var ca=n(6503),ua=n(1482);function da(e){let{document:t}=e;const[n,r]=t.sectionRoute.split("#");let o=n;return r&&(o+="#"+r),o}const fa={documents:[],index:aa((function(){this.ref("id"),this.field("title"),this.field("content")}))};const pa=()=>{const e=(0,B.A)(),[t,o]=(0,r.useState)((()=>!!e&&"dark"===document.documentElement.getAttribute("data-theme")));(0,r.useEffect)((()=>{const e=new MutationObserver((()=>{o("dark"===document.documentElement.getAttribute("data-theme"))}));return e.observe(document.documentElement,{attributes:!0,attributeFilter:["data-theme"]}),()=>e.disconnect()}),[]);const{siteConfig:{baseUrl:a}}=(0,le.A)(),{titleBoost:i,contentBoost:c,tagsBoost:u,parentCategoriesBoost:d,indexDocSidebarParentCategories:f,maxSearchResults:p}=(0,ca.P_)("@cmfcmf/docusaurus-search-local"),h=(0,s.W6)(),{tags:m}=function(){const{i18n:e}=(0,le.A)(),t=n(9802).vF(),r=[ua.C,...t];return{locale:e.currentLocale,tags:r}}(),g=(0,r.useRef)(m);(0,r.useEffect)((()=>{g.current=m}),[m]);const y=(0,r.useRef)({}),b=async e=>{const t=y.current[e];switch(t?.state){case"ready":return t;case void 0:{const t=[];y.current[e]={state:"loading",callbacks:t};const n=await async function(e,t){{let r;try{const n=await fetch(`${e}search-index-${t}.json`);if(!n.ok)return fa;r=await n.json()}catch(n){return fa}return{documents:r.documents,index:aa.Index.load(r.index)}}}(a,e);return t.forEach((e=>e(n))),y.current[e]={state:"ready",...n}}case"loading":return new Promise((e=>{t.callbacks.push(e)}))}},v=(0,l.T)({message:"cmfcmf/d-s-l.searchBar.placeholder",description:"Placeholder shown in the searchbar"}),w=(0,r.useRef)(null),_=(0,r.useRef)(null);return(0,r.useEffect)((()=>{if(w.current)return _.current=na({container:w.current,placeholder:v,renderer:{createElement:r.createElement,Fragment:r.Fragment,render:ye.render},navigator:{navigate(e){let{item:t,itemUrl:n}=e;h.push(n,{cmfcmfhighlight:{terms:t.terms,isDocsOrBlog:"docs"===t.document.type||"blog"===t.document.type}})}},detachedMediaQuery:"",defaultActiveItemId:0,translations:{clearButtonTitle:(0,l.T)({message:"cmfcmf/d-s-l.searchBar.clearButtonTitle",description:"Title of the button to clear the current search input"}),detachedCancelButtonText:(0,l.T)({message:"cmfcmf/d-s-l.searchBar.detachedCancelButtonText",description:"Text of the button to close the detached search window"}),submitButtonTitle:(0,l.T)({message:"cmfcmf/d-s-l.searchBar.submitButtonTitle",description:"Title of the button to submit a new search"})},getSources(e){let{query:t}=e;return[{sourceId:"search-results",templates:{item(e){let{item:t}=e;const n=da(t);return r.createElement("a",{href:n,className:"aa-ItemLink",onClick:e=>{e.preventDefault(),h.push(n,{cmfcmfhighlight:{terms:t.terms,isDocsOrBlog:"docs"===t.document.type||"blog"===t.document.type}})}},r.createElement("div",{className:"aa-ItemContent"},r.createElement("div",{className:"aa-ItemContentBody"},r.createElement("div",{className:"aa-ItemContentTitle"},t.document.sectionTitle),t.document.pageTitle!==t.document.sectionTitle&&r.createElement("div",{className:"aa-ItemContentDescription"},t.document.pageTitle))),r.createElement("div",{className:"aa-ItemActions"},r.createElement("button",{className:"aa-ItemActionButton aa-DesktopOnly aa-ActiveOnly",type:"button",title:"Select"},r.createElement("svg",{viewBox:"0 0 24 24",width:"20",height:"20",fill:"currentColor"},r.createElement("path",{d:"M18.984 6.984h2.016v6h-15.188l3.609 3.609-1.406 1.406-6-6 6-6 1.406 1.406-3.609 3.609h13.172v-4.031z"})))))},noResults:()=>r.createElement("div",{className:"aa-ItemContent"},r.createElement("div",{className:"aa-ItemContentBody"},(0,l.T)({message:"cmfcmf/d-s-l.searchBar.noResults",description:"message shown if no results are found"})))},getItemUrl(e){let{item:t}=e;return da(t)},async getItems(){const e=g.current,n=await Promise.all(e.map((e=>b(e)))),r=(e=>oa.tokenizer(e).map((e=>e.str)))(t);return n.flatMap((e=>{let{index:t,documents:n}=e;return t.query((e=>{e.term(r,{fields:["title"],boost:i}),e.term(r,{fields:["title"],boost:i,wildcard:aa.Query.wildcard.TRAILING}),e.term(r,{fields:["content"],boost:c}),e.term(r,{fields:["content"],boost:c,wildcard:aa.Query.wildcard.TRAILING}),e.term(r,{fields:["tags"],boost:u}),e.term(r,{fields:["tags"],boost:u,wildcard:aa.Query.wildcard.TRAILING}),f&&(e.term(r,{fields:["sidebarParentCategories"],boost:d}),e.term(r,{fields:["sidebarParentCategories"],boost:d,wildcard:aa.Query.wildcard.TRAILING}))})).slice(0,p).map((e=>({document:n.find((t=>t.id.toString()===e.ref)),score:e.score,terms:r})))})).sort(((e,t)=>t.score-e.score)).slice(0,p)}}]}}),()=>_.current?.destroy()}),[p]),r.createElement(r.Fragment,null,r.createElement(ra.A,null,r.createElement("body",{"data-theme":t?"dark":"light"})),r.createElement(la,null),r.createElement("div",{className:"dsla-search-wrapper"},r.createElement("div",{className:"dsla-search-field",ref:w,"data-tags":m.join(",")})))},ha={navbarSearchContainer:"navbarSearchContainer_Bca1"};function ma(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.A)(n,ha.navbarSearchContainer),children:t})}var ga=n(9802),ya=n(5357);var ba=n(6457);function va(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find((t=>t.id===e.mainDocId))}(e)}const wa={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.A)(),f=(0,he.o)(),{search:p,hash:h}=(0,s.zy)(),m=[...n,...c.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${h}${o}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],g=t?(0,l.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(pe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(me,{className:ge}),g]}),items:m})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(ma,{className:n,children:(0,u.jsx)(pa,{})})},dropdown:pe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.A)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,ga.zK)(r),i=(0,ya.QB)(t,r),s=a?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>s||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,ga.zK)(r),i=(0,ya.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,ya.Vd)(r)[0],i=t??a.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,s.zy)(),f=(0,ga.zK)(n),p=(0,ga.jh)(n),{savePreferredVersionName:h}=(0,ba.g1)(n),m=[...o,...p.map((function(e){const t=va(e,f);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===f.activeVersion,onClick:()=>h(e.name)}})),...a],g=(0,ya.Vd)(n)[0],y=t&&m.length>1?(0,l.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,b=t&&m.length>1?void 0:va(g,f).path;return m.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:y,to:b,isActive:r?()=>!1:void 0}):(0,u.jsx)(pe,{...i,mobile:t,label:y,to:b,items:m,isActive:r?()=>!1:void 0})}},_a=wa;function Sa(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=_a[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function ka(){const e=(0,C.M)(),t=(0,w.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Sa,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function xa(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Ea(){const e=0===(0,w.p)().navbar.items.length,t=D();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(xa,{onClick:()=>t.hide()}),t.content]})}function Oa(){const e=(0,C.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(F,{header:(0,u.jsx)(Y,{}),primaryMenu:(0,u.jsx)(ka,{}),secondaryMenu:(0,u.jsx)(Ea,{})}):null}const ja={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Pa(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.A)("navbar-sidebar__backdrop",e.className)})}function Ca(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,w.p)(),i=(0,C.M)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,A.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i =s?n(!1):i+c {if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,l.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.A)("navbar","navbar--fixed-top",n&&[ja.navbarHideable,!d&&ja.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Pa,{onClick:i.toggle}),(0,u.jsx)(Oa,{})]})}var Aa=n(4609);const Ta={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function Ia(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function Na(e){let{error:t}=e;const n=(0,Aa.rA)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:Ta.errorBoundaryError,children:n})}class La extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Ra="right";function Da(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function Fa(){const{toggle:e,shown:t}=(0,C.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(Da,{})})}const Ma={colorModeToggle:"colorModeToggle_DEke"};function Ba(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(La,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(Sa,{...e})},t)))})}function za(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function $a(){const e=(0,C.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??Ra)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return(0,u.jsx)(za,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(Fa,{}),(0,u.jsx)(G,{}),(0,u.jsx)(Ba,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Ba,{items:r}),(0,u.jsx)(W,{className:Ma.colorModeToggle}),!o&&(0,u.jsx)(ma,{children:(0,u.jsx)(pa,{})})]})})}function Ua(){return(0,u.jsx)(Ca,{children:(0,u.jsx)($a,{})})}function Ha(e){let{item:t}=e;const{to:n,href:r,label:o,prependBaseUrlToHref:a,...i}=t,s=(0,X.Ay)(n),l=(0,X.Ay)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Z.A,{className:"footer__link-item",...r?{href:a?l:r}:{to:s},...i,children:[o,r&&!(0,J.A)(r)&&(0,u.jsx)(te.A,{})]})}function Va(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(Ha,{item:t})},t.href??t.to)}function Qa(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(Va,{item:e},t)))})]})}function Wa(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(Qa,{column:e},t)))})}function qa(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Ga(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(Ha,{item:t})}function Ka(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(Ga,{item:e}),t.length!==n+1&&(0,u.jsx)(qa,{})]},n)))})})}function Ya(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(Wa,{columns:t}):(0,u.jsx)(Ka,{links:t})}var Za=n(975);const Xa="footerLogoLink_BH7S";function Ja(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.hH)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(Za.A,{className:(0,o.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function ei(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:Xa,target:t.target,children:(0,u.jsx)(Ja,{logo:t})}):(0,u.jsx)(Ja,{logo:t})}function ti(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function ni(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,u.jsx)("footer",{className:(0,o.A)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function ri(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(ni,{style:o,links:n&&n.length>0&&(0,u.jsx)(Ya,{links:n}),logo:r&&(0,u.jsx)(ei,{logo:r}),copyright:t&&(0,u.jsx)(ti,{copyright:t})})}const oi=r.memo(ri),ai=(0,T.fM)([M.a,_.o,A.Tv,ba.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(I.y_,{children:(0,u.jsx)(C.e,{children:(0,u.jsx)(L,{children:t})})})}]);function ii(e){let{children:t}=e;return(0,u.jsx)(ai,{children:t})}var si=n(5225);function li(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(si.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(Ia,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(Na,{error:t})})]})})})}const ci={mainWrapper:"mainWrapper_z2l0"};function ui(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,y.J)(),(0,u.jsxs)(ii,{children:[(0,u.jsx)(i.be,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(P,{}),(0,u.jsx)(Ua,{}),(0,u.jsx)("div",{id:d,className:(0,o.A)(g.G.wrapper.main,ci.mainWrapper,r),children:(0,u.jsx)(a.A,{fallback:e=>(0,u.jsx)(li,{...e}),children:t})}),!n&&(0,u.jsx)(oi,{})]})}},20:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(6540);var r=n(4783),o=n(8180),a=n(7639),i=n(6957),s=n(975),l=n(4848);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.Ay)(t.src),dark:(0,o.Ay)(t.srcDark||t.src)},i=(0,l.jsx)(s.A,{className:t.className,sources:a,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,a.A)(),{navbar:{title:n,logo:s}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...f}=e,p=(0,o.Ay)(s?.href||"/"),h=n?"":t,m=s?.alt??h;return(0,l.jsxs)(r.A,{to:p,...f,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(c,{logo:s,alt:m,imageClassName:u}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},1210:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(1141),o=n(4848);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.A,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},975:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(6540),o=n(4164),a=n(1062),i=n(7710);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(4848);function c(e){let{className:t,children:n}=e;const c=(0,a.A)(),{colorMode:u}=(0,i.G)();return(0,l.jsx)(l.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.A)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,l.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},4549:(e,t,n)=>{"use strict";n.d(t,{N:()=>y,u:()=>c});var r=n(6540),o=n(1712),a=n(6494),i=n(6350),s=n(4848);const l="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function f(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){let{collapsibleRef:t,collapsed:n,animation:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return f(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,o])}function h(e){if(!o.A.canUseDOM)return e?u:d}function m(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:l,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return p({collapsibleRef:u,collapsed:n,animation:a}),(0,s.jsx)(t,{ref:u,style:c?void 0:h(n),onTransitionEnd:e=>{"height"===e.propertyName&&(f(u.current,n),i?.(n))},className:l,children:o})}function g(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[l,c]=(0,r.useState)(t);return(0,a.A)((()=>{t||i(!0)}),[t]),(0,a.A)((()=>{o&&c(t)}),[o,t]),o?(0,s.jsx)(m,{...n,collapsed:l}):null}function y(e){let{lazy:t,...n}=e;const r=t?g:m;return(0,s.jsx)(r,{...n})}},2:(e,t,n)=>{"use strict";n.d(t,{M:()=>m,o:()=>h});var r=n(6540),o=n(1062),a=n(9900),i=n(4799),s=n(6957),l=n(4848);const c=(0,a.Wf)("docusaurus.announcement.dismiss"),u=(0,a.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),f=e=>c.set(String(e)),p=r.createContext(null);function h(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.p)(),t=(0,o.A)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{f(!0),a(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&f(!1),!r&&d()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(p.Provider,{value:n,children:t})}function m(){const e=(0,r.useContext)(p);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},7710:(e,t,n)=>{"use strict";n.d(t,{G:()=>y,a:()=>g});var r=n(6540),o=n(1712),a=n(4799),i=n(9900),s=n(6957),l=n(4848);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),f={light:"light",dark:"dark"},p=e=>e===f.dark?f.dark:f.light,h=e=>o.A.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),m=e=>{d.set(p(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.p)(),[o,a]=(0,r.useState)(h(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:o=!0}=r;t?(a(t),o&&m(t)):(a(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f.dark:f.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:i,get isDarkTheme(){return o===f.dark},setLightTheme(){i(f.light)},setDarkTheme(){i(f.dark)}})),[o,i])}();return(0,l.jsx)(c.Provider,{value:n,children:t})}function y(){const e=(0,r.useContext)(c);if(null==e)throw new a.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},5755:(e,t,n)=>{"use strict";n.d(t,{e:()=>p,M:()=>h});var r=n(6540),o=n(763),a=n(2216),i=n(6347),s=n(4799);function l(e){!function(e){const t=(0,i.W6)(),n=(0,s._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var c=n(6957),u=n(4848);const d=r.createContext(void 0);function f(){const e=function(){const e=(0,o.YL)(),{items:t}=(0,c.p)().navbar;return 0===t.length&&!e.component}(),t=(0,a.l)(),n=!e&&"mobile"===t,[i,s]=(0,r.useState)(!1);l((()=>{if(i)return s(!1),!1}));const u=(0,r.useCallback)((()=>{s((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&s(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:i})),[e,n,u,i])}function p(e){let{children:t}=e;const n=f();return(0,u.jsx)(d.Provider,{value:n,children:t})}function h(){const e=r.useContext(d);if(void 0===e)throw new s.dV("NavbarMobileSidebarProvider");return e}},763:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>l,y_:()=>s});var r=n(6540),o=n(4799),a=n(4848);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new o.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.dV("NavbarSecondaryMenuContentProvider");const[,s]=a,l=(0,o.Be)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},9503:(e,t,n)=>{"use strict";n.d(t,{w:()=>o,J:()=>a});var r=n(6540);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},2216:(e,t,n)=>{"use strict";n.d(t,{l:()=>s});var r=n(6540),o=n(1712);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,s]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){s(function(e){if(!o.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},8630:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},6350:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},5167:(e,t,n)=>{"use strict";function r(e){return Array.from(new Set(e))}function o(e,t){const n={};let r=0;for(const o of e){const e=t(o,r);n[e]??=[],n[e].push(o),r+=1}return n}n.d(t,{$z:()=>o,sb:()=>r})},6644:(e,t,n)=>{"use strict";n.d(t,{e3:()=>f,be:()=>u,Jx:()=>p});var r=n(6540),o=n(4164),a=n(1141),i=n(3512),s=n(8180),l=n(7639);var c=n(4848);function u(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const u=function(e){const{siteConfig:t}=(0,l.A)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.hH)(),f=o?d(o,{absolute:!0}):void 0;return(0,c.jsxs)(a.A,{children:[t&&(0,c.jsx)("title",{children:u}),t&&(0,c.jsx)("meta",{property:"og:title",content:u}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),f&&(0,c.jsx)("meta",{property:"og:image",content:f}),f&&(0,c.jsx)("meta",{name:"twitter:image",content:f}),i]})}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),s=(0,o.A)(i,t);return(0,c.jsxs)(d.Provider,{value:s,children:[(0,c.jsx)(a.A,{children:(0,c.jsx)("html",{className:s})}),n]})}function p(e){let{children:t}=e;const n=(0,i.A)(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const a=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(f,{className:(0,o.A)(r,a),children:t})}},4799:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>s,_q:()=>i,dV:()=>l,fM:()=>u});var r=n(6540),o=n(6494),a=n(4848);function i(e){const t=(0,r.useRef)(e);return(0,o.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,o.A)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(? \w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},260:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>s,ys:()=>i});var r=n(6540),o=n(2413),a=n(7639);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,a.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.A,baseUrl:e})),[e])}},4245:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>f,Tv:()=>c,gk:()=>p});var r=n(6540),o=n(1712),a=n(1062),i=(n(6494),n(4799)),s=n(4848);const l=r.createContext(void 0);function c(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,s.jsx)(l.Provider,{value:n,children:t})}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.dV("ScrollControllerProvider");return e}const d=()=>o.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),o=(0,r.useRef)(d()),a=(0,i._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function p(){const e=(0,r.useRef)(null),t=(0,a.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&o t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},1482:(e,t,n)=>{"use strict";n.d(t,{C:()=>r});const r="default"},9900:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>c});n(6540);const r=JSON.parse('{"N":"localStorage","M":""}'),o=r.N;function a(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function i(e){if(void 0===e&&(e=o),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,s||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),s=!0),null}var t}let s=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(e,t){const n=`${e}${r.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const o=i(t?.persistence);return null===o?l:{get:()=>{try{return o.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=o.getItem(n);o.setItem(n,e),a({key:n,oldValue:t,newValue:e,storage:o})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=o.getItem(n);o.removeItem(n),a({key:n,oldValue:e,newValue:null,storage:o})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===o&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}},2098:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(7639),o=n(6347),a=n(4609);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.A)(),{pathname:l}=(0,o.zy)(),c=(0,a.Ks)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},4067:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(6540),o=n(6347),a=n(4799);function i(e){const t=(0,o.zy)(),n=(0,a.ZC)(t),i=(0,a._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6957:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(7639);function o(){return(0,r.A)().siteConfig.themeConfig}},4356:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=o,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),s="/"===i||i===r?i:(l=i,c=n,c?o(l):a(l));var l,c;return e.replace(i,s)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a;const r=n(835);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}},8274:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},4609:(e,t,n)=>{"use strict";t.rA=t.Ks=t.LU=void 0;const r=n(1635);t.LU="__blog-post-container";var o=n(4356);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(o).default}});var a=n(835);var i=n(8274);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},835:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},1513:(e,t,n)=>{"use strict";n.d(t,{zR:()=>w,TM:()=>O,yJ:()=>p,sC:()=>P,AO:()=>f});var r=n(8168);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r =0;f--){var p=i[f];"."===p?a(i,f):".."===p?(a(i,f),d++):d&&(a(i,f),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var h=i.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};var s=n(1561);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function p(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.A)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function h(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r t?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=p(e,t,m(),w.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t {"use strict";var r=n(4363),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(h){var o=p(n);o&&o!==h&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),m=l(n),g=0;g {"use strict";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},4634:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},689:function(e){e.exports=function(){"use strict";var e="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},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n 1&&void 0!==arguments[1])||arguments[1],o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=o,this.iframesTimeout=a}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach((function(t){var n=e.filter((function(e){return e.contains(t)})).length>0;-1!==e.indexOf(t)||n||e.push(t)})),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var o=e.contentWindow;if(r=o.document,!o||!r)throw new Error("iframe inaccessible")}catch(a){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,o=!1,a=null,i=function i(){if(!o){o=!0,clearTimeout(a);try{r.isIframeBlank(e)||(e.removeEventListener("load",i),r.getIframeContents(e,t,n))}catch(s){n()}}};e.addEventListener("load",i),a=setTimeout(i,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(r){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,(function(){return!0}),(function(e){r++,n.waitForIframes(e.querySelector("html"),(function(){--r||t()}))}),(function(e){e||t()}))}},{key:"forEachIframe",value:function(t,n,r){var o=this,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},i=t.querySelectorAll("iframe"),s=i.length,l=0;i=Array.prototype.slice.call(i);var c=function(){--s<=0&&a(l)};s||c(),i.forEach((function(t){e.matches(t,o.exclude)?c():o.onIframeReady(t,(function(e){n(t)&&(l++,r(e)),c()}),c)}))}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:(null===t||e.nextNode())&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var o=!1,a=!1;return r.forEach((function(e,t){e.val===n&&(o=t,a=e.handled)})),this.compareNodeIframe(e,t,n)?(!1!==o||a?!1===o||a||(r[o].handled=!0):r.push({val:n,handled:!0}),!0):(!1===o&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var o=this;e.forEach((function(e){e.handled||o.getIframeContents(e.val,(function(e){o.createInstanceOnIframe(e).forEachNode(t,n,r)}))}))}},{key:"iterateThroughNodes",value:function(e,t,n,r,o){for(var a=this,i=this.createIterator(t,e,r),s=[],l=[],c=void 0,u=void 0,d=function(){var e=a.getIteratorNode(i);return u=e.prevNode,c=e.node};d();)this.iframes&&this.forEachIframe(t,(function(e){return a.checkIframeFilter(c,u,e,s)}),(function(t){a.createInstanceOnIframe(t).forEachNode(e,(function(e){return l.push(e)}),r)})),l.push(c);l.forEach((function(e){n(e)})),this.iframes&&this.handleOpenIframes(s,e,n,r),o()}},{key:"forEachNode",value:function(e,t,n){var r=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=this.getContexts(),i=a.length;i||o(),a.forEach((function(a){var s=function(){r.iterateThroughNodes(e,a,t,n,(function(){--i<=0&&o()}))};r.iframes?r.waitForIframes(a,s):s()}))}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var o=!1;return n.every((function(t){return!r.call(e,t)||(o=!0,!1)})),o}return!1}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createRegExp",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e)}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var o in t)if(t.hasOwnProperty(o)){var a=t[o],i="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(a):this.escapeStr(a);""!==i&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(i)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynomyms(i)+"|"+this.processSynomyms(s)+")"+r))}return e}},{key:"processSynomyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,(function(e){return"\\"===e.charAt(0)?"?":"\x01"}))).replace(/(?:\\)*\*/g,(function(e){return"\\"===e.charAt(0)?"*":"\x02"}))}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,(function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"}))}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105","A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010d","C\xc7\u0106\u010c","d\u0111\u010f","D\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119","E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012b","I\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142","L\u0141","n\xf1\u0148\u0144","N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014d","O\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159","R\u0158","s\u0161\u015b\u0219\u015f","S\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163","T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016b","U\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xff","Y\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017a","Z\u017d\u017b\u0179"]:["a\xe0\xe1\u1ea3\xe3\u1ea1\u0103\u1eb1\u1eaf\u1eb3\u1eb5\u1eb7\xe2\u1ea7\u1ea5\u1ea9\u1eab\u1ead\xe4\xe5\u0101\u0105A\xc0\xc1\u1ea2\xc3\u1ea0\u0102\u1eb0\u1eae\u1eb2\u1eb4\u1eb6\xc2\u1ea6\u1ea4\u1ea8\u1eaa\u1eac\xc4\xc5\u0100\u0104","c\xe7\u0107\u010dC\xc7\u0106\u010c","d\u0111\u010fD\u0110\u010e","e\xe8\xe9\u1ebb\u1ebd\u1eb9\xea\u1ec1\u1ebf\u1ec3\u1ec5\u1ec7\xeb\u011b\u0113\u0119E\xc8\xc9\u1eba\u1ebc\u1eb8\xca\u1ec0\u1ebe\u1ec2\u1ec4\u1ec6\xcb\u011a\u0112\u0118","i\xec\xed\u1ec9\u0129\u1ecb\xee\xef\u012bI\xcc\xcd\u1ec8\u0128\u1eca\xce\xcf\u012a","l\u0142L\u0141","n\xf1\u0148\u0144N\xd1\u0147\u0143","o\xf2\xf3\u1ecf\xf5\u1ecd\xf4\u1ed3\u1ed1\u1ed5\u1ed7\u1ed9\u01a1\u1edf\u1ee1\u1edb\u1edd\u1ee3\xf6\xf8\u014dO\xd2\xd3\u1ece\xd5\u1ecc\xd4\u1ed2\u1ed0\u1ed4\u1ed6\u1ed8\u01a0\u1ede\u1ee0\u1eda\u1edc\u1ee2\xd6\xd8\u014c","r\u0159R\u0158","s\u0161\u015b\u0219\u015fS\u0160\u015a\u0218\u015e","t\u0165\u021b\u0163T\u0164\u021a\u0162","u\xf9\xfa\u1ee7\u0169\u1ee5\u01b0\u1eeb\u1ee9\u1eed\u1eef\u1ef1\xfb\xfc\u016f\u016bU\xd9\xda\u1ee6\u0168\u1ee4\u01af\u1eea\u1ee8\u1eec\u1eee\u1ef0\xdb\xdc\u016e\u016a","y\xfd\u1ef3\u1ef7\u1ef9\u1ef5\xffY\xdd\u1ef2\u1ef6\u1ef8\u1ef4\u0178","z\u017e\u017c\u017aZ\u017d\u017b\u0179"],r=[];return e.split("").forEach((function(o){n.every((function(n){if(-1!==n.indexOf(o)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0}))})),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\xa1\xbf",r=this.opt.accuracy,o="string"==typeof r?r:r.value,a="string"==typeof r?[]:r.limiters,i="";switch(a.forEach((function(e){i+="|"+t.escapeStr(e)})),o){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr(n)))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach((function(e){t.opt.separateWordSearch?e.split(" ").forEach((function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)})):e.trim()&&-1===n.indexOf(e)&&n.push(e)})),{keywords:n.sort((function(e,t){return t.length-e.length})),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort((function(e,t){return e.start-t.start})).forEach((function(e){var o=t.callNoMatchOnInvalidRanges(e,r),a=o.start,i=o.end;o.valid&&(e.start=a,e.length=i-a,n.push(e),r=i)})),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,o=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?o=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:o}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,o=!0,a=n.length,i=t-a,s=parseInt(e.start,10)-i;return(r=(s=s>a?a:s)+parseInt(e.length,10))>a&&(r=a,this.log("End range automatically set to the max value of "+a)),s<0||r-s<0||s>a||r>a?(o=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(o=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:o}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,(function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})}),(function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT}),(function(){e({value:n,nodes:r})}))}},{key:"matchesExclude",value:function(e){return o.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",o=e.splitText(t),a=o.splitText(n-t),i=document.createElement(r);return i.setAttribute("data-markjs","true"),this.opt.className&&i.setAttribute("class",this.opt.className),i.textContent=o.textContent,o.parentNode.replaceChild(i,o),a}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,o){var a=this;e.nodes.every((function(i,s){var l=e.nodes[s+1];if(void 0===l||l.start>t){if(!r(i.node))return!1;var c=t-i.start,u=(n>i.end?i.end:n)-i.start,d=e.value.substr(0,i.start),f=e.value.substr(u+i.start);if(i.node=a.wrapRangeInTextNode(i.node,c,u),e.value=d+f,e.nodes.forEach((function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=u),e.nodes[n].end-=u)})),n-=u,o(i.node.previousSibling,i.start),!(n>i.end))return!1;t=i.end}return!0}))}},{key:"wrapMatches",value:function(e,t,n,r,o){var a=this,i=0===t?0:t+1;this.getTextNodes((function(t){t.nodes.forEach((function(t){t=t.node;for(var o=void 0;null!==(o=e.exec(t.textContent))&&""!==o[i];)if(n(o[i],t)){var s=o.index;if(0!==i)for(var l=1;l{"use strict";n.r(t)},8252:(e,t,n)=>{"use strict";n.r(t)},5947:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:' '};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){l(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&p(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=f(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},7022:()=>{!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var o=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],a=r.variable[1].inside,i=0;i {!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(s){for(var l=0;l =a.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],f="string"==typeof c?c:c.content,p=t(r,u),h=f.indexOf(p);if(h>-1){++o;var m=f.substring(0,h),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),y=f.substring(h+p.length),b=[];m&&b.push.apply(b,i([m])),b.push(g),y&&b.push.apply(b,i([y])),"string"==typeof c?s.splice.apply(s,[l,1].concat(b)):c.content=b}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},1648:()=>{!function(e){e.languages.ruby=e.languages.extend("clike",{comment:{pattern:/#.*|^=begin\s[\s\S]*?^=end/m,greedy:!0},"class-name":{pattern:/(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,operator:/\.{2,3}|&\.|===|=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,punctuation:/[(){}[\].,;]/}),e.languages.insertBefore("ruby","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}});var t={pattern:/((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,lookbehind:!0,inside:{content:{pattern:/^(#\{)[\s\S]+(?=\}$)/,lookbehind:!0,inside:e.languages.ruby},delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"}}};delete e.languages.ruby.function;var n="(?:"+[/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source].join("|")+")",r=/(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;e.languages.insertBefore("ruby","keyword",{"regex-literal":[{pattern:RegExp(/%r/.source+n+/[egimnosux]{0,6}/.source),greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}},{pattern:/(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,lookbehind:!0,greedy:!0,inside:{interpolation:t,regex:/[\s\S]+/}}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:[{pattern:RegExp(/(^|[^:]):/.source+r),lookbehind:!0,greedy:!0},{pattern:RegExp(/([\r\n{(,][ \t]*)/.source+r+/(?=:(?!:))/.source),lookbehind:!0,greedy:!0}],"method-definition":{pattern:/(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,lookbehind:!0,inside:{function:/\b\w+$/,keyword:/^self\b/,"class-name":/^\w+/,punctuation:/\./}}}),e.languages.insertBefore("ruby","string",{"string-literal":[{pattern:RegExp(/%[qQiIwWs]?/.source+n),greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?/}},interpolation:t,string:/[\s\S]+/}},{pattern:/<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,alias:"heredoc-string",greedy:!0,inside:{delimiter:{pattern:/^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,inside:{symbol:/\b\w+/,punctuation:/^<<[-~]?'|'$/}},string:/[\s\S]+/}}],"command-literal":[{pattern:RegExp(/%x/.source+n),greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}},{pattern:/`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,greedy:!0,inside:{interpolation:t,command:{pattern:/[\s\S]+/,alias:"string"}}}]}),delete e.languages.ruby.string,e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,constant:/\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/}),e.languages.rb=e.languages.ruby}(Prism)},4023:(e,t,n)=>{var r={"./prism-bash":7022,"./prism-ruby":1648};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=4023},2694:(e,t,n)=>{"use strict";var r=n(6925);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},5556:(e,t,n)=>{e.exports=n(2694)()},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},2551:(e,t,n)=>{"use strict";var r=n(6540),o=n(9982);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n t}return!1}(t,n,o,r)&&(n=null),r||null===o?function(e){return!!d.call(h,e)||!d.call(p,e)&&(f.test(e)?h[e]=!0:(p[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):o.mustUseProperty?e[o.propertyName]=null===n?3!==o.type&&"":n:(t=o.attributeName,r=o.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(o=o.type)||4===o&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(y,b);g[t]=new m(t,1,!1,e,null,!1,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(y,b);g[t]=new m(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(y,b);g[t]=new m(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)})),["tabIndex","crossOrigin"].forEach((function(e){g[e]=new m(e,1,!1,e.toLowerCase(),null,!1,!1)})),g.xlinkHref=new m("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach((function(e){g[e]=new m(e,1,!1,e.toLowerCase(),null,!0,!0)}));var w=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,_=Symbol.for("react.element"),S=Symbol.for("react.portal"),k=Symbol.for("react.fragment"),x=Symbol.for("react.strict_mode"),E=Symbol.for("react.profiler"),O=Symbol.for("react.provider"),j=Symbol.for("react.context"),P=Symbol.for("react.forward_ref"),C=Symbol.for("react.suspense"),A=Symbol.for("react.suspense_list"),T=Symbol.for("react.memo"),I=Symbol.for("react.lazy");Symbol.for("react.scope"),Symbol.for("react.debug_trace_mode");var N=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden"),Symbol.for("react.cache"),Symbol.for("react.tracing_marker");var L=Symbol.iterator;function R(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=L&&e[L]||e["@@iterator"])?e:null}var D,F=Object.assign;function M(e){if(void 0===D)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);D=t&&t[1]||""}return"\n"+D+e}var B=!1;function z(e,t){if(!e||B)return"";B=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(t,[])}catch(c){var r=c}Reflect.construct(e,[],t)}else{try{t.call()}catch(c){r=c}e.call(t.prototype)}else{try{throw Error()}catch(c){r=c}e()}}catch(c){if(c&&r&&"string"==typeof c.stack){for(var o=c.stack.split("\n"),a=r.stack.split("\n"),i=o.length-1,s=a.length-1;1<=i&&0<=s&&o[i]!==a[s];)s--;for(;1<=i&&0<=s;i--,s--)if(o[i]!==a[s]){if(1!==i||1!==s)do{if(i--,0>--s||o[i]!==a[s]){var l="\n"+o[i].replace(" at new "," at ");return e.displayName&&l.includes(" ")&&(l=l.replace(" ",e.displayName)),l}}while(1<=i&&0<=s);break}}}finally{B=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?M(e):""}function $(e){switch(e.tag){case 5:return M(e.type);case 16:return M("Lazy");case 13:return M("Suspense");case 19:return M("SuspenseList");case 0:case 2:case 15:return e=z(e.type,!1);case 11:return e=z(e.type.render,!1);case 1:return e=z(e.type,!0);default:return""}}function U(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case k:return"Fragment";case S:return"Portal";case E:return"Profiler";case x:return"StrictMode";case C:return"Suspense";case A:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case j:return(e.displayName||"Context")+".Consumer";case O:return(e._context.displayName||"Context")+".Provider";case P:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case T:return null!==(t=e.displayName||null)?t:U(e.type)||"Memo";case I:t=e._payload,e=e._init;try{return U(e(t))}catch(n){}}return null}function H(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=(e=t.render).displayName||e.name||"",t.displayName||(""!==e?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return U(t);case 8:return t===x?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"==typeof t)return t.displayName||t.name||null;if("string"==typeof t)return t}return null}function V(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function Q(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function W(e){e._valueTracker||(e._valueTracker=function(e){var t=Q(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var o=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=""+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function q(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Q(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function G(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function K(e,t){var n=t.checked;return F({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function Y(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=V(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function Z(e,t){null!=(t=t.checked)&&v(e,"checked",t,!1)}function X(e,t){Z(e,t);var n=V(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?ee(e,t.type,n):t.hasOwnProperty("defaultValue")&&ee(e,t.type,V(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function J(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function ee(e,t,n){"number"===t&&G(e.ownerDocument)===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var te=Array.isArray;function ne(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o "+t.valueOf().toString()+"",t=ce.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}},"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(e,t,n,r){MSApp.execUnsafeLocalFunction((function(){return ue(e,t)}))}:ue);function fe(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var pe={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},he=["Webkit","ms","Moz","O"];function me(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||pe.hasOwnProperty(e)&&pe[e]?(""+t).trim():t+"px"}function ge(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=me(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}Object.keys(pe).forEach((function(e){he.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),pe[t]=pe[e]}))}));var ye=F({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function be(e,t){if(t){if(ye[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(a(137,e));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(a(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(a(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(a(62))}}function ve(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var we=null;function _e(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Se=null,ke=null,xe=null;function Ee(e){if(e=wo(e)){if("function"!=typeof Se)throw Error(a(280));var t=e.stateNode;t&&(t=So(t),Se(e.stateNode,e.type,t))}}function Oe(e){ke?xe?xe.push(e):xe=[e]:ke=e}function je(){if(ke){var e=ke,t=xe;if(xe=ke=null,Ee(e),t)for(e=0;e >>=0,0===e?32:31-(st(e)/lt|0)|0},st=Math.log,lt=Math.LN2;var ct=64,ut=4194304;function dt(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194240&e;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return 130023424&e;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ft(e,t){var n=e.pendingLanes;if(0===n)return 0;var r=0,o=e.suspendedLanes,a=e.pingedLanes,i=268435455&n;if(0!==i){var s=i&~o;0!==s?r=dt(s):0!==(a&=i)&&(r=dt(a))}else 0!==(i=n&~o)?r=dt(i):0!==a&&(r=dt(a));if(0===r)return 0;if(0!==t&&t!==r&&!(t&o)&&((o=r&-r)>=(a=t&-t)||16===o&&4194240&a))return t;if(4&r&&(r|=16&n),0!==(t=e.entangledLanes))for(e=e.entanglements,t&=r;0 n;n++)t.push(e);return t}function yt(e,t,n){e.pendingLanes|=t,536870912!==t&&(e.suspendedLanes=0,e.pingedLanes=0),(e=e.eventTimes)[t=31-it(t)]=n}function bt(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-it(n),o=1< =Rn),Mn=String.fromCharCode(32),Bn=!1;function zn(e,t){switch(e){case"keyup":return-1!==Nn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function $n(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var Un=!1;var Hn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Vn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Hn[e.type]:"textarea"===t}function Qn(e,t,n,r){Oe(r),0<(t=Wr(t,"onChange")).length&&(n=new un("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Wn=null,qn=null;function Gn(e){Mr(e,0)}function Kn(e){if(q(_o(e)))return e}function Yn(e,t){if("change"===e)return t}var Zn=!1;if(u){var Xn;if(u){var Jn="oninput"in document;if(!Jn){var er=document.createElement("div");er.setAttribute("oninput","return;"),Jn="function"==typeof er.oninput}Xn=Jn}else Xn=!1;Zn=Xn&&(!document.documentMode||9 =t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=cr(r)}}function dr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?dr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function fr(){for(var e=window,t=G();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=G((e=t.contentWindow).document)}return t}function pr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}function hr(e){var t=fr(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&dr(n.ownerDocument.documentElement,n)){if(null!==r&&pr(n))if(t=r.start,void 0===(e=r.end)&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if((e=(t=n.ownerDocument||document)&&t.defaultView||window).getSelection){e=e.getSelection();var o=n.textContent.length,a=Math.min(r.start,o);r=void 0===r.end?a:Math.min(r.end,o),!e.extend&&a>r&&(o=r,r=a,a=o),o=ur(n,a);var i=ur(n,r);o&&i&&(1!==e.rangeCount||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&((t=t.createRange()).setStart(o.node,o.offset),e.removeAllRanges(),a>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.offset),e.addRange(t)))}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for("function"==typeof n.focus&&n.focus(),n=0;n =document.documentMode,gr=null,yr=null,br=null,vr=!1;function wr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;vr||null==gr||gr!==G(r)||("selectionStart"in(r=gr)&&pr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},br&&lr(br,r)||(br=r,0<(r=Wr(yr,"onSelect")).length&&(t=new un("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=gr)))}function _r(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var Sr={animationend:_r("Animation","AnimationEnd"),animationiteration:_r("Animation","AnimationIteration"),animationstart:_r("Animation","AnimationStart"),transitionend:_r("Transition","TransitionEnd")},kr={},xr={};function Er(e){if(kr[e])return kr[e];if(!Sr[e])return e;var t,n=Sr[e];for(t in n)if(n.hasOwnProperty(t)&&t in xr)return kr[e]=n[t];return e}u&&(xr=document.createElement("div").style,"AnimationEvent"in window||(delete Sr.animationend.animation,delete Sr.animationiteration.animation,delete Sr.animationstart.animation),"TransitionEvent"in window||delete Sr.transitionend.transition);var Or=Er("animationend"),jr=Er("animationiteration"),Pr=Er("animationstart"),Cr=Er("transitionend"),Ar=new Map,Tr="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Ir(e,t){Ar.set(e,t),l(t,[e])}for(var Nr=0;Nr xo||(e.current=ko[xo],ko[xo]=null,xo--)}function jo(e,t){xo++,ko[xo]=e.current,e.current=t}var Po={},Co=Eo(Po),Ao=Eo(!1),To=Po;function Io(e,t){var n=e.type.contextTypes;if(!n)return Po;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o,a={};for(o in n)a[o]=t[o];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=a),a}function No(e){return null!=(e=e.childContextTypes)}function Lo(){Oo(Ao),Oo(Co)}function Ro(e,t,n){if(Co.current!==Po)throw Error(a(168));jo(Co,t),jo(Ao,n)}function Do(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var o in r=r.getChildContext())if(!(o in t))throw Error(a(108,H(e)||"Unknown",o));return F({},n,r)}function Fo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Po,To=Co.current,jo(Co,e),jo(Ao,Ao.current),!0}function Mo(e,t,n){var r=e.stateNode;if(!r)throw Error(a(169));n?(e=Do(e,t,To),r.__reactInternalMemoizedMergedChildContext=e,Oo(Ao),Oo(Co),jo(Co,e)):Oo(Ao),jo(Ao,n)}var Bo=null,zo=!1,$o=!1;function Uo(e){null===Bo?Bo=[e]:Bo.push(e)}function Ho(){if(!$o&&null!==Bo){$o=!0;var e=0,t=vt;try{var n=Bo;for(vt=1;e >=i,o-=i,Zo=1<<32-it(t)+o|n< m?(g=d,d=null):g=d.sibling;var y=p(o,d,s[m],l);if(null===y){null===d&&(d=g);break}e&&d&&null===y.alternate&&t(o,d),a=i(y,a,m),null===u?c=y:u.sibling=y,u=y,d=g}if(m===s.length)return n(o,d),aa&&Jo(o,m),c;if(null===d){for(;m g?(y=m,m=null):y=m.sibling;var v=p(o,m,b.value,c);if(null===v){null===m&&(m=y);break}e&&m&&null===v.alternate&&t(o,m),s=i(v,s,g),null===d?u=v:d.sibling=v,d=v,m=y}if(b.done)return n(o,m),aa&&Jo(o,g),u;if(null===m){for(;!b.done;g++,b=l.next())null!==(b=f(o,b.value,c))&&(s=i(b,s,g),null===d?u=b:d.sibling=b,d=b);return aa&&Jo(o,g),u}for(m=r(o,m);!b.done;g++,b=l.next())null!==(b=h(m,o,g,b.value,c))&&(e&&null!==b.alternate&&m.delete(null===b.key?g:b.key),s=i(b,s,g),null===d?u=b:d.sibling=b,d=b);return e&&m.forEach((function(e){return t(o,e)})),aa&&Jo(o,g),u}return function e(r,a,i,l){if("object"==typeof i&&null!==i&&i.type===k&&null===i.key&&(i=i.props.children),"object"==typeof i&&null!==i){switch(i.$$typeof){case _:e:{for(var c=i.key,u=a;null!==u;){if(u.key===c){if((c=i.type)===k){if(7===u.tag){n(r,u.sibling),(a=o(u,i.props.children)).return=r,r=a;break e}}else if(u.elementType===c||"object"==typeof c&&null!==c&&c.$$typeof===I&&va(c)===u.type){n(r,u.sibling),(a=o(u,i.props)).ref=ya(r,u,i),a.return=r,r=a;break e}n(r,u);break}t(r,u),u=u.sibling}i.type===k?((a=Rc(i.props.children,r.mode,l,i.key)).return=r,r=a):((l=Lc(i.type,i.key,i.props,null,r.mode,l)).ref=ya(r,a,i),l.return=r,r=l)}return s(r);case S:e:{for(u=i.key;null!==a;){if(a.key===u){if(4===a.tag&&a.stateNode.containerInfo===i.containerInfo&&a.stateNode.implementation===i.implementation){n(r,a.sibling),(a=o(a,i.children||[])).return=r,r=a;break e}n(r,a);break}t(r,a),a=a.sibling}(a=Mc(i,r.mode,l)).return=r,r=a}return s(r);case I:return e(r,a,(u=i._init)(i._payload),l)}if(te(i))return m(r,a,i,l);if(R(i))return g(r,a,i,l);ba(r,i)}return"string"==typeof i&&""!==i||"number"==typeof i?(i=""+i,null!==a&&6===a.tag?(n(r,a.sibling),(a=o(a,i)).return=r,r=a):(n(r,a),(a=Fc(i,r.mode,l)).return=r,r=a),s(r)):n(r,a)}}var _a=wa(!0),Sa=wa(!1),ka=Eo(null),xa=null,Ea=null,Oa=null;function ja(){Oa=Ea=xa=null}function Pa(e){var t=ka.current;Oo(ka),e._currentValue=t}function Ca(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function Aa(e,t){xa=e,Oa=Ea=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(!!(e.lanes&t)&&(vs=!0),e.firstContext=null)}function Ta(e){var t=e._currentValue;if(Oa!==e)if(e={context:e,memoizedValue:t,next:null},null===Ea){if(null===xa)throw Error(a(308));Ea=e,xa.dependencies={lanes:0,firstContext:e}}else Ea=Ea.next=e;return t}var Ia=null;function Na(e){null===Ia?Ia=[e]:Ia.push(e)}function La(e,t,n,r){var o=t.interleaved;return null===o?(n.next=n,Na(t)):(n.next=o.next,o.next=n),t.interleaved=n,Ra(e,r)}function Ra(e,t){e.lanes|=t;var n=e.alternate;for(null!==n&&(n.lanes|=t),n=e,e=e.return;null!==e;)e.childLanes|=t,null!==(n=e.alternate)&&(n.childLanes|=t),n=e,e=e.return;return 3===n.tag?n.stateNode:null}var Da=!1;function Fa(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Ma(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Ba(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function za(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,2&Pl){var o=r.pending;return null===o?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Ra(e,n)}return null===(o=r.interleaved)?(t.next=t,Na(r)):(t.next=o.next,o.next=t),r.interleaved=t,Ra(e,n)}function $a(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,4194240&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,bt(e,n)}}function Ua(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var o=null,a=null;if(null!==(n=n.firstBaseUpdate)){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};null===a?o=a=i:a=a.next=i,n=n.next}while(null!==n);null===a?o=a=t:a=a.next=t}else o=a=t;return n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:a,shared:r.shared,effects:r.effects},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function Ha(e,t,n,r){var o=e.updateQueue;Da=!1;var a=o.firstBaseUpdate,i=o.lastBaseUpdate,s=o.shared.pending;if(null!==s){o.shared.pending=null;var l=s,c=l.next;l.next=null,null===i?a=c:i.next=c,i=l;var u=e.alternate;null!==u&&((s=(u=u.updateQueue).lastBaseUpdate)!==i&&(null===s?u.firstBaseUpdate=c:s.next=c,u.lastBaseUpdate=l))}if(null!==a){var d=o.baseState;for(i=0,u=c=l=null,s=a;;){var f=s.lane,p=s.eventTime;if((r&f)===f){null!==u&&(u=u.next={eventTime:p,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});e:{var h=e,m=s;switch(f=t,p=n,m.tag){case 1:if("function"==typeof(h=m.payload)){d=h.call(p,d,f);break e}d=h;break e;case 3:h.flags=-65537&h.flags|128;case 0:if(null==(f="function"==typeof(h=m.payload)?h.call(p,d,f):h))break e;d=F({},d,f);break e;case 2:Da=!0}}null!==s.callback&&0!==s.lane&&(e.flags|=64,null===(f=o.effects)?o.effects=[s]:f.push(s))}else p={eventTime:p,lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},null===u?(c=u=p,l=d):u=u.next=p,i|=f;if(null===(s=s.next)){if(null===(s=o.shared.pending))break;s=(f=s).next,f.next=null,o.lastBaseUpdate=f,o.shared.pending=null}}if(null===u&&(l=d),o.baseState=l,o.firstBaseUpdate=c,o.lastBaseUpdate=u,null!==(t=o.shared.interleaved)){o=t;do{i|=o.lane,o=o.next}while(o!==t)}else null===a&&(o.shared.lanes=0);Dl|=i,e.lanes=i,e.memoizedState=d}}function Va(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t n?n:4,e(!0);var r=ai.transition;ai.transition={};try{e(!1),t()}finally{vt=n,ai.transition=r}}function Wi(){return vi().memoizedState}function qi(e,t,n){var r=tc(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Ki(e))Yi(t,n);else if(null!==(n=La(e,t,n,r))){nc(n,e,r,ec()),Zi(n,t,r)}}function Gi(e,t,n){var r=tc(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ki(e))Yi(t,o);else{var a=e.alternate;if(0===e.lanes&&(null===a||0===a.lanes)&&null!==(a=t.lastRenderedReducer))try{var i=t.lastRenderedState,s=a(i,n);if(o.hasEagerState=!0,o.eagerState=s,sr(s,i)){var l=t.interleaved;return null===l?(o.next=o,Na(t)):(o.next=l.next,l.next=o),void(t.interleaved=o)}}catch(c){}null!==(n=La(e,t,o,r))&&(nc(n,e,r,o=ec()),Zi(n,t,r))}}function Ki(e){var t=e.alternate;return e===si||null!==t&&t===si}function Yi(e,t){di=ui=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Zi(e,t,n){if(4194240&n){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,bt(e,n)}}var Xi={readContext:Ta,useCallback:hi,useContext:hi,useEffect:hi,useImperativeHandle:hi,useInsertionEffect:hi,useLayoutEffect:hi,useMemo:hi,useReducer:hi,useRef:hi,useState:hi,useDebugValue:hi,useDeferredValue:hi,useTransition:hi,useMutableSource:hi,useSyncExternalStore:hi,useId:hi,unstable_isNewReconciler:!1},Ji={readContext:Ta,useCallback:function(e,t){return bi().memoizedState=[e,void 0===t?null:t],e},useContext:Ta,useEffect:Ri,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,Ni(4194308,4,Bi.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Ni(4194308,4,e,t)},useInsertionEffect:function(e,t){return Ni(4,2,e,t)},useMemo:function(e,t){var n=bi();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=bi();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=qi.bind(null,si,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},bi().memoizedState=e},useState:Ai,useDebugValue:$i,useDeferredValue:function(e){return bi().memoizedState=e},useTransition:function(){var e=Ai(!1),t=e[0];return e=Qi.bind(null,e[1]),bi().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=si,o=bi();if(aa){if(void 0===n)throw Error(a(407));n=n()}else{if(n=t(),null===Cl)throw Error(a(349));30&ii||Ei(r,t,n)}o.memoizedState=n;var i={value:n,getSnapshot:t};return o.queue=i,Ri(ji.bind(null,r,i,e),[e]),r.flags|=2048,Ti(9,Oi.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=bi(),t=Cl.identifierPrefix;if(aa){var n=Xo;t=":"+t+"R"+(n=(Zo&~(1<<32-it(Zo)-1)).toString(32)+n),0<(n=fi++)&&(t+="H"+n.toString(32)),t+=":"}else t=":"+t+"r"+(n=pi++).toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},es={readContext:Ta,useCallback:Ui,useContext:Ta,useEffect:Di,useImperativeHandle:zi,useInsertionEffect:Fi,useLayoutEffect:Mi,useMemo:Hi,useReducer:_i,useRef:Ii,useState:function(){return _i(wi)},useDebugValue:$i,useDeferredValue:function(e){return Vi(vi(),li.memoizedState,e)},useTransition:function(){return[_i(wi)[0],vi().memoizedState]},useMutableSource:ki,useSyncExternalStore:xi,useId:Wi,unstable_isNewReconciler:!1},ts={readContext:Ta,useCallback:Ui,useContext:Ta,useEffect:Di,useImperativeHandle:zi,useInsertionEffect:Fi,useLayoutEffect:Mi,useMemo:Hi,useReducer:Si,useRef:Ii,useState:function(){return Si(wi)},useDebugValue:$i,useDeferredValue:function(e){var t=vi();return null===li?t.memoizedState=e:Vi(t,li.memoizedState,e)},useTransition:function(){return[Si(wi)[0],vi().memoizedState]},useMutableSource:ki,useSyncExternalStore:xi,useId:Wi,unstable_isNewReconciler:!1};function ns(e,t){if(e&&e.defaultProps){for(var n in t=F({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}return t}function rs(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:F({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var os={isMounted:function(e){return!!(e=e._reactInternals)&&Ue(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=ec(),o=tc(e),a=Ba(r,o);a.payload=t,null!=n&&(a.callback=n),null!==(t=za(e,a,o))&&(nc(t,e,o,r),$a(t,e,o))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=ec(),o=tc(e),a=Ba(r,o);a.tag=1,a.payload=t,null!=n&&(a.callback=n),null!==(t=za(e,a,o))&&(nc(t,e,o,r),$a(t,e,o))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=ec(),r=tc(e),o=Ba(n,r);o.tag=2,null!=t&&(o.callback=t),null!==(t=za(e,o,r))&&(nc(t,e,r,n),$a(t,e,r))}};function as(e,t,n,r,o,a,i){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,i):!t.prototype||!t.prototype.isPureReactComponent||(!lr(n,r)||!lr(o,a))}function is(e,t,n){var r=!1,o=Po,a=t.contextType;return"object"==typeof a&&null!==a?a=Ta(a):(o=No(t)?To:Co.current,a=(r=null!=(r=t.contextTypes))?Io(e,o):Po),t=new t(n,a),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=os,e.stateNode=t,t._reactInternals=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=o,e.__reactInternalMemoizedMaskedChildContext=a),t}function ss(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&os.enqueueReplaceState(t,t.state,null)}function ls(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs={},Fa(e);var a=t.contextType;"object"==typeof a&&null!==a?o.context=Ta(a):(a=No(t)?To:Co.current,o.context=Io(e,a)),o.state=e.memoizedState,"function"==typeof(a=t.getDerivedStateFromProps)&&(rs(e,t,a,n),o.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof o.getSnapshotBeforeUpdate||"function"!=typeof o.UNSAFE_componentWillMount&&"function"!=typeof o.componentWillMount||(t=o.state,"function"==typeof o.componentWillMount&&o.componentWillMount(),"function"==typeof o.UNSAFE_componentWillMount&&o.UNSAFE_componentWillMount(),t!==o.state&&os.enqueueReplaceState(o,o.state,null),Ha(e,n,o,r),o.state=e.memoizedState),"function"==typeof o.componentDidMount&&(e.flags|=4194308)}function cs(e,t){try{var n="",r=t;do{n+=$(r),r=r.return}while(r);var o=n}catch(a){o="\nError generating stack: "+a.message+"\n"+a.stack}return{value:e,source:t,stack:o,digest:null}}function us(e,t,n){return{value:e,source:null,stack:null!=n?n:null,digest:null!=t?t:null}}function ds(e,t){try{console.error(t.value)}catch(n){setTimeout((function(){throw n}))}}var fs="function"==typeof WeakMap?WeakMap:Map;function ps(e,t,n){(n=Ba(-1,n)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Vl||(Vl=!0,Ql=r),ds(0,t)},n}function hs(e,t,n){(n=Ba(-1,n)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var o=t.value;n.payload=function(){return r(o)},n.callback=function(){ds(0,t)}}var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(n.callback=function(){ds(0,t),"function"!=typeof r&&(null===Wl?Wl=new Set([this]):Wl.add(this));var e=t.stack;this.componentDidCatch(t.value,{componentStack:null!==e?e:""})}),n}function ms(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new fs;var o=new Set;r.set(t,o)}else void 0===(o=r.get(t))&&(o=new Set,r.set(t,o));o.has(n)||(o.add(n),e=Ec.bind(null,e,t,n),t.then(e,e))}function gs(e){do{var t;if((t=13===e.tag)&&(t=null===(t=e.memoizedState)||null!==t.dehydrated),t)return e;e=e.return}while(null!==e);return null}function ys(e,t,n,r,o){return 1&e.mode?(e.flags|=65536,e.lanes=o,e):(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,1===n.tag&&(null===n.alternate?n.tag=17:((t=Ba(-1,1)).tag=2,za(n,t,1))),n.lanes|=1),e)}var bs=w.ReactCurrentOwner,vs=!1;function ws(e,t,n,r){t.child=null===e?Sa(t,null,n,r):_a(t,e.child,n,r)}function _s(e,t,n,r,o){n=n.render;var a=t.ref;return Aa(t,o),r=gi(e,t,n,r,a,o),n=yi(),null===e||vs?(aa&&n&&ta(t),t.flags|=1,ws(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Vs(e,t,o))}function Ss(e,t,n,r,o){if(null===e){var a=n.type;return"function"!=typeof a||Ic(a)||void 0!==a.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Lc(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,ks(e,t,a,r,o))}if(a=e.child,!(e.lanes&o)){var i=a.memoizedProps;if((n=null!==(n=n.compare)?n:lr)(i,r)&&e.ref===t.ref)return Vs(e,t,o)}return t.flags|=1,(e=Nc(a,r)).ref=t.ref,e.return=t,t.child=e}function ks(e,t,n,r,o){if(null!==e){var a=e.memoizedProps;if(lr(a,r)&&e.ref===t.ref){if(vs=!1,t.pendingProps=r=a,!(e.lanes&o))return t.lanes=e.lanes,Vs(e,t,o);131072&e.flags&&(vs=!0)}}return Os(e,t,n,r,o)}function xs(e,t,n){var r=t.pendingProps,o=r.children,a=null!==e?e.memoizedState:null;if("hidden"===r.mode)if(1&t.mode){if(!(1073741824&n))return e=null!==a?a.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,jo(Nl,Il),Il|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=null!==a?a.baseLanes:n,jo(Nl,Il),Il|=r}else t.memoizedState={baseLanes:0,cachePool:null,transitions:null},jo(Nl,Il),Il|=n;else null!==a?(r=a.baseLanes|n,t.memoizedState=null):r=n,jo(Nl,Il),Il|=r;return ws(e,t,o,n),t.child}function Es(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function Os(e,t,n,r,o){var a=No(n)?To:Co.current;return a=Io(t,a),Aa(t,o),n=gi(e,t,n,r,a,o),r=yi(),null===e||vs?(aa&&r&&ta(t),t.flags|=1,ws(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~o,Vs(e,t,o))}function js(e,t,n,r,o){if(No(n)){var a=!0;Fo(t)}else a=!1;if(Aa(t,o),null===t.stateNode)Hs(e,t),is(t,n,r),ls(t,n,r,o),r=!0;else if(null===e){var i=t.stateNode,s=t.memoizedProps;i.props=s;var l=i.context,c=n.contextType;"object"==typeof c&&null!==c?c=Ta(c):c=Io(t,c=No(n)?To:Co.current);var u=n.getDerivedStateFromProps,d="function"==typeof u||"function"==typeof i.getSnapshotBeforeUpdate;d||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==r||l!==c)&&ss(t,i,r,c),Da=!1;var f=t.memoizedState;i.state=f,Ha(t,r,i,o),l=t.memoizedState,s!==r||f!==l||Ao.current||Da?("function"==typeof u&&(rs(t,n,u,r),l=t.memoizedState),(s=Da||as(t,n,s,r,f,l,c))?(d||"function"!=typeof i.UNSAFE_componentWillMount&&"function"!=typeof i.componentWillMount||("function"==typeof i.componentWillMount&&i.componentWillMount(),"function"==typeof i.UNSAFE_componentWillMount&&i.UNSAFE_componentWillMount()),"function"==typeof i.componentDidMount&&(t.flags|=4194308)):("function"==typeof i.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=l),i.props=r,i.state=l,i.context=c,r=s):("function"==typeof i.componentDidMount&&(t.flags|=4194308),r=!1)}else{i=t.stateNode,Ma(e,t),s=t.memoizedProps,c=t.type===t.elementType?s:ns(t.type,s),i.props=c,d=t.pendingProps,f=i.context,"object"==typeof(l=n.contextType)&&null!==l?l=Ta(l):l=Io(t,l=No(n)?To:Co.current);var p=n.getDerivedStateFromProps;(u="function"==typeof p||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(s!==d||f!==l)&&ss(t,i,r,l),Da=!1,f=t.memoizedState,i.state=f,Ha(t,r,i,o);var h=t.memoizedState;s!==d||f!==h||Ao.current||Da?("function"==typeof p&&(rs(t,n,p,r),h=t.memoizedState),(c=Da||as(t,n,c,r,f,h,l)||!1)?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(r,h,l),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(r,h,l)),"function"==typeof i.componentDidUpdate&&(t.flags|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=h),i.props=r,i.state=h,i.context=l,r=c):("function"!=typeof i.componentDidUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!=typeof i.getSnapshotBeforeUpdate||s===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),r=!1)}return Ps(e,t,n,r,a,o)}function Ps(e,t,n,r,o,a){Es(e,t);var i=!!(128&t.flags);if(!r&&!i)return o&&Mo(t,n,!1),Vs(e,t,a);r=t.stateNode,bs.current=t;var s=i&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.flags|=1,null!==e&&i?(t.child=_a(t,e.child,null,a),t.child=_a(t,null,s,a)):ws(e,t,s,a),t.memoizedState=r.state,o&&Mo(t,n,!0),t.child}function Cs(e){var t=e.stateNode;t.pendingContext?Ro(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Ro(0,t.context,!1),Ya(e,t.containerInfo)}function As(e,t,n,r,o){return ha(),ma(o),t.flags|=256,ws(e,t,n,r),t.child}var Ts,Is,Ns,Ls,Rs={dehydrated:null,treeContext:null,retryLane:0};function Ds(e){return{baseLanes:e,cachePool:null,transitions:null}}function Fs(e,t,n){var r,o=t.pendingProps,i=ei.current,s=!1,l=!!(128&t.flags);if((r=l)||(r=(null===e||null!==e.memoizedState)&&!!(2&i)),r?(s=!0,t.flags&=-129):null!==e&&null===e.memoizedState||(i|=1),jo(ei,1&i),null===e)return ua(t),null!==(e=t.memoizedState)&&null!==(e=e.dehydrated)?(1&t.mode?"$!"===e.data?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(l=o.children,e=o.fallback,s?(o=t.mode,s=t.child,l={mode:"hidden",children:l},1&o||null===s?s=Dc(l,o,0,null):(s.childLanes=0,s.pendingProps=l),e=Rc(e,o,n,null),s.return=t,e.return=t,s.sibling=e,t.child=s,t.child.memoizedState=Ds(n),t.memoizedState=Rs,e):Ms(t,l));if(null!==(i=e.memoizedState)&&null!==(r=i.dehydrated))return function(e,t,n,r,o,i,s){if(n)return 256&t.flags?(t.flags&=-257,Bs(e,t,s,r=us(Error(a(422))))):null!==t.memoizedState?(t.child=e.child,t.flags|=128,null):(i=r.fallback,o=t.mode,r=Dc({mode:"visible",children:r.children},o,0,null),(i=Rc(i,o,s,null)).flags|=2,r.return=t,i.return=t,r.sibling=i,t.child=r,1&t.mode&&_a(t,e.child,null,s),t.child.memoizedState=Ds(s),t.memoizedState=Rs,i);if(!(1&t.mode))return Bs(e,t,s,null);if("$!"===o.data){if(r=o.nextSibling&&o.nextSibling.dataset)var l=r.dgst;return r=l,Bs(e,t,s,r=us(i=Error(a(419)),r,void 0))}if(l=!!(s&e.childLanes),vs||l){if(null!==(r=Cl)){switch(s&-s){case 4:o=2;break;case 16:o=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:o=32;break;case 536870912:o=268435456;break;default:o=0}0!==(o=o&(r.suspendedLanes|s)?0:o)&&o!==i.retryLane&&(i.retryLane=o,Ra(e,o),nc(r,e,o,-1))}return mc(),Bs(e,t,s,r=us(Error(a(421))))}return"$?"===o.data?(t.flags|=128,t.child=e.child,t=jc.bind(null,e),o._reactRetry=t,null):(e=i.treeContext,oa=co(o.nextSibling),ra=t,aa=!0,ia=null,null!==e&&(Go[Ko++]=Zo,Go[Ko++]=Xo,Go[Ko++]=Yo,Zo=e.id,Xo=e.overflow,Yo=t),t=Ms(t,r.children),t.flags|=4096,t)}(e,t,l,o,r,i,n);if(s){s=o.fallback,l=t.mode,r=(i=e.child).sibling;var c={mode:"hidden",children:o.children};return 1&l||t.child===i?(o=Nc(i,c)).subtreeFlags=14680064&i.subtreeFlags:((o=t.child).childLanes=0,o.pendingProps=c,t.deletions=null),null!==r?s=Nc(r,s):(s=Rc(s,l,n,null)).flags|=2,s.return=t,o.return=t,o.sibling=s,t.child=o,o=s,s=t.child,l=null===(l=e.child.memoizedState)?Ds(n):{baseLanes:l.baseLanes|n,cachePool:null,transitions:l.transitions},s.memoizedState=l,s.childLanes=e.childLanes&~n,t.memoizedState=Rs,o}return e=(s=e.child).sibling,o=Nc(s,{mode:"visible",children:o.children}),!(1&t.mode)&&(o.lanes=n),o.return=t,o.sibling=null,null!==e&&(null===(n=t.deletions)?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=o,t.memoizedState=null,o}function Ms(e,t){return(t=Dc({mode:"visible",children:t},e.mode,0,null)).return=e,e.child=t}function Bs(e,t,n,r){return null!==r&&ma(r),_a(t,e.child,null,n),(e=Ms(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function zs(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),Ca(e.return,t,n)}function $s(e,t,n,r,o){var a=e.memoizedState;null===a?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(a.isBackwards=t,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=n,a.tailMode=o)}function Us(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(ws(e,t,r.children,n),2&(r=ei.current))r=1&r|2,t.flags|=128;else{if(null!==e&&128&e.flags)e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&zs(e,n,t);else if(19===e.tag)zs(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(jo(ei,r),1&t.mode)switch(o){case"forwards":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===ti(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),$s(t,!1,o,n,a);break;case"backwards":for(n=null,o=t.child,t.child=null;null!==o;){if(null!==(e=o.alternate)&&null===ti(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}$s(t,!0,n,null,a);break;case"together":$s(t,!1,null,null,void 0);break;default:t.memoizedState=null}else t.memoizedState=null;return t.child}function Hs(e,t){!(1&t.mode)&&null!==e&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Vs(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),Dl|=t.lanes,!(n&t.childLanes))return null;if(null!==e&&t.child!==e.child)throw Error(a(153));if(null!==t.child){for(n=Nc(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Nc(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Qs(e,t){if(!aa)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Ws(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=14680064&o.subtreeFlags,r|=14680064&o.flags,o.return=e,o=o.sibling;else for(o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function qs(e,t,n){var r=t.pendingProps;switch(na(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ws(t),null;case 1:case 17:return No(t.type)&&Lo(),Ws(t),null;case 3:return r=t.stateNode,Za(),Oo(Ao),Oo(Co),ri(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),null!==e&&null!==e.child||(fa(t)?t.flags|=4:null===e||e.memoizedState.isDehydrated&&!(256&t.flags)||(t.flags|=1024,null!==ia&&(ic(ia),ia=null))),Is(e,t),Ws(t),null;case 5:Ja(t);var o=Ka(Ga.current);if(n=t.type,null!==e&&null!=t.stateNode)Ns(e,t,n,r,o),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(null===t.stateNode)throw Error(a(166));return Ws(t),null}if(e=Ka(Wa.current),fa(t)){r=t.stateNode,n=t.type;var i=t.memoizedProps;switch(r[po]=t,r[ho]=i,e=!!(1&t.mode),n){case"dialog":Br("cancel",r),Br("close",r);break;case"iframe":case"object":case"embed":Br("load",r);break;case"video":case"audio":for(o=0;o <\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=l.createElement(n,{is:r.is}):(e=l.createElement(n),"select"===n&&(l=e,r.multiple?l.multiple=!0:r.size&&(l.size=r.size))):e=l.createElementNS(e,n),e[po]=t,e[ho]=r,Ts(e,t,!1,!1),t.stateNode=e;e:{switch(l=ve(n,r),n){case"dialog":Br("cancel",e),Br("close",e),o=r;break;case"iframe":case"object":case"embed":Br("load",e),o=r;break;case"video":case"audio":for(o=0;o Ul&&(t.flags|=128,r=!0,Qs(i,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=ti(l))){if(t.flags|=128,r=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.flags|=4),Qs(i,!0),null===i.tail&&"hidden"===i.tailMode&&!l.alternate&&!aa)return Ws(t),null}else 2*Ze()-i.renderingStartTime>Ul&&1073741824!==n&&(t.flags|=128,r=!0,Qs(i,!1),t.lanes=4194304);i.isBackwards?(l.sibling=t.child,t.child=l):(null!==(n=i.last)?n.sibling=l:t.child=l,i.last=l)}return null!==i.tail?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=Ze(),t.sibling=null,n=ei.current,jo(ei,r?1&n|2:1&n),t):(Ws(t),null);case 22:case 23:return dc(),r=null!==t.memoizedState,null!==e&&null!==e.memoizedState!==r&&(t.flags|=8192),r&&1&t.mode?!!(1073741824&Il)&&(Ws(t),6&t.subtreeFlags&&(t.flags|=8192)):Ws(t),null;case 24:case 25:return null}throw Error(a(156,t.tag))}function Gs(e,t){switch(na(t),t.tag){case 1:return No(t.type)&&Lo(),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return Za(),Oo(Ao),Oo(Co),ri(),65536&(e=t.flags)&&!(128&e)?(t.flags=-65537&e|128,t):null;case 5:return Ja(t),null;case 13:if(Oo(ei),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(a(340));ha()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return Oo(ei),null;case 4:return Za(),null;case 10:return Pa(t.type._context),null;case 22:case 23:return dc(),null;default:return null}}Ts=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Is=function(){},Ns=function(e,t,n,r){var o=e.memoizedProps;if(o!==r){e=t.stateNode,Ka(Wa.current);var a,i=null;switch(n){case"input":o=K(e,o),r=K(e,r),i=[];break;case"select":o=F({},o,{value:void 0}),r=F({},r,{value:void 0}),i=[];break;case"textarea":o=re(e,o),r=re(e,r),i=[];break;default:"function"!=typeof o.onClick&&"function"==typeof r.onClick&&(e.onclick=Jr)}for(u in be(n,r),n=null,o)if(!r.hasOwnProperty(u)&&o.hasOwnProperty(u)&&null!=o[u])if("style"===u){var l=o[u];for(a in l)l.hasOwnProperty(a)&&(n||(n={}),n[a]="")}else"dangerouslySetInnerHTML"!==u&&"children"!==u&&"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&"autoFocus"!==u&&(s.hasOwnProperty(u)?i||(i=[]):(i=i||[]).push(u,null));for(u in r){var c=r[u];if(l=null!=o?o[u]:void 0,r.hasOwnProperty(u)&&c!==l&&(null!=c||null!=l))if("style"===u)if(l){for(a in l)!l.hasOwnProperty(a)||c&&c.hasOwnProperty(a)||(n||(n={}),n[a]="");for(a in c)c.hasOwnProperty(a)&&l[a]!==c[a]&&(n||(n={}),n[a]=c[a])}else n||(i||(i=[]),i.push(u,n)),n=c;else"dangerouslySetInnerHTML"===u?(c=c?c.__html:void 0,l=l?l.__html:void 0,null!=c&&l!==c&&(i=i||[]).push(u,c)):"children"===u?"string"!=typeof c&&"number"!=typeof c||(i=i||[]).push(u,""+c):"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&(s.hasOwnProperty(u)?(null!=c&&"onScroll"===u&&Br("scroll",e),i||l===c||(i=[])):(i=i||[]).push(u,c))}n&&(i=i||[]).push("style",n);var u=i;(t.updateQueue=u)&&(t.flags|=4)}},Ls=function(e,t,n,r){n!==r&&(t.flags|=4)};var Ks=!1,Ys=!1,Zs="function"==typeof WeakSet?WeakSet:Set,Xs=null;function Js(e,t){var n=e.ref;if(null!==n)if("function"==typeof n)try{n(null)}catch(r){xc(e,t,r)}else n.current=null}function el(e,t,n){try{n()}catch(r){xc(e,t,r)}}var tl=!1;function nl(e,t,n){var r=t.updateQueue;if(null!==(r=null!==r?r.lastEffect:null)){var o=r=r.next;do{if((o.tag&e)===e){var a=o.destroy;o.destroy=void 0,void 0!==a&&el(t,n,a)}o=o.next}while(o!==r)}}function rl(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function ol(e){var t=e.ref;if(null!==t){var n=e.stateNode;e.tag,e=n,"function"==typeof t?t(e):t.current=e}}function al(e){var t=e.alternate;null!==t&&(e.alternate=null,al(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&(delete t[po],delete t[ho],delete t[go],delete t[yo],delete t[bo])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function il(e){return 5===e.tag||3===e.tag||4===e.tag}function sl(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||il(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function ll(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?8===n.nodeType?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(8===n.nodeType?(t=n.parentNode).insertBefore(e,n):(t=n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=Jr));else if(4!==r&&null!==(e=e.child))for(ll(e,t,n),e=e.sibling;null!==e;)ll(e,t,n),e=e.sibling}function cl(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&null!==(e=e.child))for(cl(e,t,n),e=e.sibling;null!==e;)cl(e,t,n),e=e.sibling}var ul=null,dl=!1;function fl(e,t,n){for(n=n.child;null!==n;)pl(e,t,n),n=n.sibling}function pl(e,t,n){if(at&&"function"==typeof at.onCommitFiberUnmount)try{at.onCommitFiberUnmount(ot,n)}catch(s){}switch(n.tag){case 5:Ys||Js(n,t);case 6:var r=ul,o=dl;ul=null,fl(e,t,n),dl=o,null!==(ul=r)&&(dl?(e=ul,n=n.stateNode,8===e.nodeType?e.parentNode.removeChild(n):e.removeChild(n)):ul.removeChild(n.stateNode));break;case 18:null!==ul&&(dl?(e=ul,n=n.stateNode,8===e.nodeType?lo(e.parentNode,n):1===e.nodeType&&lo(e,n),Ut(e)):lo(ul,n.stateNode));break;case 4:r=ul,o=dl,ul=n.stateNode.containerInfo,dl=!0,fl(e,t,n),ul=r,dl=o;break;case 0:case 11:case 14:case 15:if(!Ys&&(null!==(r=n.updateQueue)&&null!==(r=r.lastEffect))){o=r=r.next;do{var a=o,i=a.destroy;a=a.tag,void 0!==i&&(2&a||4&a)&&el(n,t,i),o=o.next}while(o!==r)}fl(e,t,n);break;case 1:if(!Ys&&(Js(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){xc(n,t,s)}fl(e,t,n);break;case 21:fl(e,t,n);break;case 22:1&n.mode?(Ys=(r=Ys)||null!==n.memoizedState,fl(e,t,n),Ys=r):fl(e,t,n);break;default:fl(e,t,n)}}function hl(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new Zs),t.forEach((function(t){var r=Pc.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}function ml(e,t){var n=t.deletions;if(null!==n)for(var r=0;r o&&(o=s),r&=~i}if(r=o,10<(r=(120>(r=Ze()-r)?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*xl(r/1960))-r)){e.timeoutHandle=ro(_c.bind(null,e,zl,Hl),r);break}_c(e,zl,Hl);break;default:throw Error(a(329))}}}return rc(e,Ze()),e.callbackNode===n?oc.bind(null,e):null}function ac(e,t){var n=Bl;return e.current.memoizedState.isDehydrated&&(fc(e,t).flags|=256),2!==(e=gc(e,t))&&(t=zl,zl=n,null!==t&&ic(t)),e}function ic(e){null===zl?zl=e:zl.push.apply(zl,e)}function sc(e,t){for(t&=~Ml,t&=~Fl,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0 e?16:e,null===Gl)var r=!1;else{if(e=Gl,Gl=null,Kl=0,6&Pl)throw Error(a(331));var o=Pl;for(Pl|=4,Xs=e.current;null!==Xs;){var i=Xs,s=i.child;if(16&Xs.flags){var l=i.deletions;if(null!==l){for(var c=0;c Ze()-$l?fc(e,0):Ml|=n),rc(e,t)}function Oc(e,t){0===t&&(1&e.mode?(t=ut,!(130023424&(ut<<=1))&&(ut=4194304)):t=1);var n=ec();null!==(e=Ra(e,t))&&(yt(e,t,n),rc(e,n))}function jc(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Oc(e,n)}function Pc(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;null!==o&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(a(314))}null!==r&&r.delete(t),Oc(e,n)}function Cc(e,t){return qe(e,t)}function Ac(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Tc(e,t,n,r){return new Ac(e,t,n,r)}function Ic(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Nc(e,t){var n=e.alternate;return null===n?((n=Tc(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=14680064&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Lc(e,t,n,r,o,i){var s=2;if(r=e,"function"==typeof e)Ic(e)&&(s=1);else if("string"==typeof e)s=5;else e:switch(e){case k:return Rc(n.children,o,i,t);case x:s=8,o|=8;break;case E:return(e=Tc(12,n,t,2|o)).elementType=E,e.lanes=i,e;case C:return(e=Tc(13,n,t,o)).elementType=C,e.lanes=i,e;case A:return(e=Tc(19,n,t,o)).elementType=A,e.lanes=i,e;case N:return Dc(n,o,i,t);default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case O:s=10;break e;case j:s=9;break e;case P:s=11;break e;case T:s=14;break e;case I:s=16,r=null;break e}throw Error(a(130,null==e?e:typeof e,""))}return(t=Tc(s,n,t,o)).elementType=e,t.type=r,t.lanes=i,t}function Rc(e,t,n,r){return(e=Tc(7,e,r,t)).lanes=n,e}function Dc(e,t,n,r){return(e=Tc(22,e,r,t)).elementType=N,e.lanes=n,e.stateNode={isHidden:!1},e}function Fc(e,t,n){return(e=Tc(6,e,null,t)).lanes=n,e}function Mc(e,t,n){return(t=Tc(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Bc(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=gt(0),this.expirationTimes=gt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=gt(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function zc(e,t,n,r,o,a,i,s,l){return e=new Bc(e,t,n,s,l),1===t?(t=1,!0===a&&(t|=8)):t=0,a=Tc(3,null,null,t),e.current=a,a.stateNode=e,a.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Fa(a),e}function $c(e){if(!e)return Po;e:{if(Ue(e=e._reactInternals)!==e||1!==e.tag)throw Error(a(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(No(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);throw Error(a(171))}if(1===e.tag){var n=e.type;if(No(n))return Do(e,n,t)}return t}function Uc(e,t,n,r,o,a,i,s,l){return(e=zc(n,r,!0,e,0,a,0,s,l)).context=$c(null),n=e.current,(a=Ba(r=ec(),o=tc(n))).callback=null!=t?t:null,za(n,a,o),e.current.lanes=o,yt(e,o,r),rc(e,r),e}function Hc(e,t,n,r){var o=t.current,a=ec(),i=tc(o);return n=$c(n),null===t.context?t.context=n:t.pendingContext=n,(t=Ba(a,i)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),null!==(e=za(o,t,i))&&(nc(e,o,i,a),$a(e,o,i)),i}function Vc(e){return(e=e.current).child?(e.child.tag,e.child.stateNode):null}function Qc(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n {"use strict";var r=n(961);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},961:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(2551)},115:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,o="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function a(e,i){if(e===i)return!0;if(e&&i&&"object"==typeof e&&"object"==typeof i){if(e.constructor!==i.constructor)return!1;var s,l,c,u;if(Array.isArray(e)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(!a(e[l],i[l]))return!1;return!0}if(n&&e instanceof Map&&i instanceof Map){if(e.size!==i.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;for(u=e.entries();!(l=u.next()).done;)if(!a(l.value[1],i.get(l.value[0])))return!1;return!0}if(r&&e instanceof Set&&i instanceof Set){if(e.size!==i.size)return!1;for(u=e.entries();!(l=u.next()).done;)if(!i.has(l.value[0]))return!1;return!0}if(o&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(i)){if((s=e.length)!=i.length)return!1;for(l=s;0!=l--;)if(e[l]!==i[l])return!1;return!0}if(e.constructor===RegExp)return e.source===i.source&&e.flags===i.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof i.valueOf)return e.valueOf()===i.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof i.toString)return e.toString()===i.toString();if((s=(c=Object.keys(e)).length)!==Object.keys(i).length)return!1;for(l=s;0!=l--;)if(!Object.prototype.hasOwnProperty.call(i,c[l]))return!1;if(t&&e instanceof Element)return!1;for(l=s;0!=l--;)if(("_owner"!==c[l]&&"__v"!==c[l]&&"__o"!==c[l]||!e.$$typeof)&&!a(e[c[l]],i[c[l]]))return!1;return!0}return e!=e&&i!=i}e.exports=function(e,t){try{return a(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},545:(e,t,n)=>{"use strict";n.d(t,{mg:()=>J,vd:()=>Q});var r=n(6540),o=n(5556),a=n.n(o),i=n(115),s=n.n(i),l=n(311),c=n.n(l),u=n(2833),d=n.n(u);function f(){return f=Object.assign||function(e){for(var t=1;t =0||(o[n]=e[n]);return o}var g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},y={rel:["amphtml","canonical","alternate"]},b={type:["application/ld+json"]},v={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},w=Object.keys(g).map((function(e){return g[e]})),_={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},S=Object.keys(_).reduce((function(e,t){return e[_[t]]=t,e}),{}),k=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},x=function(e){var t=k(e,g.TITLE),n=k(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,(function(){return t}));var r=k(e,"defaultTitle");return t||r||void 0},E=function(e){return k(e,"onChangeClientState")||function(){}},O=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return f({},e,t)}),{})},j=function(e,t){return t.filter((function(e){return void 0!==e[g.BASE]})).map((function(e){return e[g.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),o=0;o /g,">").replace(/"/g,""").replace(/'/g,"'")},R=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},D=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce((function(t,n){return t[_[n]||n]=e[n],t}),t)},F=function(e,t){return t.map((function(t,n){var o,a=((o={key:n})["data-rh"]=!0,o);return Object.keys(t).forEach((function(e){var n=_[e]||e;"innerHTML"===n||"cssText"===n?a.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:a[n]=t[e]})),r.createElement(e,a)}))},M=function(e,t,n){switch(e){case g.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=D(n,o),[r.createElement(g.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=R(n),a=A(t);return o?"<"+e+' data-rh="true" '+o+">"+L(a,r)+""+e+">":"<"+e+' data-rh="true">'+L(a,r)+""+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return D(t)},toString:function(){return R(t)}};default:return{toComponent:function(){return F(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var o=Object.keys(r).filter((function(e){return!("innerHTML"===e||"cssText"===e)})).reduce((function(e,t){var o=void 0===r[t]?t:t+'="'+L(r[t],n)+'"';return e?e+" "+o:o}),""),a=r.innerHTML||r.cssText||"",i=-1===N.indexOf(e);return t+"<"+e+' data-rh="true" '+o+(i?"/>":">"+a+""+e+">")}),"")}(e,t,n)}}}},B=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,o=e.htmlAttributes,a=e.noscriptTags,i=e.styleTags,s=e.title,l=void 0===s?"":s,c=e.titleAttributes,u=e.linkTags,d=e.metaTags,f=e.scriptTags,p={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var h=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=T(e.metaTags,v),a=T(t,y),i=T(n,b);return{priorityMethods:{toComponent:function(){return[].concat(F(g.META,o.priority),F(g.LINK,a.priority),F(g.SCRIPT,i.priority))},toString:function(){return M(g.META,o.priority,r)+" "+M(g.LINK,a.priority,r)+" "+M(g.SCRIPT,i.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:i.default}}(e);p=h.priorityMethods,u=h.linkTags,d=h.metaTags,f=h.scriptTags}return{priority:p,base:M(g.BASE,t,r),bodyAttributes:M("bodyAttributes",n,r),htmlAttributes:M("htmlAttributes",o,r),link:M(g.LINK,u,r),meta:M(g.META,d,r),noscript:M(g.NOSCRIPT,a,r),script:M(g.SCRIPT,f,r),style:M(g.STYLE,i,r),title:M(g.TITLE,{title:l,titleAttributes:c},r)}},z=[],$=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?z:n.instances},add:function(e){(n.canUseDOM?z:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?z:n.instances).indexOf(e);(n.canUseDOM?z:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=B({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},U=r.createContext({}),H=a().shape({setHelmet:a().func,helmetInstances:a().shape({get:a().func,add:a().func,remove:a().func})}),V="undefined"!=typeof document,Q=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new $(r.props.context,t.canUseDOM),r}return p(t,e),t.prototype.render=function(){return r.createElement(U.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);Q.canUseDOM=V,Q.propTypes={context:a().shape({helmet:a().shape()}),children:a().node.isRequired},Q.defaultProps={context:{}},Q.displayName="HelmetProvider";var W=function(e,t){var n,r=document.head||document.querySelector(g.HEAD),o=r.querySelectorAll(e+"[data-rh]"),a=[].slice.call(o),i=[];return t&&t.length&&t.forEach((function(t){var r=document.createElement(e);for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&("innerHTML"===o?r.innerHTML=t.innerHTML:"cssText"===o?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(o,void 0===t[o]?"":t[o]));r.setAttribute("data-rh","true"),a.some((function(e,t){return n=t,r.isEqualNode(e)}))?a.splice(n,1):i.push(r)})),a.forEach((function(e){return e.parentNode.removeChild(e)})),i.forEach((function(e){return r.appendChild(e)})),{oldTags:a,newTags:i}},q=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),o=r?r.split(","):[],a=[].concat(o),i=Object.keys(t),s=0;s =0;d-=1)n.removeAttribute(a[d]);o.length===a.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==i.join(",")&&n.setAttribute("data-rh",i.join(","))}},G=function(e,t){var n=e.baseTag,r=e.htmlAttributes,o=e.linkTags,a=e.metaTags,i=e.noscriptTags,s=e.onChangeClientState,l=e.scriptTags,c=e.styleTags,u=e.title,d=e.titleAttributes;q(g.BODY,e.bodyAttributes),q(g.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=A(e)),q(g.TITLE,t)}(u,d);var f={baseTag:W(g.BASE,n),linkTags:W(g.LINK,o),metaTags:W(g.META,a),noscriptTags:W(g.NOSCRIPT,i),scriptTags:W(g.SCRIPT,l),styleTags:W(g.STYLE,c)},p={},h={};Object.keys(f).forEach((function(e){var t=f[e],n=t.newTags,r=t.oldTags;n.length&&(p[e]=n),r.length&&(h[e]=f[e].oldTags)})),t&&t(),s(e,p,h)},K=null,Y=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return f({},r,((t={})[n.type]=[].concat(r[n.type]||[],[f({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,o=e.newProps,a=e.newChildProps,i=e.nestedChildren;switch(r.type){case g.TITLE:return f({},o,((t={})[r.type]=i,t.titleAttributes=f({},a),t));case g.BODY:return f({},o,{bodyAttributes:f({},a)});case g.HTML:return f({},o,{htmlAttributes:f({},a)});default:return f({},o,((n={})[r.type]=f({},a),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=f({},t);return Object.keys(e).forEach((function(t){var r;n=f({},n,((r={})[t]=e[t],r))})),n},n.warnOnInvalidChildren=function(e,t){return c()(w.some((function(t){return e.type===t})),"function"==typeof e.type?"You may be attempting to nest components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+w.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),c()(!t||"string"==typeof t||Array.isArray(t)&&!t.some((function(e){return"string"!=typeof e})),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,o={};return r.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,a=r.children,i=m(r,Z),s=Object.keys(i).reduce((function(e,t){return e[S[t]||t]=i[t],e}),{}),l=e.type;switch("symbol"==typeof l?l=l.toString():n.warnOnInvalidChildren(e,a),l){case g.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.STYLE:o=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:o,newChildProps:s,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:s,nestedChildren:a})}}})),this.mapArrayTypeChildrenToProps(o,t)},n.render=function(){var e=this.props,t=e.children,n=m(e,X),o=f({},n),a=n.helmetData;return t&&(o=this.mapChildrenToProps(t,o)),!a||a instanceof $||(a=new $(a.context,a.instances)),a?r.createElement(Y,f({},o,{context:a.value,helmetData:void 0})):r.createElement(U.Consumer,null,(function(e){return r.createElement(Y,f({},o,{context:e}))}))},t}(r.Component);J.propTypes={base:a().object,bodyAttributes:a().object,children:a().oneOfType([a().arrayOf(a().node),a().node]),defaultTitle:a().string,defer:a().bool,encodeSpecialCharacters:a().bool,htmlAttributes:a().object,link:a().arrayOf(a().object),meta:a().arrayOf(a().object),noscript:a().arrayOf(a().object),onChangeClientState:a().func,script:a().arrayOf(a().object),style:a().arrayOf(a().object),title:a().string,titleAttributes:a().object,titleTemplate:a().string,prioritizeSeoTags:a().bool,helmetData:a().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},2799:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,o=n?Symbol.for("react.portal"):60106,a=n?Symbol.for("react.fragment"):60107,i=n?Symbol.for("react.strict_mode"):60108,s=n?Symbol.for("react.profiler"):60114,l=n?Symbol.for("react.provider"):60109,c=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,f=n?Symbol.for("react.forward_ref"):60112,p=n?Symbol.for("react.suspense"):60113,h=n?Symbol.for("react.suspense_list"):60120,m=n?Symbol.for("react.memo"):60115,g=n?Symbol.for("react.lazy"):60116,y=n?Symbol.for("react.block"):60121,b=n?Symbol.for("react.fundamental"):60117,v=n?Symbol.for("react.responder"):60118,w=n?Symbol.for("react.scope"):60119;function _(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case a:case s:case i:case p:return e;default:switch(e=e&&e.$$typeof){case c:case f:case g:case m:case l:return e;default:return t}}case o:return t}}}function S(e){return _(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=c,t.ContextProvider=l,t.Element=r,t.ForwardRef=f,t.Fragment=a,t.Lazy=g,t.Memo=m,t.Portal=o,t.Profiler=s,t.StrictMode=i,t.Suspense=p,t.isAsyncMode=function(e){return S(e)||_(e)===u},t.isConcurrentMode=S,t.isContextConsumer=function(e){return _(e)===c},t.isContextProvider=function(e){return _(e)===l},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return _(e)===f},t.isFragment=function(e){return _(e)===a},t.isLazy=function(e){return _(e)===g},t.isMemo=function(e){return _(e)===m},t.isPortal=function(e){return _(e)===o},t.isProfiler=function(e){return _(e)===s},t.isStrictMode=function(e){return _(e)===i},t.isSuspense=function(e){return _(e)===p},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===d||e===s||e===i||e===p||e===h||"object"==typeof e&&null!==e&&(e.$$typeof===g||e.$$typeof===m||e.$$typeof===l||e.$$typeof===c||e.$$typeof===f||e.$$typeof===b||e.$$typeof===v||e.$$typeof===w||e.$$typeof===y)},t.typeOf=_},4363:(e,t,n)=>{"use strict";e.exports=n(2799)},3259:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return i=Object.assign||function(e){for(var t=1;t {"use strict";n.d(t,{u:()=>i,v:()=>s});var r=n(6347),o=n(8168),a=n(6540);function i(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var o=e.path?(0,r.B6)(t,e):n.length?n[n.length-1].match:r.Ix.computeRootMatch(t);return o&&(n.push({route:e,match:o}),e.routes&&i(e.routes,t,n)),o})),n}function s(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?a.createElement(r.dO,n,e.map((function(e,n){return a.createElement(r.qh,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,o.A)({},n,{},t,{route:e})):a.createElement(e.component,(0,o.A)({},n,t,{route:e}))}})}))):null}},4625:(e,t,n)=>{"use strict";n.d(t,{I9:()=>d,Kd:()=>u,N_:()=>y,k2:()=>w});var r=n(6347),o=n(2892),a=n(6540),i=n(1513),s=n(8168),l=n(8587),c=n(1561),u=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o {"use strict";n.d(t,{B6:()=>k,Ix:()=>v,W6:()=>I,XZ:()=>b,dO:()=>A,qh:()=>x,zy:()=>N});var r=n(2892),o=n(6540),a=n(5556),i=n.n(a),s=n(1513),l=n(1561),c=n(8168),u=n(8505),d=n.n(u),f=(n(4363),n(8587)),p=(n(4146),1073741823),h="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var m=o.createContext||function(e,t){var n,a,s="__create-react-context-"+function(){var e="__global_unique_id__";return h[e]=(h[e]||0)+1}()+"__",l=function(e){function n(){for(var t,n,r,o=arguments.length,a=new Array(o),i=0;i {var r=n(4634);e.exports=h,e.exports.parse=a,e.exports.compile=function(e,t){return l(a(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=p;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,s=0,l="",c=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(s,p),s=p+d.length,f)l+=f[1];else{var h=e[s],m=n[2],g=n[3],y=n[4],b=n[5],v=n[6],w=n[7];l&&(r.push(l),l="");var _=null!=m&&null!=h&&h!==m,S="+"===v||"*"===v,k="?"===v||"*"===v,x=m||c,E=y||b,O=m||("string"==typeof r[r.length-1]?r[r.length-1]:"");r.push({name:g||a++,prefix:m||"",delimiter:x,optional:k,repeat:S,partial:_,asterisk:!!w,pattern:E?u(E):w?".*":i(x,O)})}}return s -1?"[^"+c(e)+"]+?":c(t)+"|(?:(?!"+c(t)+")[^"+c(e)+"])+?"}function s(e){return encodeURI(e).replace(/[\/?#]/g,(function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()}))}function l(e,t){for(var n=new Array(e.length),o=0;o {"use strict";var r=n(6540),o=Symbol.for("react.element"),a=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,s=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,a={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)i.call(t,r)&&!l.hasOwnProperty(r)&&(a[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===a[r]&&(a[r]=t[r]);return{$$typeof:o,type:e,key:c,ref:u,props:a,_owner:s.current}}t.Fragment=a,t.jsx=c,t.jsxs=c},5287:(e,t)=>{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),l=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator;var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m=Object.assign,g={};function y(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||h}function b(){}function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||h}y.prototype.isReactComponent={},y.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},y.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},b.prototype=y.prototype;var w=v.prototype=new b;w.constructor=v,m(w,y.prototype),w.isPureReactComponent=!0;var _=Array.isArray,S=Object.prototype.hasOwnProperty,k={current:null},x={key:!0,ref:!0,__self:!0,__source:!0};function E(e,t,r){var o,a={},i=null,s=null;if(null!=t)for(o in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)S.call(t,o)&&!x.hasOwnProperty(o)&&(a[o]=t[o]);var l=arguments.length-2;if(1===l)a.children=r;else if(1 {"use strict";e.exports=n(5287)},4848:(e,t,n)=>{"use strict";e.exports=n(1020)},7463:(e,t)=>{"use strict";function n(e,t){var n=e.length;e.push(t);e:for(;0 >>1,o=e[r];if(!(0>>1;ra(l,n))c a(u,l)?(e[r]=u,e[c]=n,r=c):(e[r]=l,e[s]=n,r=s);else{if(!(c a(u,n)))break e;e[r]=u,e[c]=n,r=c}}}return t}function a(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"==typeof performance&&"function"==typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var s=Date,l=s.now();t.unstable_now=function(){return s.now()-l}}var c=[],u=[],d=1,f=null,p=3,h=!1,m=!1,g=!1,y="function"==typeof setTimeout?setTimeout:null,b="function"==typeof clearTimeout?clearTimeout:null,v="undefined"!=typeof setImmediate?setImmediate:null;function w(e){for(var t=r(u);null!==t;){if(null===t.callback)o(u);else{if(!(t.startTime<=e))break;o(u),t.sortIndex=t.expirationTime,n(c,t)}t=r(u)}}function _(e){if(g=!1,w(e),!m)if(null!==r(c))m=!0,N(S);else{var t=r(u);null!==t&&L(_,t.startTime-e)}}function S(e,n){m=!1,g&&(g=!1,b(O),O=-1),h=!0;var a=p;try{for(w(n),f=r(c);null!==f&&(!(f.expirationTime>n)||e&&!C());){var i=f.callback;if("function"==typeof i){f.callback=null,p=f.priorityLevel;var s=i(f.expirationTime<=n);n=t.unstable_now(),"function"==typeof s?f.callback=s:f===r(c)&&o(c),w(n)}else o(c);f=r(c)}if(null!==f)var l=!0;else{var d=r(u);null!==d&&L(_,d.startTime-n),l=!1}return l}finally{f=null,p=a,h=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var k,x=!1,E=null,O=-1,j=5,P=-1;function C(){return!(t.unstable_now()-P e||125 i?(e.sortIndex=a,n(u,e),null===r(c)&&e===r(u)&&(g?(b(O),O=-1):g=!0,L(_,a-i))):(e.sortIndex=s,n(c,e),m||h||(m=!0,N(S))),e},t.unstable_shouldYield=C,t.unstable_wrapCallback=function(e){var t=p;return function(){var n=p;p=t;try{return e.apply(this,arguments)}finally{p=n}}}},9982:(e,t,n)=>{"use strict";e.exports=n(7463)},2833:e=>{e.exports=function(e,t,n,r){var o=n?n.call(r,e,t):void 0;if(void 0!==o)return!!o;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var a=Object.keys(e),i=Object.keys(t);if(a.length!==i.length)return!1;for(var s=Object.prototype.hasOwnProperty.bind(t),l=0;l {"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"a9s CLI Documentation",tagline:"a9s CLI Documentation",url:"https://docs.a9s-cli.anynines.com",baseUrl:"/",trailingSlash:!0,onBrokenLinks:"warn",onBrokenMarkdownLinks:"warn",favicon:"/img/favicon.ico",organizationName:"anynines",projectName:"a9s-cli-v2",i18n:{defaultLocale:"en",locales:["en"],localeConfigs:{en:{label:"English",direction:"ltr"}},path:"i18n"},plugins:[["/Users/abdulhaseeb/Desktop/Github/a9s-cli-v2/docs/node_modules/@cmfcmf/docusaurus-search-local/lib/server/index.js",{indexBlog:!1}]],scripts:[{id:"usercentrics-cmp",src:"https://app.usercentrics.eu/browser-ui/latest/loader.js","data-settings-id":"Rkzv9fbcQ",async:!0,"data-version":"preview"}],presets:[["@docusaurus/preset-classic",{docs:{versions:{current:{label:"Develop",path:"develop",banner:"none"}},sidebarPath:"/Users/abdulhaseeb/Desktop/Github/a9s-cli-v2/docs/sidebars.js"},googleTagManager:{containerId:"GTM-NZZ5ZVC"},blog:{showReadingTime:!0,blogTitle:"Changelog",path:"changelog",blogSidebarTitle:"Versions",routeBasePath:"/changelog",include:["*.md","*.mdx"]},theme:{customCss:"/Users/abdulhaseeb/Desktop/Github/a9s-cli-v2/docs/src/css/custom.css"}}]],themeConfig:{navbar:{logo:{alt:"anynines Logo",src:"img/logo.svg",srcDark:"img/logoDark.svg"},items:[{type:"doc",docId:"a9s-cli",position:"left",label:"a9s CLI Docs"},{type:"doc",docId:"hands-on-tutorials/hands-on-tutorials-index",position:"left",label:"Tutorials"},{type:"docsVersionDropdown",position:"right",dropdownActiveClassDisabled:!1,dropdownItemsBefore:[],dropdownItemsAfter:[]}],hideOnScroll:!1},metadata:[{name:"docusaurus_tag",content:"default"}],footer:{style:"dark",links:[{title:"Documentation",items:[{label:"a9s CLI",to:"/docs/develop/a9s-cli"},{label:"a9s Data Services",to:"https://docs.anynines.com"},{label:"a9s Data Services for K8s",to:"https://docs.k8s.anynines.com/"},{label:"Documentation Tags",to:"/docs/tags"}]},{title:"Products",items:[{label:"Platform",href:"https://paas.anynines.com/"},{label:"Data Services",href:"https://www.anynines.com/data-services"},{label:"Enterprise Operation",href:"https://www.anynines.com/platform-operations"}]},{title:"About",items:[{label:"Blog",href:"https://blog.anynines.com/"},{label:"Team",href:"https://www.anynines.com/team"},{label:"Career",href:"https://www.anynines.com/career"},{label:"Contact",href:"https://www.anynines.com/contact"}]},{title:"Legal",items:[{label:"Imprint",href:"https://www.anynines.com/imprint"},{label:"Privacy Policy",href:"https://www.anynines.com/data-privacy"}]},{title:"Social Media",items:[{label:"Github",href:"https://github.com/anynines"},{label:"Twitter",href:"https://twitter.com/anynines?lang=en"},{label:"Facebook",href:"https://de-de.facebook.com/anyninescom/"},{label:"Medium",href:"https://anynines.medium.com/"}]}],copyright:"Copyright \xa9 2024 anynines"},prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:["ruby","bash"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},colorMode:{defaultMode:"light",disableSwitch:!1,respectPrefersColorScheme:!1},docs:{versionPersistence:"localStorage",sidebar:{hideable:!1,autoCollapseCategories:!1}},blog:{sidebar:{groupByYear:!0}},tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,future:{experimental_faster:{swcJsLoader:!1,swcJsMinimizer:!1,swcHtmlMinimizer:!1,lightningCssMinimizer:!1,mdxCrossCompilerCache:!1,rspackBundler:!1},experimental_storage:{type:"localStorage",namespace:!1},experimental_router:"browser"},onBrokenAnchors:"warn",onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},themes:[],headTags:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{format:"mdx",mermaid:!1,mdx1Compat:{comments:!0,admonitions:!0,headingIds:!0},anchors:{maintainCase:!1}}}},8168:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t r})},2892:(e,t,n)=>{"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function o(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{A:()=>o})},8587:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.includes(r))continue;n[r]=e[r]}return n}n.d(t,{A:()=>r})},4164:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;to});const o=function(){for(var e,t,n=0,o="",a=arguments.length;n{"use strict";n.d(t,{My:()=>j,f4:()=>ne});var r,o,a,i,s,l,c,u=n(6540),d=n(4164),f=Object.create,p=Object.defineProperty,h=Object.defineProperties,m=Object.getOwnPropertyDescriptor,g=Object.getOwnPropertyDescriptors,y=Object.getOwnPropertyNames,b=Object.getOwnPropertySymbols,v=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty,_=Object.prototype.propertyIsEnumerable,S=(e,t,n)=>t in e?p(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,k=(e,t)=>{for(var n in t||(t={}))w.call(t,n)&&S(e,n,t[n]);if(b)for(var n of b(t))_.call(t,n)&&S(e,n,t[n]);return e},x=(e,t)=>h(e,g(t)),E=(e,t)=>{var n={};for(var r in e)w.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&b)for(var r of b(e))t.indexOf(r)<0&&_.call(e,r)&&(n[r]=e[r]);return n},O=(r={"../../node_modules/.pnpm/prismjs@1.29.0_patch_hash=vrxx3pzkik6jpmgpayxfjunetu/node_modules/prismjs/prism.js"(e,t){var n=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof o?new o(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);k+=S.value.length,S=S.next){var x=S.value;if(t.length>e.length)return;if(!(x instanceof o)){var E,O=1;if(b){if(!(E=a(_,k,e,y))||E.index>=e.length)break;var j=E.index,P=E.index+E[0].length,C=k;for(C+=S.value.length;j>=C;)C+=(S=S.next).value.length;if(k=C-=S.value.length,S.value instanceof o)continue;for(var A=S;A!==t.tail&&(C d.reach&&(d.reach=L);var R=S.prev;if(I&&(R=l(t,R,I),k+=I.length),c(t,R,O),S=l(t,R,new o(f,g?r.tokenize(T,g):T,v,T)),N&&l(t,S,N),O>1){var D={cause:f+","+h,reach:L};i(e,t,n,S.prev,k,D),d&&D.reach>d.reach&&(d.reach=D.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,o={value:n,prev:t,next:r};return t.next=o,r.prev=o,e.length++,o}function c(e,t,n){for(var r=t.next,o=0;o
"+a.content+""+a.tag+">"},r}();t.exports=n,n.default=n}},function(){return o||(0,r[y(r)[0]])((o={exports:{}}).exports,o),o.exports}),j=((e,t,n)=>(n=null!=e?f(v(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let o of y(t))w.call(e,o)||o===n||p(e,o,{get:()=>t[o],enumerable:!(r=m(t,o))||r.enumerable});return e})(!t&&e&&e.__esModule?n:p(n,"default",{value:e,enumerable:!0}),e)))(O());j.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/?[\da-f]{1,8};/i]},j.languages.markup.tag.inside["attr-value"].inside.entity=j.languages.markup.entity,j.languages.markup.doctype.inside["internal-subset"].inside=j.languages.markup,j.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(j.languages.markup.tag,"addInlined",{value:function(e,t){var n;(t=((n=((n={})["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:j.languages[t]},n.cdata=/^$/i,{"included-cdata":{pattern://i,inside:n}}))["language-"+t]={pattern:/[\s\S]+/,inside:j.languages[t]},{}))[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:n},j.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(j.languages.markup.tag,"addAttribute",{value:function(e,t){j.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:j.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),j.languages.html=j.languages.markup,j.languages.mathml=j.languages.markup,j.languages.svg=j.languages.markup,j.languages.xml=j.languages.extend("markup",{}),j.languages.ssml=j.languages.xml,j.languages.atom=j.languages.xml,j.languages.rss=j.languages.xml,a=j,i={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},l="(?:[^\\\\-]|"+(s=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/).source+")",l=RegExp(l+"-"+l),c={pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"},a.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:l,inside:{escape:s,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":i,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:s}},"special-escape":i,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":c}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:s,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,alias:"punctuation",inside:{"group-name":c}},{pattern:/\)/,alias:"punctuation"}],quantifier:{pattern:/(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,alias:"number"},alternation:{pattern:/\|/,alias:"keyword"}},j.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},j.languages.javascript=j.languages.extend("clike",{"class-name":[j.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),j.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,j.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:j.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:j.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:j.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:j.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:j.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),j.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:j.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),j.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),j.languages.markup&&(j.languages.markup.tag.addInlined("script","javascript"),j.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),j.languages.js=j.languages.javascript,j.languages.actionscript=j.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<|>>?>?|[!=]=?)=?|[~?@]/}),j.languages.actionscript["class-name"].alias="function",delete j.languages.actionscript.parameter,delete j.languages.actionscript["literal-property"],j.languages.markup&&j.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:j.languages.markup}}),function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(j),function(e){var t=e.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(t,"addSupport",{value:function(t,n){(t="string"==typeof t?[t]:t).forEach((function(t){var r=function(e){e.inside||(e.inside={}),e.inside.rest=n},o="doc-comment";if(a=e.languages[t]){var a,i=a[o];if((i=i||(a=e.languages.insertBefore(t,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[o])instanceof RegExp&&(i=a[o]={pattern:i}),Array.isArray(i))for(var s=0,l=i.length;s |\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}}),{pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0}),{pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0});e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,number:n})}(j),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",o=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-] )(?:[ \t]*(?:(?![#:]) |: ))*/.source.replace(/ /g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s< >[ \t]+)?)(?:< >)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/< >/g,(function(){return r})).replace(/< >/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s< >[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/< >/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:< >[ \t]+)?)< >(?=\s*:\s)/.source.replace(/< >/g,(function(){return r})).replace(/< >/g,(function(){return"(?:"+o+"|"+a+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(a),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(j),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/ /g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,o=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),a=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source,i=(e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+o+a+"(?:"+o+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+o+a+")(?:"+o+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+o+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+o+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_) |_(?:(?!_) )+_)+__\b|\*\*(?:(?!\*) |\*(?:(?!\*) )+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_) |__(?:(?!_) )+__)+_\b|\*(?:(?!\*) |\*\*(?:(?!\*) )+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~) )+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]) )+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]) )+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n ",quot:'"'},l=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(j),j.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:j.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},j.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n ?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,o=r.inside["interpolation-punctuation"],a=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function s(t,n,r){return t={code:t,grammar:n,language:r},e.hooks.run("before-tokenize",t),t.tokens=e.tokenize(t.code,t.grammar),e.hooks.run("after-tokenize",t),t.tokens}function l(t,n,i){var l=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),c=0,u={},d=(l=s(l.map((function(e){if("string"==typeof e)return e;var n,r;for(e=e.content;-1!==t.indexOf((r=c++,n="___"+i.toUpperCase()+"_"+r+"___")););return u[n]=e,n})).join(""),n,i),Object.keys(u));return c=0,function t(n){for(var a=0;a =d.length)return;var i,l,f,p,h,m,g,y=n[a];"string"==typeof y||"string"==typeof y.content?(i=d[c],-1!==(g=(m="string"==typeof y?y:y.content).indexOf(i))&&(++c,l=m.substring(0,g),h=u[i],f=void 0,(p={})["interpolation-punctuation"]=o,3===(p=e.tokenize(h,p)).length&&((f=[1,1]).push.apply(f,s(p[1],e.languages.javascript,"javascript")),p.splice.apply(p,f)),f=new e.Token("interpolation",p,r.alias,h),p=m.substring(g+i.length),h=[],l&&h.push(l),h.push(f),p&&(t(m=[p]),h.push.apply(h,m)),"string"==typeof y?(n.splice.apply(n,[a,1].concat(h)),a+=h.length-1):y.content=h)):(g=y.content,Array.isArray(g)?t(g):t([g]))}}(l),new e.Token(i,l,"language-"+i,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var c={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function u(e){return"string"==typeof e?e:Array.isArray(e)?e.map(u).join(""):u(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in c&&function t(n){for(var r=0,o=n.length;r ]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(j),function(e){var t=e.languages.javascript,n=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source,r="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(r+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(r+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:t,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?: \s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/ /g,(function(){return n}))),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:t.string,number:t.number,boolean:t.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:t,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(j),function(e){e.languages.flow=e.languages.extend("javascript",{}),e.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),e.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(j),j.languages.n4js=j.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),j.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),j.languages.n4jsd=j.languages.n4js,function(e){function t(e,t){return RegExp(e.replace(/ /g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?: (?:\s*,\s*(?:\*\s*as\s+ |\{[^{}]*\}))?|\*\s*as\s+ |\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+ )?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#? /.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r *\.{3}(?:[^{}]| )*\})/.source;function a(e,t){return e=e.replace(/ /g,(function(){return n})).replace(//g,(function(){return r})).replace(/ /g,(function(){return o})),RegExp(e,t)}function i(t){for(var n=[],r=0;r "!==o.content[o.content.length-1].content&&n.push({tagName:s(o.content[0].content[1]),openedBraces:0}):0 +(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+| ))?| ))* *\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:a(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:a(/= /.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var s=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(s).join(""):""};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||i(e.tokens)}))}(j),function(e){var t=e.util.clone(e.languages.typescript);(t=(e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"],e.languages.tsx.tag)).pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+t.pattern.source+")",t.pattern.flags),t.lookbehind=!0}(j),j.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ \t]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},j.languages.swift["string-literal"].forEach((function(e){e.inside.interpolation.inside=j.languages.swift})),function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(j),j.languages.c=j.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),j.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),j.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},j.languages.c.string],char:j.languages.c.char,comment:j.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:j.languages.c}}}}),j.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete j.languages.c.boolean,j.languages.objectivec=j.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete j.languages.objectivec["class-name"],j.languages.objc=j.languages.objectivec,j.languages.reason=j.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),j.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete j.languages.reason.function,function(e){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)| )*\*\//.source,n=0;n<2;n++)t=t.replace(/ /g,(function(){return t}));t=t.replace(/ /g,(function(){return/[^\s\S]/.source})),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<=?|>>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(j),j.languages.go=j.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),j.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete j.languages.go["class-name"],function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?! )\w+(?:\s*\.\s*\w+)*\b/.source.replace(/ /g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?! )\w+/.source.replace(/ /g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/ (?:\s*:\s* )?|:\s* /.source.replace(/ /g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(j),j.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},j.languages.python["string-interpolation"].inside.interpolation.inside.rest=j.languages.python,j.languages.py=j.languages.python,j.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},j.languages.webmanifest=j.languages.json;((e,t)=>{for(var n in t)p(e,n,{get:t[n],enumerable:!0})})({},{dracula:()=>P,duotoneDark:()=>C,duotoneLight:()=>A,github:()=>T,gruvboxMaterialDark:()=>G,gruvboxMaterialLight:()=>K,jettwaveDark:()=>V,jettwaveLight:()=>Q,nightOwl:()=>I,nightOwlLight:()=>N,oceanicNext:()=>D,okaidia:()=>F,oneDark:()=>W,oneLight:()=>q,palenight:()=>M,shadesOfPurple:()=>B,synthwave84:()=>z,ultramin:()=>$,vsDark:()=>U,vsLight:()=>H});var P={plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},C={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},A={plain:{backgroundColor:"#faf8f5",color:"#728fcb"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#b6ad9a"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#063289"}},{types:["property","function"],style:{color:"#b29762"}},{types:["tag-id","selector","atrule-id"],style:{color:"#2d2006"}},{types:["attr-name"],style:{color:"#896724"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule"],style:{color:"#728fcb"}},{types:["placeholder","variable"],style:{color:"#93abdc"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#896724"}}]},T={plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},I={plain:{color:"#d6deeb",backgroundColor:"#011627"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(99, 119, 119)",fontStyle:"italic"}},{types:["string","url"],style:{color:"rgb(173, 219, 103)"}},{types:["variable"],style:{color:"rgb(214, 222, 235)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation"],style:{color:"rgb(199, 146, 234)"}},{types:["selector","doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(255, 203, 139)"}},{types:["tag","operator","keyword"],style:{color:"rgb(127, 219, 202)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["property"],style:{color:"rgb(128, 203, 196)"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}}]},N={plain:{color:"#403f53",backgroundColor:"#FBFBFB"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(72, 118, 214)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(152, 159, 177)",fontStyle:"italic"}},{types:["string","builtin","char","constant","url"],style:{color:"rgb(72, 118, 214)"}},{types:["variable"],style:{color:"rgb(201, 103, 101)"}},{types:["number"],style:{color:"rgb(170, 9, 130)"}},{types:["punctuation"],style:{color:"rgb(153, 76, 195)"}},{types:["function","selector","doctype"],style:{color:"rgb(153, 76, 195)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(17, 17, 17)"}},{types:["tag"],style:{color:"rgb(153, 76, 195)"}},{types:["operator","property","keyword","namespace"],style:{color:"rgb(12, 150, 155)"}},{types:["boolean"],style:{color:"rgb(188, 84, 84)"}}]},L="#c5a5c5",R="#8dc891",D={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:L}},{types:["attr-value"],style:{color:R}},{types:["comment","block-comment","prolog","doctype","cdata","shebang"],style:{color:"#999999"}},{types:["property","number","function-name","constant","symbol","deleted"],style:{color:"#5a9bcf"}},{types:["boolean"],style:{color:"#ff8b50"}},{types:["tag"],style:{color:"#fc929e"}},{types:["string"],style:{color:R}},{types:["punctuation"],style:{color:R}},{types:["selector","char","builtin","inserted"],style:{color:"#D8DEE9"}},{types:["function"],style:{color:"#79b6f2"}},{types:["operator","entity","url","variable"],style:{color:"#d7deea"}},{types:["keyword"],style:{color:L}},{types:["atrule","class-name"],style:{color:"#FAC863"}},{types:["important"],style:{fontWeight:"400"}},{types:["bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}}]},F={plain:{color:"#f8f8f2",backgroundColor:"#272822"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"#f92672",fontStyle:"italic"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"#8292a2",fontStyle:"italic"}},{types:["string","url"],style:{color:"#a6e22e"}},{types:["variable"],style:{color:"#f8f8f2"}},{types:["number"],style:{color:"#ae81ff"}},{types:["builtin","char","constant","function","class-name"],style:{color:"#e6db74"}},{types:["punctuation"],style:{color:"#f8f8f2"}},{types:["selector","doctype"],style:{color:"#a6e22e",fontStyle:"italic"}},{types:["tag","operator","keyword"],style:{color:"#66d9ef"}},{types:["boolean"],style:{color:"#ae81ff"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)",opacity:.7}},{types:["tag","property"],style:{color:"#f92672"}},{types:["attr-name"],style:{color:"#a6e22e !important"}},{types:["doctype"],style:{color:"#8292a2"}},{types:["rule"],style:{color:"#e6db74"}}]},M={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string","inserted"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag","deleted"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]},B={plain:{color:"#9EFEFF",backgroundColor:"#2D2A55"},styles:[{types:["changed"],style:{color:"rgb(255, 238, 128)"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)"}},{types:["comment"],style:{color:"rgb(179, 98, 255)",fontStyle:"italic"}},{types:["punctuation"],style:{color:"rgb(255, 255, 255)"}},{types:["constant"],style:{color:"rgb(255, 98, 140)"}},{types:["string","url"],style:{color:"rgb(165, 255, 144)"}},{types:["variable"],style:{color:"rgb(255, 238, 128)"}},{types:["number","boolean"],style:{color:"rgb(255, 98, 140)"}},{types:["attr-name"],style:{color:"rgb(255, 180, 84)"}},{types:["keyword","operator","property","namespace","tag","selector","doctype"],style:{color:"rgb(255, 157, 0)"}},{types:["builtin","char","constant","function","class-name"],style:{color:"rgb(250, 208, 0)"}}]},z={plain:{backgroundColor:"linear-gradient(to bottom, #2a2139 75%, #34294f)",backgroundImage:"#34294f",color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},styles:[{types:["comment","block-comment","prolog","doctype","cdata"],style:{color:"#495495",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#ccc"}},{types:["tag","attr-name","namespace","number","unit","hexcode","deleted"],style:{color:"#e2777a"}},{types:["property","selector"],style:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"}},{types:["function-name"],style:{color:"#6196cc"}},{types:["boolean","selector-id","function"],style:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"}},{types:["class-name","maybe-class-name","builtin"],style:{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"}},{types:["constant","symbol"],style:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"}},{types:["important","atrule","keyword","selector-class"],style:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"}},{types:["string","char","attr-value","regex","variable"],style:{color:"#f87c32"}},{types:["parameter"],style:{fontStyle:"italic"}},{types:["entity","url"],style:{color:"#67cdcc"}},{types:["operator"],style:{color:"ffffffee"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["entity"],style:{cursor:"help"}},{types:["inserted"],style:{color:"green"}}]},$={plain:{color:"#282a2e",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(197, 200, 198)"}},{types:["string","number","builtin","variable"],style:{color:"rgb(150, 152, 150)"}},{types:["class-name","function","tag","attr-name"],style:{color:"rgb(40, 42, 46)"}}]},U={plain:{color:"#9CDCFE",backgroundColor:"#1E1E1E"},styles:[{types:["prolog"],style:{color:"rgb(0, 0, 128)"}},{types:["comment"],style:{color:"rgb(106, 153, 85)"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"rgb(86, 156, 214)"}},{types:["number","inserted"],style:{color:"rgb(181, 206, 168)"}},{types:["constant"],style:{color:"rgb(100, 102, 149)"}},{types:["attr-name","variable"],style:{color:"rgb(156, 220, 254)"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"rgb(206, 145, 120)"}},{types:["selector"],style:{color:"rgb(215, 186, 125)"}},{types:["tag"],style:{color:"rgb(78, 201, 176)"}},{types:["tag"],languages:["markup"],style:{color:"rgb(86, 156, 214)"}},{types:["punctuation","operator"],style:{color:"rgb(212, 212, 212)"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"rgb(220, 220, 170)"}},{types:["class-name"],style:{color:"rgb(78, 201, 176)"}},{types:["char"],style:{color:"rgb(209, 105, 105)"}}]},H={plain:{color:"#000000",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(0, 128, 0)"}},{types:["builtin"],style:{color:"rgb(0, 112, 193)"}},{types:["number","variable","inserted"],style:{color:"rgb(9, 134, 88)"}},{types:["operator"],style:{color:"rgb(0, 0, 0)"}},{types:["constant","char"],style:{color:"rgb(129, 31, 63)"}},{types:["tag"],style:{color:"rgb(128, 0, 0)"}},{types:["attr-name"],style:{color:"rgb(255, 0, 0)"}},{types:["deleted","string"],style:{color:"rgb(163, 21, 21)"}},{types:["changed","punctuation"],style:{color:"rgb(4, 81, 165)"}},{types:["function","keyword"],style:{color:"rgb(0, 0, 255)"}},{types:["class-name"],style:{color:"rgb(38, 127, 153)"}}]},V={plain:{color:"#f8fafc",backgroundColor:"#011627"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#569CD6"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#f8fafc"}},{types:["attr-name","variable"],style:{color:"#9CDCFE"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#cbd5e1"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#D4D4D4"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#7dd3fc"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},Q={plain:{color:"#0f172a",backgroundColor:"#f1f5f9"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#0c4a6e"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#0f172a"}},{types:["attr-name","variable"],style:{color:"#0c4a6e"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#64748b"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#475569"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#0e7490"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},W={plain:{backgroundColor:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(220, 10%, 40%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(220, 14%, 71%)"}},{types:["attr-name","class-name","maybe-class-name","boolean","constant","number","atrule"],style:{color:"hsl(29, 54%, 61%)"}},{types:["keyword"],style:{color:"hsl(286, 60%, 67%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(355, 65%, 65%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value"],style:{color:"hsl(95, 38%, 62%)"}},{types:["variable","operator","function"],style:{color:"hsl(207, 82%, 66%)"}},{types:["url"],style:{color:"hsl(187, 47%, 55%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(220, 14%, 71%)"}}]},q={plain:{backgroundColor:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(230, 4%, 64%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(230, 8%, 24%)"}},{types:["attr-name","class-name","boolean","constant","number","atrule"],style:{color:"hsl(35, 99%, 36%)"}},{types:["keyword"],style:{color:"hsl(301, 63%, 40%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(5, 74%, 59%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value","punctuation"],style:{color:"hsl(119, 34%, 47%)"}},{types:["variable","operator","function"],style:{color:"hsl(221, 87%, 60%)"}},{types:["url"],style:{color:"hsl(198, 99%, 37%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(230, 8%, 24%)"}}]},G={plain:{color:"#ebdbb2",backgroundColor:"#292828"},styles:[{types:["imports","class-name","maybe-class-name","constant","doctype","builtin","function"],style:{color:"#d8a657"}},{types:["property-access"],style:{color:"#7daea3"}},{types:["tag"],style:{color:"#e78a4e"}},{types:["attr-name","char","url","regex"],style:{color:"#a9b665"}},{types:["attr-value","string"],style:{color:"#89b482"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#ea6962"}},{types:["entity","number","symbol"],style:{color:"#d3869b"}}]},K={plain:{color:"#654735",backgroundColor:"#f9f5d7"},styles:[{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#af2528"}},{types:["imports","class-name","maybe-class-name","constant","doctype","builtin"],style:{color:"#b4730e"}},{types:["string","attr-value"],style:{color:"#477a5b"}},{types:["property-access"],style:{color:"#266b79"}},{types:["function","attr-name","char","url"],style:{color:"#72761e"}},{types:["tag"],style:{color:"#b94c07"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["entity","number","symbol"],style:{color:"#924f79"}}]},Y=/\r\n|\r|\n/,Z=e=>{0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},X=(e,t)=>{const n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)},J=e=>{const t=[[]],n=[e],r=[0],o=[e.length];let a=0,i=0,s=[];const l=[s];for(;i>-1;){for(;(a=r[i]++) 0?c:["plain"],e=u):(c=X(c,u.type),u.alias&&(c=X(c,u.alias)),e=u.content),"string"!=typeof e){i++,t.push(c),n.push(e),r.push(0),o.push(e.length);continue}const d=e.split(Y),f=d.length;s.push({types:c,content:d[0]});for(let t=1;t {const{plain:n}=e,r=e.styles.reduce(((e,n)=>{const{languages:r,style:o}=n;return r&&!r.includes(t)||n.types.forEach((t=>{const n=k(k({},e[t]),o);e[t]=n})),e}),{});return r.root=n,r.plain=x(k({},n),{backgroundColor:void 0}),r},te=({children:e,language:t,code:n,theme:r,prism:o})=>{const a=t.toLowerCase(),i=ee(r,a),s=(e=>(0,u.useCallback)((t=>{var n=t,{className:r,style:o,line:a}=n,i=E(n,["className","style","line"]);const s=x(k({},i),{className:(0,d.A)("token-line",r)});return"object"==typeof e&&"plain"in e&&(s.style=e.plain),"object"==typeof o&&(s.style=k(k({},s.style||{}),o)),s}),[e]))(i),l=(e=>{const t=(0,u.useCallback)((({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map((t=>e[t])))}),[e]);return(0,u.useCallback)((e=>{var n=e,{token:r,className:o,style:a}=n,i=E(n,["token","className","style"]);const s=x(k({},i),{className:(0,d.A)("token",...r.types,o),children:r.content,style:t(r)});return null!=a&&(s.style=k(k({},s.style||{}),a)),s}),[t])})(i),c=(({prism:e,code:t,grammar:n,language:r})=>(0,u.useMemo)((()=>{if(null==n)return J([t]);const o={code:t,grammar:n,language:r,tokens:[]};return e.hooks.run("before-tokenize",o),o.tokens=e.tokenize(t,n),e.hooks.run("after-tokenize",o),J(o.tokens)}),[t,n,r,e]))({prism:o,language:a,code:n,grammar:o.languages[a]});return e({tokens:c,className:`prism-code language-${a}`,style:null!=i?i.root:{},getLineProps:s,getTokenProps:l})},ne=e=>(0,u.createElement)(te,x(k({},e),{prism:e.prism||j,theme:e.theme||U,code:e.code,language:e.language}))},1561:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=!0,o="Invariant failed";function a(e,t){if(!e){if(r)throw new Error(o);var n="function"==typeof t?t():t,a=n?"".concat(o,": ").concat(n):o;throw new Error(a)}}},1635:(e,t,n)=>{"use strict";n.r(t),n.d(t,{__addDisposableResource:()=>R,__assign:()=>a,__asyncDelegator:()=>E,__asyncGenerator:()=>x,__asyncValues:()=>O,__await:()=>k,__awaiter:()=>h,__classPrivateFieldGet:()=>I,__classPrivateFieldIn:()=>L,__classPrivateFieldSet:()=>N,__createBinding:()=>g,__decorate:()=>s,__disposeResources:()=>F,__esDecorate:()=>c,__exportStar:()=>y,__extends:()=>o,__generator:()=>m,__importDefault:()=>T,__importStar:()=>A,__makeTemplateObject:()=>j,__metadata:()=>p,__param:()=>l,__propKey:()=>d,__read:()=>v,__rest:()=>i,__rewriteRelativeImportExtension:()=>M,__runInitializers:()=>u,__setFunctionName:()=>f,__spread:()=>w,__spreadArray:()=>S,__spreadArrays:()=>_,__values:()=>b,default:()=>B});var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)};function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var a=function(){return a=Object.assign||function(e){for(var t,n=1,r=arguments.length;n =0;s--)(o=e[s])&&(i=(a<3?o(i):a>3?o(t,n,i):o(t,n))||i);return a>3&&i&&Object.defineProperty(t,n,i),i}function l(e,t){return function(n,r){t(n,r,e)}}function c(e,t,n,r,o,a){function i(e){if(void 0!==e&&"function"!=typeof e)throw new TypeError("Function expected");return e}for(var s,l=r.kind,c="getter"===l?"get":"setter"===l?"set":"value",u=!t&&e?r.static?e:e.prototype:null,d=t||(u?Object.getOwnPropertyDescriptor(u,r.name):{}),f=!1,p=n.length-1;p>=0;p--){var h={};for(var m in r)h[m]="access"===m?{}:r[m];for(var m in r.access)h.access[m]=r.access[m];h.addInitializer=function(e){if(f)throw new TypeError("Cannot add initializers after decoration has completed");a.push(i(e||null))};var g=(0,n[p])("accessor"===l?{get:d.get,set:d.set}:d[c],h);if("accessor"===l){if(void 0===g)continue;if(null===g||"object"!=typeof g)throw new TypeError("Object expected");(s=i(g.get))&&(d.get=s),(s=i(g.set))&&(d.set=s),(s=i(g.init))&&o.unshift(s)}else(s=i(g))&&("field"===l?o.unshift(s):d[c]=s)}u&&Object.defineProperty(u,r.name,d),f=!0}function u(e,t,n){for(var r=arguments.length>2,o=0;o 0&&o[o.length-1])||6!==s[0]&&2!==s[0])){a=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1] =e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function v(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,a=n.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(r=a.next()).done;)i.push(r.value)}catch(s){o={error:s}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return i}function w(){for(var e=[],t=0;t 1||s(e,t)}))},t&&(r[e]=t(r[e])))}function s(e,t){try{(n=o[e](t)).value instanceof k?Promise.resolve(n.value.v).then(l,c):u(a[0][2],n)}catch(r){u(a[0][3],r)}var n}function l(e){s("next",e)}function c(e){s("throw",e)}function u(e,t){e(t),a.shift(),a.length&&s(a[0][0],a[0][1])}}function E(e){var t,n;return t={},r("next"),r("throw",(function(e){throw e})),r("return"),t[Symbol.iterator]=function(){return this},t;function r(r,o){t[r]=e[r]?function(t){return(n=!n)?{value:k(e[r](t)),done:!1}:o?o(t):t}:o}}function O(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=b(e),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise((function(r,o){(function(e,t,n,r){Promise.resolve(r).then((function(t){e({value:t,done:n})}),t)})(r,o,(t=e[n](t)).done,t.value)}))}}}function j(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}var P=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t},C=function(e){return C=Object.getOwnPropertyNames||function(e){var t=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[t.length]=n);return t},C(e)};function A(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n=C(e),r=0;r {"use strict";e.exports=JSON.parse('{"cmfcmf/d-s-l.searchBar.placeholder":"Search...","cmfcmf/d-s-l.searchBar.noResults":"No results found.","cmfcmf/d-s-l.searchBar.clearButtonTitle":"Clear","cmfcmf/d-s-l.searchBar.detachedCancelButtonText":"Cancel","cmfcmf/d-s-l.searchBar.submitButtonTitle":"Submit"}')},4054:e=>{"use strict";e.exports=JSON.parse('{"/changelog/-e55":{"__comp":"a6aa9e1f","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"167c766c"}],"__props":"e2a9a4b8"},"/changelog/archive/-7bb":{"__comp":"9e4087bc","__context":{"plugin":"36994c47"},"__props":"17ceec3f"},"/changelog/changelog-0.11.1/-01b":{"__comp":"ccc49370","__context":{"data":{"blogMetadata":"acecf23e"},"plugin":"36994c47"},"sidebar":"814f3328","content":"e8006827"},"/changelog/tags/-edf":{"__comp":"01a85c17","__context":{"plugin":"36994c47"},"sidebar":"814f3328","__props":"6772df6c"},"/changelog/tags/a-9-s/-741":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"167c766c"}],"__props":"c80e5f88"},"/changelog/tags/changelog/-d3c":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"167c766c"}],"__props":"3841b242"},"/changelog/tags/release/-c43":{"__comp":"6875c492","__context":{"plugin":"36994c47"},"sidebar":"814f3328","items":[{"content":"167c766c"}],"__props":"7a733630"},"/markdown-page/-54d":{"__comp":"1f391b9e","__context":{"plugin":"a7456010"},"content":"393be207"},"/docs/-2b9":{"__comp":"5e95c892","__context":{"plugin":"aba21aa0"}},"/docs/0.13.0/-50f":{"__comp":"a7bd4aaa","__props":"9765d1f4"},"/docs/0.13.0/tags/-4bd":{"__comp":"3720c009","__props":"a019e40b"},"/docs/0.13.0/tags/a-8-s-data-services/-4ea":{"__comp":"df203c0f","__props":"564fc82a"},"/docs/0.13.0/tags/a-8-s-postgres/-08d":{"__comp":"df203c0f","__props":"7fa8dbab"},"/docs/0.13.0/tags/a-9-s-cli/-71e":{"__comp":"df203c0f","__props":"a46e34d1"},"/docs/0.13.0/tags/a-9-s-data-services/-0a6":{"__comp":"df203c0f","__props":"20da2af4"},"/docs/0.13.0/tags/a-9-s-hub/-693":{"__comp":"df203c0f","__props":"11b7a020"},"/docs/0.13.0/tags/a-9-s-postgres/-ae2":{"__comp":"df203c0f","__props":"5fcb3aa6"},"/docs/0.13.0/tags/data-service/-378":{"__comp":"df203c0f","__props":"e264bb36"},"/docs/0.13.0/tags/introduction/-1a7":{"__comp":"df203c0f","__props":"83e7349b"},"/docs/0.13.0/tags/kind/-2f5":{"__comp":"df203c0f","__props":"34a91cba"},"/docs/0.13.0/tags/kubernetes/-a0e":{"__comp":"df203c0f","__props":"aa7dd896"},"/docs/0.13.0/tags/minikube/-5e3":{"__comp":"df203c0f","__props":"b6021fd9"},"/docs/0.13.0/tags/tutorial/-1f4":{"__comp":"df203c0f","__props":"c76a67aa"},"/docs/0.13.0/tags/tutorials/-30e":{"__comp":"df203c0f","__props":"02c8af25"},"/docs/0.13.0/-daf":{"__comp":"a94703ab"},"/docs/0.13.0/a9s-cli/-913":{"__comp":"17896441","content":"d9bdb70b"},"/docs/0.13.0/hands-on-tutorials/-849":{"__comp":"17896441","content":"1bed8fa8"},"/docs/0.13.0/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/-6e3":{"__comp":"17896441","content":"e555076a"},"/docs/0.13.1/-b99":{"__comp":"a7bd4aaa","__props":"ccb09cf4"},"/docs/0.13.1/tags/-653":{"__comp":"3720c009","__props":"b2c0482b"},"/docs/0.13.1/tags/a-8-s-data-services/-c65":{"__comp":"df203c0f","__props":"bf00b630"},"/docs/0.13.1/tags/a-8-s-postgres/-4ea":{"__comp":"df203c0f","__props":"ca1c37e3"},"/docs/0.13.1/tags/a-9-s-cli/-40c":{"__comp":"df203c0f","__props":"5a9cefb8"},"/docs/0.13.1/tags/a-9-s-data-services/-113":{"__comp":"df203c0f","__props":"18991abe"},"/docs/0.13.1/tags/a-9-s-hub/-6e2":{"__comp":"df203c0f","__props":"1e6038a0"},"/docs/0.13.1/tags/a-9-s-postgres/-d6f":{"__comp":"df203c0f","__props":"4fba34d3"},"/docs/0.13.1/tags/data-service/-40e":{"__comp":"df203c0f","__props":"e5ee3500"},"/docs/0.13.1/tags/introduction/-89b":{"__comp":"df203c0f","__props":"a4b8ed33"},"/docs/0.13.1/tags/kind/-e55":{"__comp":"df203c0f","__props":"5feb6b60"},"/docs/0.13.1/tags/kubernetes/-a5b":{"__comp":"df203c0f","__props":"394f3b94"},"/docs/0.13.1/tags/minikube/-df8":{"__comp":"df203c0f","__props":"b5cf070d"},"/docs/0.13.1/tags/tutorial/-098":{"__comp":"df203c0f","__props":"109e9327"},"/docs/0.13.1/tags/tutorials/-e74":{"__comp":"df203c0f","__props":"8b11db2f"},"/docs/0.13.1/-32b":{"__comp":"a94703ab"},"/docs/0.13.1/a9s-cli/-a10":{"__comp":"17896441","content":"1cd7d199"},"/docs/0.13.1/hands-on-tutorials/-f26":{"__comp":"17896441","content":"21aa04c8"},"/docs/0.13.1/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/-e50":{"__comp":"17896441","content":"42ebd64a"},"/docs/develop/-db4":{"__comp":"a7bd4aaa","__props":"7321275f"},"/docs/develop/tags/-db9":{"__comp":"3720c009","__props":"47bcf3f9"},"/docs/develop/tags/a-8-s-data-services/-660":{"__comp":"df203c0f","__props":"00a997aa"},"/docs/develop/tags/a-8-s-postgres/-7e4":{"__comp":"df203c0f","__props":"9f646831"},"/docs/develop/tags/a-9-s-cli/-be1":{"__comp":"df203c0f","__props":"2ead3a23"},"/docs/develop/tags/a-9-s-data-services/-097":{"__comp":"df203c0f","__props":"83869130"},"/docs/develop/tags/a-9-s-hub/-e70":{"__comp":"df203c0f","__props":"1cc1e508"},"/docs/develop/tags/a-9-s-postgres/-973":{"__comp":"df203c0f","__props":"1fd819d3"},"/docs/develop/tags/data-service/-761":{"__comp":"df203c0f","__props":"e90aeb31"},"/docs/develop/tags/introduction/-150":{"__comp":"df203c0f","__props":"3f735f2f"},"/docs/develop/tags/kind/-f9d":{"__comp":"df203c0f","__props":"569be754"},"/docs/develop/tags/klutch/-e53":{"__comp":"df203c0f","__props":"8a22d297"},"/docs/develop/tags/kubernetes/-f5a":{"__comp":"df203c0f","__props":"25e181b4"},"/docs/develop/tags/minikube/-2d9":{"__comp":"df203c0f","__props":"2d1935e8"},"/docs/develop/tags/tutorial/-a6f":{"__comp":"df203c0f","__props":"9fd9d706"},"/docs/develop/tags/tutorials/-3cf":{"__comp":"df203c0f","__props":"5d826cac"},"/docs/develop/-b7b":{"__comp":"a94703ab"},"/docs/develop/a9s-cli-a8s/-46a":{"__comp":"17896441","content":"af805925"},"/docs/develop/a9s-cli-klutch/-3f5":{"__comp":"17896441","content":"13ead1de"},"/docs/develop/a9s-cli/-c21":{"__comp":"17896441","content":"02875b28"},"/docs/develop/hands-on-tutorials/-759":{"__comp":"17896441","content":"fd3e93ab"},"/docs/develop/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/-2c1":{"__comp":"17896441","content":"587d9a20"},"/docs/-923":{"__comp":"a7bd4aaa","__props":"11b43341"},"/docs/tags/-dc9":{"__comp":"3720c009","__props":"36c171c8"},"/docs/tags/a-8-s-data-services/-23d":{"__comp":"df203c0f","__props":"91cfe65a"},"/docs/tags/a-8-s-postgres/-881":{"__comp":"df203c0f","__props":"19f0d3e7"},"/docs/tags/a-9-s-cli/-2ef":{"__comp":"df203c0f","__props":"f015a59b"},"/docs/tags/a-9-s-data-services/-896":{"__comp":"df203c0f","__props":"9877f6c0"},"/docs/tags/a-9-s-hub/-b1b":{"__comp":"df203c0f","__props":"5815bd71"},"/docs/tags/a-9-s-postgres/-6b3":{"__comp":"df203c0f","__props":"7c1241f1"},"/docs/tags/data-service/-e35":{"__comp":"df203c0f","__props":"59a86f76"},"/docs/tags/introduction/-74a":{"__comp":"df203c0f","__props":"fa875745"},"/docs/tags/kind/-d98":{"__comp":"df203c0f","__props":"58277bbf"},"/docs/tags/klutch/-fab":{"__comp":"df203c0f","__props":"c3f580cd"},"/docs/tags/kubernetes/-aa9":{"__comp":"df203c0f","__props":"017bd477"},"/docs/tags/minikube/-b66":{"__comp":"df203c0f","__props":"4fa24cac"},"/docs/tags/tutorial/-f72":{"__comp":"df203c0f","__props":"801cbd99"},"/docs/tags/tutorials/-443":{"__comp":"df203c0f","__props":"49ba2875"},"/docs/-ebb":{"__comp":"a94703ab"},"/docs/a9s-cli-a8s/-f03":{"__comp":"17896441","content":"0914dfc1"},"/docs/a9s-cli-klutch/-7c6":{"__comp":"17896441","content":"cedda78d"},"/docs/a9s-cli/-b40":{"__comp":"17896441","content":"92f3bebb"},"/docs/hands-on-tutorials/-e3a":{"__comp":"17896441","content":"edcf5004"},"/docs/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/-d9e":{"__comp":"17896441","content":"14ebb456"},"/-2e1":{"__comp":"c4f5d8e4","__context":{"plugin":"a7456010"},"config":"5e9f5e1a"}}')}},e=>{e.O(0,[1869],(()=>{return t=5022,e(e.s=t);var t}));e.O()}]); \ No newline at end of file diff --git a/assets/js/main.40588ed8.js.LICENSE.txt b/assets/js/main.31207828.js.LICENSE.txt similarity index 100% rename from assets/js/main.40588ed8.js.LICENSE.txt rename to assets/js/main.31207828.js.LICENSE.txt diff --git a/assets/js/main.40588ed8.js b/assets/js/main.40588ed8.js deleted file mode 100644 index baf3027..0000000 --- a/assets/js/main.40588ed8.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.40588ed8.js.LICENSE.txt */ -(self.webpackChunkanynines_docs=self.webpackChunkanynines_docs||[]).push([[8792],{8641:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});n(6540);var r=n(3259),o=n.n(r),a=n(4054);const i={"00a997aa":[()=>n.e(7211).then(n.t.bind(n,7591,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-a-8-s-data-services-f43.json",7591],"017bd477":[()=>n.e(1239).then(n.t.bind(n,7983,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-kubernetes-df1.json",7983],"01a85c17":[()=>Promise.all([n.e(1869),n.e(8209)]).then(n.bind(n,7373)),"@theme/BlogTagsListPage",7373],"02875b28":[()=>n.e(7041).then(n.bind(n,4893)),"@site/docs/a9s-cli-index.md",4893],"02c8af25":[()=>n.e(4342).then(n.t.bind(n,1126,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-tutorials-fbb.json",1126],"0914dfc1":[()=>n.e(3459).then(n.bind(n,1914)),"@site/versioned_docs/version-0.14.0/a9s-cli-a8s.md",1914],"109e9327":[()=>n.e(1543).then(n.t.bind(n,9808,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-tutorial-68d.json",9808],"11b43341":[()=>n.e(2256).then(n.t.bind(n,5293,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-7fc.json",5293],"11b7a020":[()=>n.e(4369).then(n.t.bind(n,5905,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-a-9-s-hub-4dc.json",5905],"13ead1de":[()=>n.e(9821).then(n.bind(n,5200)),"@site/docs/a9s-cli-klutch.md",5200],"14ebb456":[()=>n.e(6082).then(n.bind(n,1978)),"@site/versioned_docs/version-0.14.0/hands-on-tutorials/a9s-cli-a8s-postgresql.md",1978],"167c766c":[()=>n.e(7510).then(n.bind(n,7562)),"@site/changelog/2024-02-29-version-0.11.1.md?truncated=true",7562],17896441:[()=>Promise.all([n.e(1869),n.e(3676),n.e(8401)]).then(n.bind(n,7059)),"@theme/DocItem",7059],"17ceec3f":[()=>n.e(9092).then(n.t.bind(n,9528,19)),"@generated/docusaurus-plugin-content-blog/default/p/changelog-archive-82b.json",9528],"18991abe":[()=>n.e(1187).then(n.t.bind(n,4879,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-a-9-s-data-services-99d.json",4879],"19f0d3e7":[()=>n.e(5700).then(n.t.bind(n,7465,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-a-8-s-postgres-519.json",7465],"1bed8fa8":[()=>n.e(6156).then(n.bind(n,7911)),"@site/versioned_docs/version-0.13.0/hands-on-tutorials/index.md",7911],"1cc1e508":[()=>n.e(2993).then(n.t.bind(n,7798,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-a-9-s-hub-331.json",7798],"1cd7d199":[()=>n.e(7775).then(n.bind(n,5523)),"@site/versioned_docs/version-0.13.1/a9s-cli.md",5523],"1e6038a0":[()=>n.e(5445).then(n.t.bind(n,2080,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-a-9-s-hub-8c6.json",2080],"1f391b9e":[()=>Promise.all([n.e(1869),n.e(3676),n.e(6061)]).then(n.bind(n,1485)),"@theme/MDXPage",1485],"1fd819d3":[()=>n.e(4887).then(n.t.bind(n,7522,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-a-9-s-postgres-eff.json",7522],"20da2af4":[()=>n.e(7349).then(n.t.bind(n,1832,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-a-9-s-data-services-237.json",1832],"21aa04c8":[()=>n.e(1311).then(n.bind(n,7914)),"@site/versioned_docs/version-0.13.1/hands-on-tutorials/index.md",7914],"25e181b4":[()=>n.e(4409).then(n.t.bind(n,8100,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-kubernetes-72c.json",8100],"2d1935e8":[()=>n.e(1536).then(n.t.bind(n,343,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-minikube-171.json",343],"2ead3a23":[()=>n.e(3202).then(n.t.bind(n,2936,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-a-9-s-cli-23a.json",2936],"34a91cba":[()=>n.e(6927).then(n.t.bind(n,6840,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-kind-e95.json",6840],"36994c47":[()=>n.e(9858).then(n.t.bind(n,5516,19)),"@generated/docusaurus-plugin-content-blog/default/__plugin.json",5516],"36c171c8":[()=>n.e(9393).then(n.t.bind(n,275,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-e14.json",275],"3720c009":[()=>Promise.all([n.e(1869),n.e(4787)]).then(n.bind(n,9929)),"@theme/DocTagsListPage",9929],"3841b242":[()=>n.e(945).then(n.t.bind(n,4510,19)),"@generated/docusaurus-plugin-content-blog/default/p/changelog-tags-changelog-e9f.json",4510],"393be207":[()=>n.e(4134).then(n.bind(n,8350)),"@site/src/pages/markdown-page.md",8350],"394f3b94":[()=>n.e(2457).then(n.t.bind(n,9179,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-kubernetes-5bb.json",9179],"3f735f2f":[()=>n.e(1155).then(n.t.bind(n,2779,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-introduction-fc4.json",2779],"42ebd64a":[()=>n.e(3399).then(n.bind(n,5592)),"@site/versioned_docs/version-0.13.1/hands-on-tutorials/a9s-cli-a8s-postgresql.md",5592],"47bcf3f9":[()=>n.e(4751).then(n.t.bind(n,3374,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-935.json",3374],"49ba2875":[()=>n.e(9651).then(n.t.bind(n,730,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-tutorials-a60.json",730],"4fa24cac":[()=>n.e(4807).then(n.t.bind(n,4724,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-minikube-790.json",4724],"4fba34d3":[()=>n.e(5856).then(n.t.bind(n,5690,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-a-9-s-postgres-f63.json",5690],"564fc82a":[()=>n.e(1830).then(n.t.bind(n,7962,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-a-8-s-data-services-f05.json",7962],"569be754":[()=>n.e(2752).then(n.t.bind(n,5736,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-kind-bc7.json",5736],"5815bd71":[()=>n.e(2920).then(n.t.bind(n,7903,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-a-9-s-hub-5fc.json",7903],"58277bbf":[()=>n.e(1734).then(n.t.bind(n,4843,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-kind-997.json",4843],"587d9a20":[()=>n.e(4829).then(n.bind(n,9739)),"@site/docs/hands-on-tutorials/a9s-cli-a8s-postgresql.md",9739],"59a86f76":[()=>n.e(4261).then(n.t.bind(n,6765,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-data-service-4f5.json",6765],"5a9cefb8":[()=>n.e(558).then(n.t.bind(n,4163,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-a-9-s-cli-09f.json",4163],"5d826cac":[()=>n.e(8231).then(n.t.bind(n,3222,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-tutorials-115.json",3222],"5e95c892":[()=>n.e(9647).then(n.bind(n,440)),"@theme/DocsRoot",440],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"5fcb3aa6":[()=>n.e(5904).then(n.t.bind(n,7488,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-a-9-s-postgres-c5d.json",7488],"5feb6b60":[()=>n.e(7901).then(n.t.bind(n,2190,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-kind-d93.json",2190],"6772df6c":[()=>n.e(1818).then(n.t.bind(n,6786,19)),"@generated/docusaurus-plugin-content-blog/default/p/changelog-tags-f07.json",6786],"6875c492":[()=>Promise.all([n.e(1869),n.e(3676),n.e(920),n.e(4813)]).then(n.bind(n,8314)),"@theme/BlogTagsPostsPage",8314],"7321275f":[()=>n.e(1478).then(n.t.bind(n,2234,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-eee.json",2234],"7a733630":[()=>n.e(9143).then(n.t.bind(n,8666,19)),"@generated/docusaurus-plugin-content-blog/default/p/changelog-tags-release-b69.json",8666],"7c1241f1":[()=>n.e(8746).then(n.t.bind(n,4411,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-a-9-s-postgres-723.json",4411],"7fa8dbab":[()=>n.e(2800).then(n.t.bind(n,4027,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-a-8-s-postgres-7d5.json",4027],"801cbd99":[()=>n.e(6935).then(n.t.bind(n,7659,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-tutorial-d81.json",7659],"814f3328":[()=>n.e(7472).then(n.t.bind(n,5513,19)),"~blog/default/blog-post-list-prop-default.json",5513],83869130:[()=>n.e(3765).then(n.t.bind(n,4533,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-a-9-s-data-services-dea.json",4533],"83e7349b":[()=>n.e(6700).then(n.t.bind(n,5264,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-introduction-92b.json",5264],"8a22d297":[()=>n.e(8520).then(n.t.bind(n,8011,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-klutch-b06.json",8011],"8b11db2f":[()=>n.e(9585).then(n.t.bind(n,2173,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-tutorials-b55.json",2173],"91cfe65a":[()=>n.e(33).then(n.t.bind(n,3223,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-a-8-s-data-services-4b3.json",3223],"92f3bebb":[()=>n.e(4684).then(n.bind(n,4004)),"@site/versioned_docs/version-0.14.0/a9s-cli-index.md",4004],"9765d1f4":[()=>n.e(4519).then(n.t.bind(n,9731,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-d36.json",9731],"9877f6c0":[()=>n.e(4743).then(n.t.bind(n,5826,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-a-9-s-data-services-06a.json",5826],"9e4087bc":[()=>n.e(2711).then(n.bind(n,4548)),"@theme/BlogArchivePage",4548],"9f646831":[()=>n.e(3618).then(n.t.bind(n,3520,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-a-8-s-postgres-457.json",3520],"9fd9d706":[()=>n.e(554).then(n.t.bind(n,6583,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-tutorial-a3a.json",6583],a019e40b:[()=>n.e(8419).then(n.t.bind(n,7474,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-15b.json",7474],a46e34d1:[()=>n.e(755).then(n.t.bind(n,1436,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-a-9-s-cli-eae.json",1436],a4b8ed33:[()=>n.e(2475).then(n.t.bind(n,2307,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-introduction-e13.json",2307],a6aa9e1f:[()=>Promise.all([n.e(1869),n.e(3676),n.e(920),n.e(7643)]).then(n.bind(n,7605)),"@theme/BlogListPage",7605],a7456010:[()=>n.e(1235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,2341)),"@theme/DocVersionRoot",2341],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,5688)),"@theme/DocRoot",5688],aa7dd896:[()=>n.e(1413).then(n.t.bind(n,6514,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-kubernetes-3f2.json",6514],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],acecf23e:[()=>n.e(1903).then(n.t.bind(n,1912,19)),"~blog/default/blogMetadata-default.json",1912],af805925:[()=>n.e(8603).then(n.bind(n,211)),"@site/docs/a9s-cli-a8s.md",211],b2c0482b:[()=>n.e(5018).then(n.t.bind(n,9377,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-701.json",9377],b5cf070d:[()=>n.e(9476).then(n.t.bind(n,6614,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-minikube-f24.json",6614],b6021fd9:[()=>n.e(1285).then(n.t.bind(n,3280,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-minikube-9f0.json",3280],bf00b630:[()=>n.e(8173).then(n.t.bind(n,8092,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-a-8-s-data-services-39f.json",8092],c3f580cd:[()=>n.e(19).then(n.t.bind(n,9991,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-klutch-f68.json",9991],c4f5d8e4:[()=>Promise.all([n.e(1869),n.e(2634)]).then(n.bind(n,5418)),"@site/src/pages/index.js",5418],c76a67aa:[()=>n.e(3645).then(n.t.bind(n,9542,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-tutorial-117.json",9542],c80e5f88:[()=>n.e(7502).then(n.t.bind(n,1576,19)),"@generated/docusaurus-plugin-content-blog/default/p/changelog-tags-a-9-s-a2d.json",1576],ca1c37e3:[()=>n.e(9481).then(n.t.bind(n,2954,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-a-8-s-postgres-079.json",2954],ccb09cf4:[()=>n.e(1633).then(n.t.bind(n,3010,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-df3.json",3010],ccc49370:[()=>Promise.all([n.e(1869),n.e(3676),n.e(920),n.e(3249)]).then(n.bind(n,8024)),"@theme/BlogPostPage",8024],cedda78d:[()=>n.e(7191).then(n.bind(n,5499)),"@site/versioned_docs/version-0.14.0/a9s-cli-klutch.md",5499],d9bdb70b:[()=>n.e(3347).then(n.bind(n,908)),"@site/versioned_docs/version-0.13.0/a9s-cli.md",908],df203c0f:[()=>Promise.all([n.e(1869),n.e(4279)]).then(n.bind(n,4594)),"@theme/DocTagDocListPage",4594],e264bb36:[()=>n.e(3871).then(n.t.bind(n,4861,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-0-tags-data-service-7f9.json",4861],e2a9a4b8:[()=>n.e(3801).then(n.t.bind(n,3635,19)),"@generated/docusaurus-plugin-content-blog/default/p/changelog-534.json",3635],e555076a:[()=>n.e(7799).then(n.bind(n,2244)),"@site/versioned_docs/version-0.13.0/hands-on-tutorials/a9s-cli-a8s-postgresql.md",2244],e5ee3500:[()=>n.e(6995).then(n.t.bind(n,5259,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-0-13-1-tags-data-service-5ee.json",5259],e8006827:[()=>n.e(5859).then(n.bind(n,5222)),"@site/changelog/2024-02-29-version-0.11.1.md",5222],e90aeb31:[()=>n.e(2485).then(n.t.bind(n,4058,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-develop-tags-data-service-ea0.json",4058],edcf5004:[()=>n.e(888).then(n.bind(n,3500)),"@site/versioned_docs/version-0.14.0/hands-on-tutorials/index.md",3500],f015a59b:[()=>n.e(6976).then(n.t.bind(n,3560,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-a-9-s-cli-b7e.json",3560],fa875745:[()=>n.e(8150).then(n.t.bind(n,7728,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-tags-introduction-1b9.json",7728],fd3e93ab:[()=>n.e(6008).then(n.bind(n,6851)),"@site/docs/hands-on-tutorials/index.md",6851]};var s=n(4848);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var u=n(3800),c=n(7319);function d(e,t){if("*"===e)return o()({loading:l,loader:()=>n.e(5676).then(n.bind(n,5676)),modules:["@theme/NotFound"],webpack:()=>[5676],render(e,t){const n=e.default;return(0,s.jsx)(c.W,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},f=[],p=[],h=(0,u.A)(r);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],f.push(r[1]),p.push(r[2]))})),o().Map({loading:l,loader:d,modules:f,webpack:()=>p,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const l=o.__props;return delete o.__props,(0,s.jsx)(c.W,{value:i,children:(0,s.jsx)(a,{...o,...l,...n})})}})}const f=[{path:"/changelog/",component:d("/changelog/","e55"),exact:!0},{path:"/changelog/archive/",component:d("/changelog/archive/","7bb"),exact:!0},{path:"/changelog/changelog-0.11.1/",component:d("/changelog/changelog-0.11.1/","01b"),exact:!0},{path:"/changelog/tags/",component:d("/changelog/tags/","edf"),exact:!0},{path:"/changelog/tags/a-9-s/",component:d("/changelog/tags/a-9-s/","741"),exact:!0},{path:"/changelog/tags/changelog/",component:d("/changelog/tags/changelog/","d3c"),exact:!0},{path:"/changelog/tags/release/",component:d("/changelog/tags/release/","c43"),exact:!0},{path:"/markdown-page/",component:d("/markdown-page/","54d"),exact:!0},{path:"/docs/",component:d("/docs/","2b9"),routes:[{path:"/docs/0.13.0/",component:d("/docs/0.13.0/","50f"),routes:[{path:"/docs/0.13.0/tags/",component:d("/docs/0.13.0/tags/","4bd"),exact:!0},{path:"/docs/0.13.0/tags/a-8-s-data-services/",component:d("/docs/0.13.0/tags/a-8-s-data-services/","4ea"),exact:!0},{path:"/docs/0.13.0/tags/a-8-s-postgres/",component:d("/docs/0.13.0/tags/a-8-s-postgres/","08d"),exact:!0},{path:"/docs/0.13.0/tags/a-9-s-cli/",component:d("/docs/0.13.0/tags/a-9-s-cli/","71e"),exact:!0},{path:"/docs/0.13.0/tags/a-9-s-data-services/",component:d("/docs/0.13.0/tags/a-9-s-data-services/","0a6"),exact:!0},{path:"/docs/0.13.0/tags/a-9-s-hub/",component:d("/docs/0.13.0/tags/a-9-s-hub/","693"),exact:!0},{path:"/docs/0.13.0/tags/a-9-s-postgres/",component:d("/docs/0.13.0/tags/a-9-s-postgres/","ae2"),exact:!0},{path:"/docs/0.13.0/tags/data-service/",component:d("/docs/0.13.0/tags/data-service/","378"),exact:!0},{path:"/docs/0.13.0/tags/introduction/",component:d("/docs/0.13.0/tags/introduction/","1a7"),exact:!0},{path:"/docs/0.13.0/tags/kind/",component:d("/docs/0.13.0/tags/kind/","2f5"),exact:!0},{path:"/docs/0.13.0/tags/kubernetes/",component:d("/docs/0.13.0/tags/kubernetes/","a0e"),exact:!0},{path:"/docs/0.13.0/tags/minikube/",component:d("/docs/0.13.0/tags/minikube/","5e3"),exact:!0},{path:"/docs/0.13.0/tags/tutorial/",component:d("/docs/0.13.0/tags/tutorial/","1f4"),exact:!0},{path:"/docs/0.13.0/tags/tutorials/",component:d("/docs/0.13.0/tags/tutorials/","30e"),exact:!0},{path:"/docs/0.13.0/",component:d("/docs/0.13.0/","daf"),routes:[{path:"/docs/0.13.0/a9s-cli/",component:d("/docs/0.13.0/a9s-cli/","913"),exact:!0},{path:"/docs/0.13.0/hands-on-tutorials/",component:d("/docs/0.13.0/hands-on-tutorials/","849"),exact:!0},{path:"/docs/0.13.0/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/",component:d("/docs/0.13.0/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/","6e3"),exact:!0}]}]},{path:"/docs/0.13.1/",component:d("/docs/0.13.1/","b99"),routes:[{path:"/docs/0.13.1/tags/",component:d("/docs/0.13.1/tags/","653"),exact:!0},{path:"/docs/0.13.1/tags/a-8-s-data-services/",component:d("/docs/0.13.1/tags/a-8-s-data-services/","c65"),exact:!0},{path:"/docs/0.13.1/tags/a-8-s-postgres/",component:d("/docs/0.13.1/tags/a-8-s-postgres/","4ea"),exact:!0},{path:"/docs/0.13.1/tags/a-9-s-cli/",component:d("/docs/0.13.1/tags/a-9-s-cli/","40c"),exact:!0},{path:"/docs/0.13.1/tags/a-9-s-data-services/",component:d("/docs/0.13.1/tags/a-9-s-data-services/","113"),exact:!0},{path:"/docs/0.13.1/tags/a-9-s-hub/",component:d("/docs/0.13.1/tags/a-9-s-hub/","6e2"),exact:!0},{path:"/docs/0.13.1/tags/a-9-s-postgres/",component:d("/docs/0.13.1/tags/a-9-s-postgres/","d6f"),exact:!0},{path:"/docs/0.13.1/tags/data-service/",component:d("/docs/0.13.1/tags/data-service/","40e"),exact:!0},{path:"/docs/0.13.1/tags/introduction/",component:d("/docs/0.13.1/tags/introduction/","89b"),exact:!0},{path:"/docs/0.13.1/tags/kind/",component:d("/docs/0.13.1/tags/kind/","e55"),exact:!0},{path:"/docs/0.13.1/tags/kubernetes/",component:d("/docs/0.13.1/tags/kubernetes/","a5b"),exact:!0},{path:"/docs/0.13.1/tags/minikube/",component:d("/docs/0.13.1/tags/minikube/","df8"),exact:!0},{path:"/docs/0.13.1/tags/tutorial/",component:d("/docs/0.13.1/tags/tutorial/","098"),exact:!0},{path:"/docs/0.13.1/tags/tutorials/",component:d("/docs/0.13.1/tags/tutorials/","e74"),exact:!0},{path:"/docs/0.13.1/",component:d("/docs/0.13.1/","32b"),routes:[{path:"/docs/0.13.1/a9s-cli/",component:d("/docs/0.13.1/a9s-cli/","a10"),exact:!0},{path:"/docs/0.13.1/hands-on-tutorials/",component:d("/docs/0.13.1/hands-on-tutorials/","f26"),exact:!0},{path:"/docs/0.13.1/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/",component:d("/docs/0.13.1/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/","e50"),exact:!0}]}]},{path:"/docs/develop/",component:d("/docs/develop/","db4"),routes:[{path:"/docs/develop/tags/",component:d("/docs/develop/tags/","db9"),exact:!0},{path:"/docs/develop/tags/a-8-s-data-services/",component:d("/docs/develop/tags/a-8-s-data-services/","660"),exact:!0},{path:"/docs/develop/tags/a-8-s-postgres/",component:d("/docs/develop/tags/a-8-s-postgres/","7e4"),exact:!0},{path:"/docs/develop/tags/a-9-s-cli/",component:d("/docs/develop/tags/a-9-s-cli/","be1"),exact:!0},{path:"/docs/develop/tags/a-9-s-data-services/",component:d("/docs/develop/tags/a-9-s-data-services/","097"),exact:!0},{path:"/docs/develop/tags/a-9-s-hub/",component:d("/docs/develop/tags/a-9-s-hub/","e70"),exact:!0},{path:"/docs/develop/tags/a-9-s-postgres/",component:d("/docs/develop/tags/a-9-s-postgres/","973"),exact:!0},{path:"/docs/develop/tags/data-service/",component:d("/docs/develop/tags/data-service/","761"),exact:!0},{path:"/docs/develop/tags/introduction/",component:d("/docs/develop/tags/introduction/","150"),exact:!0},{path:"/docs/develop/tags/kind/",component:d("/docs/develop/tags/kind/","f9d"),exact:!0},{path:"/docs/develop/tags/klutch/",component:d("/docs/develop/tags/klutch/","e53"),exact:!0},{path:"/docs/develop/tags/kubernetes/",component:d("/docs/develop/tags/kubernetes/","f5a"),exact:!0},{path:"/docs/develop/tags/minikube/",component:d("/docs/develop/tags/minikube/","2d9"),exact:!0},{path:"/docs/develop/tags/tutorial/",component:d("/docs/develop/tags/tutorial/","a6f"),exact:!0},{path:"/docs/develop/tags/tutorials/",component:d("/docs/develop/tags/tutorials/","3cf"),exact:!0},{path:"/docs/develop/",component:d("/docs/develop/","b7b"),routes:[{path:"/docs/develop/a9s-cli-a8s/",component:d("/docs/develop/a9s-cli-a8s/","46a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/develop/a9s-cli-klutch/",component:d("/docs/develop/a9s-cli-klutch/","3f5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/develop/a9s-cli/",component:d("/docs/develop/a9s-cli/","c21"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/develop/hands-on-tutorials/",component:d("/docs/develop/hands-on-tutorials/","759"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/develop/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/",component:d("/docs/develop/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/","2c1"),exact:!0,sidebar:"tutorialSidebar"}]}]},{path:"/docs/",component:d("/docs/","923"),routes:[{path:"/docs/tags/",component:d("/docs/tags/","dc9"),exact:!0},{path:"/docs/tags/a-8-s-data-services/",component:d("/docs/tags/a-8-s-data-services/","23d"),exact:!0},{path:"/docs/tags/a-8-s-postgres/",component:d("/docs/tags/a-8-s-postgres/","881"),exact:!0},{path:"/docs/tags/a-9-s-cli/",component:d("/docs/tags/a-9-s-cli/","2ef"),exact:!0},{path:"/docs/tags/a-9-s-data-services/",component:d("/docs/tags/a-9-s-data-services/","896"),exact:!0},{path:"/docs/tags/a-9-s-hub/",component:d("/docs/tags/a-9-s-hub/","b1b"),exact:!0},{path:"/docs/tags/a-9-s-postgres/",component:d("/docs/tags/a-9-s-postgres/","6b3"),exact:!0},{path:"/docs/tags/data-service/",component:d("/docs/tags/data-service/","e35"),exact:!0},{path:"/docs/tags/introduction/",component:d("/docs/tags/introduction/","74a"),exact:!0},{path:"/docs/tags/kind/",component:d("/docs/tags/kind/","d98"),exact:!0},{path:"/docs/tags/klutch/",component:d("/docs/tags/klutch/","fab"),exact:!0},{path:"/docs/tags/kubernetes/",component:d("/docs/tags/kubernetes/","aa9"),exact:!0},{path:"/docs/tags/minikube/",component:d("/docs/tags/minikube/","b66"),exact:!0},{path:"/docs/tags/tutorial/",component:d("/docs/tags/tutorial/","f72"),exact:!0},{path:"/docs/tags/tutorials/",component:d("/docs/tags/tutorials/","443"),exact:!0},{path:"/docs/",component:d("/docs/","ebb"),routes:[{path:"/docs/a9s-cli-a8s/",component:d("/docs/a9s-cli-a8s/","f03"),exact:!0},{path:"/docs/a9s-cli-klutch/",component:d("/docs/a9s-cli-klutch/","7c6"),exact:!0},{path:"/docs/a9s-cli/",component:d("/docs/a9s-cli/","b40"),exact:!0},{path:"/docs/hands-on-tutorials/",component:d("/docs/hands-on-tutorials/","e3a"),exact:!0},{path:"/docs/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/",component:d("/docs/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli/","d9e"),exact:!0}]}]}]},{path:"/",component:d("/","2e1"),exact:!0},{path:"*",component:d("*")}]},3538:(e,t,n)=>{var r,o;!function(){var a,i,s,l,u,c,d,f,p,h,m,g,y,b,v,w,S,_,k,x,E,O,P,j,C,A,T,I,N,L,R=function(e){var t=new R.Builder;return t.pipeline.add(R.trimmer,R.stopWordFilter,R.stemmer),t.searchPipeline.add(R.stemmer),e.call(t,t),t.build()};R.version="2.3.9",R.utils={},R.utils.warn=(a=this,function(e){a.console&&console.warn&&console.warn(e)}),R.utils.asString=function(e){return null==e?"":e.toString()},R.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r 0){var l=R.utils.clone(t)||{};l.position=[i,s],l.index=o.length,o.push(new R.Token(n.slice(i,a),l))}i=a+1}}return o},R.tokenizer.separator=/[\s\-]+/,R.Pipeline=function(){this._stack=[]},R.Pipeline.registeredFunctions=Object.create(null),R.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&R.utils.warn("Overwriting existing registered function: "+t),e.label=t,R.Pipeline.registeredFunctions[e.label]=e},R.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||R.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},R.Pipeline.load=function(e){var t=new R.Pipeline;return e.forEach((function(e){var n=R.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},R.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){R.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},R.Pipeline.prototype.after=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},R.Pipeline.prototype.before=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},R.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},R.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n 1&&(a e&&(n=o),a!=e);)r=n-t,o=t+Math.floor(r/2),a=this.elements[2*o];return a==e||a>e?2*o:a s?u+=2:i==s&&(t+=n[l+1]*r[u+1],l+=2,u+=2);return t},R.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},R.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t 0){var a,i=o.str.charAt(0);i in o.node.edges?a=o.node.edges[i]:(a=new R.TokenSet,o.node.edges[i]=a),1==o.str.length&&(a.final=!0),r.push({node:a,editsRemaining:o.editsRemaining,str:o.str.slice(1)})}if(0!=o.editsRemaining){if("*"in o.node.edges)var s=o.node.edges["*"];else{s=new R.TokenSet;o.node.edges["*"]=s}if(0==o.str.length&&(s.final=!0),r.push({node:s,editsRemaining:o.editsRemaining-1,str:o.str}),o.str.length>1&&r.push({node:o.node,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)}),1==o.str.length&&(o.node.final=!0),o.str.length>=1){if("*"in o.node.edges)var l=o.node.edges["*"];else{l=new R.TokenSet;o.node.edges["*"]=l}1==o.str.length&&(l.final=!0),r.push({node:l,editsRemaining:o.editsRemaining-1,str:o.str.slice(1)})}if(o.str.length>1){var u,c=o.str.charAt(0),d=o.str.charAt(1);d in o.node.edges?u=o.node.edges[d]:(u=new R.TokenSet,o.node.edges[d]=u),1==o.str.length&&(u.final=!0),r.push({node:u,editsRemaining:o.editsRemaining-1,str:c+o.str.slice(2)})}}}return n},R.TokenSet.fromString=function(e){for(var t=new R.TokenSet,n=t,r=0,o=e.length;r =e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},R.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},R.Index.prototype.search=function(e){return this.query((function(t){new R.QueryParser(e,t).parse()}))},R.Index.prototype.query=function(e){for(var t=new R.Query(this.fields),n=Object.create(null),r=Object.create(null),o=Object.create(null),a=Object.create(null),i=Object.create(null),s=0;s 1?1:e},R.Builder.prototype.k1=function(e){this._k1=e},R.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var o=0;o =this.length)return R.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},R.QueryLexer.prototype.width=function(){return this.pos-this.start},R.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},R.QueryLexer.prototype.backup=function(){this.pos-=1},R.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=R.QueryLexer.EOS&&this.backup()},R.QueryLexer.prototype.more=function(){return this.pos 1&&(e.backup(),e.emit(R.QueryLexer.TERM)),e.ignore(),e.more())return R.QueryLexer.lexText},R.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.EDIT_DISTANCE),R.QueryLexer.lexText},R.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.BOOST),R.QueryLexer.lexText},R.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(R.QueryLexer.TERM)},R.QueryLexer.termSeparator=R.tokenizer.separator,R.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==R.QueryLexer.EOS)return R.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return R.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if(t.match(R.QueryLexer.termSeparator))return R.QueryLexer.lexTerm}else e.escapeCharacter()}},R.QueryParser=function(e,t){this.lexer=new R.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},R.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=R.QueryParser.parseClause;e;)e=e(this);return this.query},R.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},R.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},R.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},R.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case R.QueryLexer.PRESENCE:return R.QueryParser.parsePresence;case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new R.QueryParseError(n,t.start,t.end)}},R.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=R.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=R.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new R.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new R.QueryParseError(n,t.start,t.end)}switch(r.type){case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new R.QueryParseError(n,r.start,r.end)}}},R.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var o=e.peekLexeme();if(null==o){r="expecting term, found nothing";throw new R.QueryParseError(r,t.start,t.end)}if(o.type===R.QueryLexer.TERM)return R.QueryParser.parseTerm;r="expecting term, found '"+o.type+"'";throw new R.QueryParseError(r,o.start,o.end)}},R.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new R.QueryParseError(r,n.start,n.end)}else e.nextClause()}},R.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new R.QueryParseError(r,o.start,o.end)}else e.nextClause()}},R.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new R.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var o=e.peekLexeme();if(null!=o)switch(o.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+o.type+"'";throw new R.QueryParseError(r,o.start,o.end)}else e.nextClause()}},void 0===(o="function"==typeof(r=function(){return R})?r.call(t,n,t,e):r)||(e.exports=o)}()},332:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>i});var r=n(6540),o=n(4848);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},5815:(e,t,n)=>{"use strict";var r=n(6540),o=n(5338),a=n(545),i=n(4625),s=n(4784),l=n(9860);const u=[n(9744),n(7027),n(7421),n(7424)];var c=n(8641),d=n(6347),f=n(2831),p=n(4848);function h(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var m=n(4993),g=n(1059),y=n(5176),b=n(7513),v=n(4714),w=n(2398),S=n(8653),_=n(1358),k=n(2709),x=n(6758);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.A)(),r=(0,w.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,p.jsxs)(m.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function O(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.A)(),{pathname:r}=(0,d.zy)();return e+(0,k.applyTrailingSlash)((0,y.Ay)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,p.jsxs)(m.A,{children:[(0,p.jsx)("meta",{property:"og:url",content:o}),(0,p.jsx)("link",{rel:"canonical",href:o})]})}function P(){const{i18n:{currentLocale:e}}=(0,g.A)(),{metadata:t,image:n}=(0,b.p)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(m.A,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:S.w})]}),n&&(0,p.jsx)(v.be,{image:n}),(0,p.jsx)(O,{}),(0,p.jsx)(E,{}),(0,p.jsx)(x.A,{tag:_.Cy,locale:e}),(0,p.jsx)(m.A,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const j=new Map;var C=n(332),A=n(7391),T=n(898);function I(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r {const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>o.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,T.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),I("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function L(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,f.u)(c.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class R extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.A.canUseDOM?I("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=I("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),L(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(N,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(d.qh,{location:t,render:()=>e})})}}const D=R,F="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",B="__docusaurus-base-url-issue-banner-suggestion-container";function z(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${F}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n \n\n`}(e)).replace(/{let{route:t}=e;return!0===t.exact})))return j.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return j.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,p.jsx)(D,{location:e,children:q})}function K(){return(0,p.jsx)(V.A,{children:(0,p.jsx)(A.l,{children:(0,p.jsxs)(C.x,{children:[(0,p.jsxs)(h,{children:[(0,p.jsx)(H,{}),(0,p.jsx)(P,{}),(0,p.jsx)(U,{}),(0,p.jsx)(G,{})]}),(0,p.jsx)(W,{})]})})})}var Y=n(4054);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var X=n(3800);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,f.u)(c.A,e).flatMap((e=>{return t=e.route.path,Object.entries(Y).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),L(e))},re=Object.freeze(ne);function oe(e){let{children:t}=e;return"hash"===s.default.future.experimental_router?(0,p.jsx)(i.I9,{children:t}):(0,p.jsx)(i.Kd,{children:t})}const ae=Boolean(!0);if(l.A.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(a.vd,{children:(0,p.jsx)(oe,{children:(0,p.jsx)(K,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(ae)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};L(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},7391:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>f});var r=n(6540),o=n(4784);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Develop","isLast":false,"path":"/docs/develop","mainDocId":"a9s-cli-a8s","docs":[{"id":"a9s-cli","path":"/docs/develop/a9s-cli","sidebar":"tutorialSidebar"},{"id":"a9s-cli-a8s","path":"/docs/develop/a9s-cli-a8s","sidebar":"tutorialSidebar"},{"id":"a9s-cli-klutch","path":"/docs/develop/a9s-cli-klutch","sidebar":"tutorialSidebar"},{"id":"hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","path":"/docs/develop/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","sidebar":"tutorialSidebar"},{"id":"hands-on-tutorials/hands-on-tutorials-index","path":"/docs/develop/hands-on-tutorials/","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/develop/a9s-cli-a8s","label":"a9s-cli-a8s"}}}},{"name":"0.14.0","label":"0.14.0","isLast":true,"path":"/docs","mainDocId":"a9s-cli","docs":[{"id":"a9s-cli","path":"/docs/a9s-cli"},{"id":"a9s-cli-a8s","path":"/docs/a9s-cli-a8s"},{"id":"a9s-cli-klutch","path":"/docs/a9s-cli-klutch"},{"id":"hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","path":"/docs/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli"},{"id":"hands-on-tutorials/hands-on-tutorials-index","path":"/docs/hands-on-tutorials/"}],"draftIds":[],"sidebars":{}},{"name":"0.13.1","label":"0.13.1","isLast":false,"path":"/docs/0.13.1","mainDocId":"a9s-cli","docs":[{"id":"a9s-cli","path":"/docs/0.13.1/a9s-cli"},{"id":"hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","path":"/docs/0.13.1/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli"},{"id":"hands-on-tutorials/hands-on-tutorials-index","path":"/docs/0.13.1/hands-on-tutorials/"}],"draftIds":[],"sidebars":{}},{"name":"0.13.0","label":"0.13.0","isLast":false,"path":"/docs/0.13.0","mainDocId":"a9s-cli","docs":[{"id":"a9s-cli","path":"/docs/0.13.0/a9s-cli"},{"id":"hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli","path":"/docs/0.13.0/hands-on-tutorials/hands-on-tutorial-a8s-pg-a9s-cli"},{"id":"hands-on-tutorials/hands-on-tutorials-index","path":"/docs/0.13.0/hands-on-tutorials/"}],"draftIds":[],"sidebars":{}}],"breadcrumbs":true}},"docusaurus-plugin-google-tag-manager":{"default":{"containerId":"GTM-NZZ5ZVC","id":"default"}},"@cmfcmf/docusaurus-search-local":{"default":{"titleBoost":5,"contentBoost":1,"tagsBoost":3,"parentCategoriesBoost":2,"indexDocSidebarParentCategories":0,"maxSearchResults":8}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(2654);const l=JSON.parse('{"docusaurusVersion":"3.4.0","siteVersion":"1.1.2","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.4.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.4.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.4.0"},"docusaurus-plugin-google-tag-manager":{"type":"package","name":"@docusaurus/plugin-google-tag-manager","version":"3.4.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.4.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.4.0"},"@cmfcmf/docusaurus-search-local":{"type":"package","name":"@cmfcmf/docusaurus-search-local","version":"1.1.0"}}}');var u=n(4848);const c={siteConfig:o.default,siteMetadata:l,globalData:a,i18n:i,codeTranslations:s},d=r.createContext(c);function f(e){let{children:t}=e;return(0,u.jsx)(d.Provider,{value:c,children:t})}},1591:(e,t,n)=>{"use strict";n.d(t,{A:()=>m});var r=n(6540),o=n(9860),a=n(4993),i=n(2709),s=n(1777),l=n(7319),u=n(4848);function c(e){let{error:t,tryAgain:n}=e;return(0,u.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,u.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,u.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,u.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function f(e){let{children:t}=e;return(0,u.jsx)(l.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function p(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)(f,{children:(0,u.jsxs)(m,{fallback:()=>(0,u.jsx)(c,{error:t,tryAgain:n}),children:[(0,u.jsx)(a.A,{children:(0,u.jsx)("title",{children:"Page Error"})}),(0,u.jsx)(s.A,{children:(0,u.jsx)(c,{error:t,tryAgain:n})})]})})}const h=e=>(0,u.jsx)(p,{...e});class m extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??h)(e)}return e??null}}},9860:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},4993:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);var r=n(545),o=n(4848);function a(e){return(0,o.jsx)(r.mg,{...e})}},7083:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});var r=n(6540),o=n(4625),a=n(2709),i=n(1059),s=n(5881),l=n(9860),u=n(3240),c=n(5176),d=n(4848);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:h,isActive:m,"data-noBrokenLinkCheck":g,autoAddBaseUrl:y=!0,...b}=e;const{siteConfig:v}=(0,i.A)(),{trailingSlash:w,baseUrl:S}=v,_=v.future.experimental_router,{withBaseUrl:k}=(0,c.hH)(),x=(0,u.A)(),E=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>E.current));const O=f||p;const P=(0,s.A)(O),j=O?.replace("pathname://","");let C=void 0!==j?(A=j,y&&(e=>e.startsWith("/"))(A)?k(A):A):void 0;var A;"hash"===_&&C?.startsWith("./")&&(C=C?.slice(1)),C&&P&&(C=(0,a.applyTrailingSlash)(C,{trailingSlash:w,baseUrl:S}));const T=(0,r.useRef)(!1),I=n?o.k2:o.N_,N=l.A.canUseIntersectionObserver,L=(0,r.useRef)(),R=()=>{T.current||null==C||(window.docusaurus.preload(C),T.current=!0)};(0,r.useEffect)((()=>(!N&&P&&null!=C&&window.docusaurus.prefetch(C),()=>{N&&L.current&&L.current.disconnect()})),[L,C,N,P]);const D=C?.startsWith("#")??!1,F=!b.target||"_self"===b.target,M=!C||!P||!F;return g||!D&&M||x.collectLink(C),b.id&&x.collectAnchor(b.id),M?(0,d.jsx)("a",{ref:E,href:C,...O&&!P&&{target:"_blank",rel:"noopener noreferrer"},...b}):(0,d.jsx)(I,{...b,onMouseEnter:R,onTouchStart:R,innerRef:e=>{E.current=e,N&&e&&P&&(L.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(L.current.unobserve(e),L.current.disconnect(),null!=C&&window.docusaurus.prefetch(C))}))})),L.current.observe(e))},to:C,...n&&{isActive:m,activeClassName:h}})}const p=r.forwardRef(f)},6885:(e,t,n)=>{"use strict";n.d(t,{A:()=>u,T:()=>l});var r=n(6540),o=n(4848);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(s({message:n,id:r}),t)}function u(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("IllegalYour Docusaurus site did not load properly.
\nA very common reason is a wrong site baseUrl configuration.
\nCurrent configured baseUrl = ${e} ${"/"===e?" (default value)":""}
\nWe suggest trying baseUrl =
\nchildren",t),new Error("The Docusaurus component only accept simple string values");const i=s({message:t,id:n});return(0,o.jsx)(o.Fragment,{children:a(i,r)})}},6418:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},5881:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>o,z:()=>r})},5176:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>s,hH:()=>i});var r=n(6540),o=n(1059),a=n(5881);function i(){const{siteConfig:e}=(0,o.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,s=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:o=!1,absolute:i=!1}={},router:s}=e;if(!r||r.startsWith("#")||(0,a.z)(r))return r;if("hash"===s)return r.startsWith("/")?`.${r}`:`./${r}`;if(o)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const l=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+l:l}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:s}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},3240:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(6540);n(4848);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},1059:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(7391);function a(){return(0,r.useContext)(o.o)}},3211:(e,t,n)=>{"use strict";n.d(t,{P_:()=>i,kh:()=>a});var r=n(1059),o=n(6418);function a(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}function i(e,t,n){void 0===t&&(t=o.W),void 0===n&&(n={});const r=a(e),i=r?.[t];if(!i&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return i}},5482:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(332);function a(){return(0,r.useContext)(o.o)}},898:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(6540);const o=n(9860).A.canUseDOM?r.useLayoutEffect:r.useEffect},5860:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(6540),o=n(7319);function a(){const e=r.useContext(o.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},3800:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const s=o?`${o}.${a}`:a;r(i)?e(i,s):t[s]=i}))}(e),t}},7319:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>a});var r=n(6540),o=n(4848);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,o.jsx)(a.Provider,{value:s,children:t})}},817:(e,t,n)=>{"use strict";n.d(t,{zK:()=>m,vT:()=>d,gk:()=>f,Gy:()=>u,HW:()=>g,ht:()=>c,r7:()=>h,jh:()=>p});var r=n(6347),o=n(3211);const a=e=>e.versions.find((e=>e.isLast));function i(e,t){const n=a(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}function s(e,t){const n=i(e,t),o=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}const l={},u=()=>(0,o.kh)("docusaurus-plugin-content-docs")??l,c=e=>{try{return(0,o.P_)("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function d(e){void 0===e&&(e={});const t=u(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return a}(t,n,e)}function f(e){void 0===e&&(e={});const t=d(e),{pathname:n}=(0,r.zy)();if(!t)return;return{activePlugin:t,activeVersion:i(t.pluginData,n)}}function p(e){return c(e).versions}function h(e){const t=c(e);return a(t)}function m(e){const t=c(e),{pathname:n}=(0,r.zy)();return s(t,n)}function g(e){const t=c(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=a(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},7421:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(5947),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},7027:(e,t,n)=>{"use strict";var r=n(1765),o=n(4784);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(9700),n(4023)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},2067:(e,t,n)=>{"use strict";n.d(t,{A:()=>c});n(6540);var r=n(4164),o=n(6885),a=n(7513),i=n(7083),s=n(3240);const l={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var u=n(4848);function c(e){let{as:t,id:n,...c}=e;const d=(0,s.A)(),{navbar:{hideOnScroll:f}}=(0,a.p)();if("h1"===t||!n)return(0,u.jsx)(t,{...c,id:void 0});d.collectAnchor(n);const p=(0,o.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof c.children?c.children:n});return(0,u.jsxs)(t,{...c,className:(0,r.A)("anchor",f?l.anchorWithHideOnScrollNavbar:l.anchorWithStickyNavbar,c.className),id:n,children:[c.children,(0,u.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":p,title:p,children:"\u200b"})]})}},521:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(6540);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(4848);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},1777:(e,t,n)=>{"use strict";n.d(t,{A:()=>di});var r=n(6540),o=n(4164),a=n(1591),i=n(4714),s=n(6347),l=n(6885),u=n(695),c=n(4848);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,s.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,u.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const h=(0,l.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??h,{containerRef:n,onClick:r}=p();return(0,c.jsx)("div",{ref:n,role:"region","aria-label":h,children:(0,c.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(8570),y=n(8653);const b={skipToContent:"skipToContent_fXgn"};function v(){return(0,c.jsx)(m,{className:b.skipToContent})}var w=n(7513),S=n(4686);function _(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...i}=e;return(0,c.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,c.jsx)("g",{stroke:r,strokeWidth:o,children:(0,c.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const k={closeButton:"closeButton_CVFx"};function x(e){return(0,c.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.A)("clean-btn close",k.closeButton,e.className),children:(0,c.jsx)(_,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function O(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,c.jsx)("div",{...e,className:(0,o.A)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const P={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function j(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,S.M)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,c.jsxs)("div",{className:P.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,c.jsx)("div",{className:P.announcementBarPlaceholder}),(0,c.jsx)(O,{className:P.announcementBarContent}),a&&(0,c.jsx)(x,{onClick:n,className:P.announcementBarClose})]})}var C=n(3123),A=n(5865);var T=n(1971),I=n(6703);const N=r.createContext(null);function L(e){let{children:t}=e;const n=function(){const e=(0,C.M)(),t=(0,I.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,T.ZC)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,c.jsx)(N.Provider,{value:n,children:t})}function R(e){if(e.component){const t=e.component;return(0,c.jsx)(t,{...e.props})}}function D(){const e=(0,r.useContext)(N);if(!e)throw new T.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,I.YL)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:R(a)})),[o,a,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=D();return(0,c.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,c.jsxs)("div",{className:(0,o.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),children:[(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var M=n(4018),B=n(5482);function z(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function H(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,B.A)(),s=(0,l.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,c.jsx)("div",{className:(0,o.A)(U.toggle,t),children:(0,c.jsxs)("button",{className:(0,o.A)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,c.jsx)(z,{className:(0,o.A)(U.toggleIcon,U.lightToggleIcon)}),(0,c.jsx)($,{className:(0,o.A)(U.toggleIcon,U.darkToggleIcon)})]})})}const V=r.memo(H),Q={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function W(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,M.G)();return r?null:(0,c.jsx)(V,{className:t,buttonClassName:"dark"===n?Q.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var q=n(7712);function G(){return(0,c.jsx)(q.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,C.M)();return(0,c.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,c.jsx)(_,{color:"var(--ifm-color-emphasis-600)"})})}function Y(){return(0,c.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,c.jsx)(G,{}),(0,c.jsx)(W,{className:"margin-right--md"}),(0,c.jsx)(K,{})]})}var Z=n(7083),X=n(5176),J=n(5881);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(521);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...u}=e;const d=(0,X.Ay)(r),f=(0,X.Ay)(t),p=(0,X.Ay)(o,{forcePrependBaseUrl:!0}),h=a&&o&&!(0,J.A)(o),m=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,c.jsxs)(c.Fragment,{children:[a,h&&(0,c.jsx)(te.A,{...s&&{width:12,height:12}})]})};return o?(0,c.jsx)(Z.A,{href:l?p:o,...u,...m}):(0,c.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},...u,...m})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,c.jsx)(ne,{className:(0,o.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,c.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,c.jsx)("li",{className:"menu__list-item",children:(0,c.jsx)(ne,{className:(0,o.A)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,c.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(5545),se=n(5728),le=n(1059);const ue={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ce(e,t){return e.some((e=>function(e,t){return!!(0,se.ys)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,onClick:i,...s}=e;const l=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,c.jsxs)("div",{ref:l,className:(0,o.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u}),children:[(0,c.jsx)(ne,{"aria-haspopup":"true","aria-expanded":u,role:"button",href:s.to?void 0:"#",className:(0,o.A)("navbar__link",a),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))},children:s.children??s.label}),(0,c.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(ka,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function fe(e){let{items:t,className:n,position:a,onClick:i,...l}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,le.A)(),{pathname:t}=(0,s.zy)();return t.replace(e,"/")}(),d=ce(t,u),{collapsed:f,toggleCollapsed:p,setCollapsed:h}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&h(!d)}),[u,d,h]),(0,c.jsxs)("li",{className:(0,o.A)("menu__list-item",{"menu__list-item--collapsed":f}),children:[(0,c.jsx)(ne,{role:"button",className:(0,o.A)(ue.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),p()},children:l.children??l.label}),(0,c.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:f,children:t.map(((e,t)=>(0,r.createElement)(ka,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function pe(e){let{mobile:t=!1,...n}=e;const r=t?fe:de;return(0,c.jsx)(r,{...n})}var he=n(2398);function me(e){let{width:t=20,height:n=20,...r}=e;return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const ge="iconLanguage_nlXk";var ye=n(961);function be(e,t){var n=void 0;return function(){for(var r=arguments.length,o=new Array(r),a=0;a e.length)&&(t=e.length);for(var n=0,r=new Array(t);n e.length)&&(t=e.length);for(var n=0,r=new Array(t);n =0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r =0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function Ie(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 Ne(e){for(var t=1;t =3||2===n&&r>=4||1===n&&r>=10}(e);function n(n,r,o){if(t&&void 0!==o){var a=o[0].__autocomplete_algoliaCredentials,i={"X-Algolia-Application-Id":a.appId,"X-Algolia-API-Key":a.apiKey};e.apply(void 0,[n].concat(Ce(r),[{headers:i}]))}else e.apply(void 0,[n].concat(Ce(r)))}return{init:function(t,n){e("init",{appId:t,apiKey:n})},setAuthenticatedUserToken:function(t){e("setAuthenticatedUserToken",t)},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r 0&&n("clickedObjectIDsAfterSearch",Re(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r 0&&n("clickedObjectIDs",Re(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r 0&&e.apply(void 0,["clickedFilters"].concat(n))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),r=0;r 0&&n("convertedObjectIDsAfterSearch",Re(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r 0&&n("convertedObjectIDs",Re(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r 0&&e.apply(void 0,["convertedFilters"].concat(n))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),r=0;r 0&&t.reduce((function(e,t){var n=t.items,r=Te(t,Pe);return[].concat(Ce(e),Ce(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,n=[],r=0;r 0&&e.apply(void 0,["viewedFilters"].concat(n))}}}function Fe(e){var t=e.items.reduce((function(e,t){var n;return e[t.__autocomplete_indexName]=(null!==(n=e[t.__autocomplete_indexName])&&void 0!==n?n:[]).concat(t),e}),{});return Object.keys(t).map((function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}}))}function Me(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function Be(e){return Be="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},Be(e)}function ze(e){return function(e){if(Array.isArray(e))return $e(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return $e(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return $e(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function $e(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n 0&&qe({onItemsChange:o,items:n,insights:u,state:t}))}}),0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,n=e.onSelect,r=e.onActive,o=!1;function c(e){t({algoliaInsightsPlugin:{__algoliaSearchParameters:He(He({},s?{clickAnalytics:!0}:{}),e?{userToken:Ye(e)}:{}),insights:u}})}l("addAlgoliaAgent","insights-plugin"),c(),l("onUserTokenChange",(function(e){o||c(e)})),l("getUserToken",null,(function(e,t){o||c(t)})),l("onAuthenticatedUserTokenChange",(function(e){e?(o=!0,c(e)):(o=!1,l("getUserToken",null,(function(e,t){return c(t)})))})),l("getAuthenticatedUserToken",null,(function(e,t){t&&(o=!0,c(t))})),n((function(e){var t=e.item,n=e.state,r=e.event,o=e.source;Me(t)&&a({state:n,event:r,insights:u,item:t,insightsEvents:[He({eventName:"Item Selected"},ke({item:t,items:o.getItems().filter(Me)}))]})})),r((function(e){var t=e.item,n=e.source,r=e.state,o=e.event;Me(t)&&i({state:r,event:o,insights:u,item:t,insightsEvents:[He({eventName:"Item Active"},ke({item:t,items:n.getItems().filter(Me)}))]})}))},onStateChange:function(e){var t=e.state;d({state:t})},__autocomplete_pluginOptions:e}}function Ke(){var e,t=arguments.length>1?arguments[1]:void 0;return[].concat(ze(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]),["autocomplete-internal"],ze(null!==(e=t.algoliaInsightsPlugin)&&void 0!==e&&e.__automaticInsights?["autocomplete-automatic"]:[]))}function Ye(e){return"number"==typeof e?e.toString():e}function Ze(e){return Ze="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},Ze(e)}function Xe(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 Je(e,t,n){return(t=function(e){var t=function(e,t){if("object"!==Ze(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!==Ze(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===Ze(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function et(e,t,n){var r,o=t.initialState;return{getState:function(){return o},dispatch:function(r,a){var i=function(e){for(var t=1;t