diff --git a/404.html b/404.html index 93174f22..5a0f5cc1 100644 --- a/404.html +++ b/404.html @@ -8,13 +8,13 @@ Page Not Found | Green Software Patterns - - + +
Skip to main content

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.

- - + + \ No newline at end of file diff --git a/assets/js/134c4c1b.2e14aed3.js b/assets/js/134c4c1b.2e14aed3.js new file mode 100644 index 00000000..068309ba --- /dev/null +++ b/assets/js/134c4c1b.2e14aed3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4679],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(7294);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 o(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 l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(n),m=a,g=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return n?r.createElement(g,l(l({ref:t},u),{},{components:n})):r.createElement(g,l({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,l=new Array(o);l[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:a,l[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var r=n(7462),a=(n(7294),n(4137));const o={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2024-07-30T00:00:00.000Z"),category:"cloud",tags:["cloud","role:cloud-engineer","size:small","programming-language"]},l="Use compiled languages",i={unversionedId:"catalog/cloud/use-compiled-languages",id:"catalog/cloud/use-compiled-languages",title:"Use compiled languages",description:"Description",source:"@site/docs/catalog/cloud/use-compiled-languages.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/use-compiled-languages",permalink:"/catalog/cloud/use-compiled-languages",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/use-compiled-languages.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"},{label:"programming-language",permalink:"/tags/programming-language"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2024-07-30T00:00:00.000Z",category:"cloud",tags:["cloud","role:cloud-engineer","size:small","programming-language"]},sidebar:"tutorialSidebar",previous:{title:"Use cloud native network security tools and controls",permalink:"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},next:{title:"Use DDoS protection",permalink:"/catalog/cloud/use-ddos-protection"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function p(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"use-compiled-languages"},"Use compiled languages"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Interpreted languages need to be parsed, compiled and executed when the application starts or a workload arrives. This tends to be more energy heavy then when a compiled language is used. The compilation is then only done once, saving on resources."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Use compiled languages (like Go, Rust, Java or others) whenever possible or compile interpreted languages."),(0,a.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Concerning the SCI equation, use compiled languages will impact as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Running compiled binaries is more energy efficient and uses less energy which outweighs the energy consumed in compiling it to binary upfront"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": The embodied carbon emissions will be reduced, as compiled binaries tend to be smaller then the sources they are compiled from")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"There is the assumption that the execution environment allows usage of compiled languages, this is not always the case (for example web browsers)"),(0,a.kt)("li",{parentName:"ul"},"Use benchmarks to determine if the application use case benefits from using a compiled language.")),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Some interpreted languages provide ways to be compiled into binary (for example GraalVM for Java, Python and more)"),(0,a.kt)("li",{parentName:"ul"},"Consider factoring in compile time when doing benchmarks ")),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://greenlab.di.uminho.pt/wp-content/uploads/2017/10/sleFinal.pdf"},"One Carbon intensity benchmark"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/473c0143.57a0bdd7.js b/assets/js/473c0143.834c46e4.js similarity index 56% rename from assets/js/473c0143.57a0bdd7.js rename to assets/js/473c0143.834c46e4.js index 139853cc..3fcd413f 100644 --- a/assets/js/473c0143.57a0bdd7.js +++ b/assets/js/473c0143.834c46e4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4601],{4137:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>d});var r=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(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 o(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),m=u(n),d=i,f=m["".concat(l,".").concat(d)]||m[d]||p[d]||a;return n?r.createElement(f,o(o({ref:t},c),{},{components:n})):r.createElement(f,o({ref:t},c))}));function d(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,o=new Array(a);o[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:i,o[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>u});var r=n(7462),i=(n(7294),n(4137));const a={version:1,submitted_by:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.",tags:["cloud","role:cloud-engineer","size:small"]},o="Queue non-urgent processing requests",s={unversionedId:"catalog/cloud/queue-non-urgent-requests",id:"catalog/cloud/queue-non-urgent-requests",title:"Queue non-urgent processing requests",description:"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.",source:"@site/docs/catalog/cloud/queue-non-urgent-requests.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/queue-non-urgent-requests",permalink:"/catalog/cloud/queue-non-urgent-requests",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/queue-non-urgent-requests.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"greenhsu123",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.",tags:["cloud","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Optimize peak CPU utilization",permalink:"/catalog/cloud/optimize-peak-cpu-utilization"},next:{title:"Reduce transmitted data",permalink:"/catalog/cloud/reduce-transmitted-data"}},l={},u=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],c={toc:u};function p(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"queue-non-urgent-processing-requests"},"Queue non-urgent processing requests"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum. "),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Utilize a message queue so requests that do not require immediate processing are queued. "),(0,i.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,i.kt)("p",null,"Queuing non-urgent requests will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": By reducing the total number of idle resources, less total electricity is required."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total number of computing equipment required, the total embodied carbon is lower.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"There is an assumption that the components in your system can communicate with a message queue asynchronously. If your component is the producer, it can add requests to the queue without waiting for the previous sent to be processed. If your component is the consumer, it will only process requests when they are available. We assume that no components in the system ever stalled while waiting for another. "),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("p",null,"Decoupling components of your system can introduce unnecessary complexity and managing a message queue might mean additional overheads. As such, you should give careful consideration as to whether a message queue is appropriate."),(0,i.kt)("h2",{id:"references"},"References"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/energy-efficiency"},"Energy Efficiency Principle")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/hardware-efficiency/"},"Hardware Efficiency Principle")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://aws.amazon.com/message-queue/"},"Message Queue")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://docs.aws.amazon.com/wellarchitected/latest/sustainability-pillar/optimize-software-and-architecture-for-asynchronous-and-scheduled-jobs.html"},"Optimise software and architecture for asynchronous and scheduled jobs"))))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4601],{4137:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>d});var r=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(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 o(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),m=u(n),d=i,f=m["".concat(l,".").concat(d)]||m[d]||p[d]||a;return n?r.createElement(f,o(o({ref:t},c),{},{components:n})):r.createElement(f,o({ref:t},c))}));function d(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,o=new Array(a);o[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:i,o[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>u});var r=n(7462),i=(n(7294),n(4137));const a={version:1,submitted_by:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.",tags:["cloud","role:cloud-engineer","size:small"]},o="Queue non-urgent processing requests",s={unversionedId:"catalog/cloud/queue-non-urgent-requests",id:"catalog/cloud/queue-non-urgent-requests",title:"Queue non-urgent processing requests",description:"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.",source:"@site/docs/catalog/cloud/queue-non-urgent-requests.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/queue-non-urgent-requests",permalink:"/catalog/cloud/queue-non-urgent-requests",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/queue-non-urgent-requests.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"greenhsu123",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.",tags:["cloud","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Optimize peak CPU utilization",permalink:"/catalog/cloud/optimize-peak-cpu-utilization"},next:{title:"Reduce network traversal between VMs",permalink:"/catalog/cloud/reduce-network-traversal-between-VMs"}},l={},u=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],c={toc:u};function p(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"queue-non-urgent-processing-requests"},"Queue non-urgent processing requests"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum. "),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Utilize a message queue so requests that do not require immediate processing are queued. "),(0,i.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,i.kt)("p",null,"Queuing non-urgent requests will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": By reducing the total number of idle resources, less total electricity is required."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total number of computing equipment required, the total embodied carbon is lower.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"There is an assumption that the components in your system can communicate with a message queue asynchronously. If your component is the producer, it can add requests to the queue without waiting for the previous sent to be processed. If your component is the consumer, it will only process requests when they are available. We assume that no components in the system ever stalled while waiting for another. "),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("p",null,"Decoupling components of your system can introduce unnecessary complexity and managing a message queue might mean additional overheads. As such, you should give careful consideration as to whether a message queue is appropriate."),(0,i.kt)("h2",{id:"references"},"References"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/energy-efficiency"},"Energy Efficiency Principle")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/hardware-efficiency/"},"Hardware Efficiency Principle")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://aws.amazon.com/message-queue/"},"Message Queue")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://docs.aws.amazon.com/wellarchitected/latest/sustainability-pillar/optimize-software-and-architecture-for-asynchronous-and-scheduled-jobs.html"},"Optimise software and architecture for asynchronous and scheduled jobs"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4bc4971a.33383340.js b/assets/js/4bc4971a.33383340.js deleted file mode 100644 index fe845894..00000000 --- a/assets/js/4bc4971a.33383340.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[1938],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),m=a,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||i;return r?n.createElement(f,o(o({ref:t},u),{},{components:r})):n.createElement(f,o({ref:t},u))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:a,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(7462),a=(r(7294),r(4137));const i={version:1,submitted_by:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"From an energy-efficiency perspective, it's better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.",tags:["networking","role:cloud-engineer","size:small"]},o="Reduce transmitted data",s={unversionedId:"catalog/cloud/reduce-transmitted-data",id:"catalog/cloud/reduce-transmitted-data",title:"Reduce transmitted data",description:"From an energy-efficiency perspective, it's better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.",source:"@site/docs/catalog/cloud/reduce-transmitted-data.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/reduce-transmitted-data",permalink:"/catalog/cloud/reduce-transmitted-data",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/reduce-transmitted-data.md",tags:[{label:"networking",permalink:"/tags/networking"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"greenhsu123",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"From an energy-efficiency perspective, it's better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.",tags:["networking","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Queue non-urgent processing requests",permalink:"/catalog/cloud/queue-non-urgent-requests"},next:{title:"Remove unused assets",permalink:"/catalog/cloud/remove-unused-assets"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function d(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"reduce-transmitted-data"},"Reduce transmitted data"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"From an energy-efficiency perspective, it's better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Minimize the size of data transmitted by only sending properties or values deemed necessary. "),(0,a.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Reducing the size of data will impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": We reduce the total electricity required by reducing network traffic. "),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total size of data stored, the total embodied carbon is lower.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Suppose we choose to transfer data (e.g. payloads) to the client side as it is because some properties or values may be needed later. A better solution would be to consider curating the data set, ensuring only necessary properties are sent across the network so the overall network traffic is reduced. In many use cases, certain properties or values can be correlated later. ")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Another consideration is that different data formats will affect the overall network traffic depending on their size. For example, Protobuf is much more compact than XML. "))),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"It may reduce cloud bills because minimising the size of the data transmitted will cost less. "),(0,a.kt)("li",{parentName:"ul"},"If we minimize the data set by taking away properties or values, there may be overhead to corelate the missing properties or values.")),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/energy-efficiency"},"Energy Efficiency Principle"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4bc4971a.55b007b3.js b/assets/js/4bc4971a.55b007b3.js new file mode 100644 index 00000000..96b29855 --- /dev/null +++ b/assets/js/4bc4971a.55b007b3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[1938],{4137:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),p=c(r),m=a,f=p["".concat(l,".").concat(m)]||p[m]||u[m]||i;return r?n.createElement(f,o(o({ref:t},d),{},{components:r})):n.createElement(f,o({ref:t},d))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:a,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(7462),a=(r(7294),r(4137));const i={version:1,submitted_by:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"From an energy-efficiency perspective, it's better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.",tags:["networking","role:cloud-engineer","size:small"]},o="Reduce transmitted data",s={unversionedId:"catalog/cloud/reduce-transmitted-data",id:"catalog/cloud/reduce-transmitted-data",title:"Reduce transmitted data",description:"From an energy-efficiency perspective, it's better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.",source:"@site/docs/catalog/cloud/reduce-transmitted-data.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/reduce-transmitted-data",permalink:"/catalog/cloud/reduce-transmitted-data",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/reduce-transmitted-data.md",tags:[{label:"networking",permalink:"/tags/networking"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"greenhsu123",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"From an energy-efficiency perspective, it's better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.",tags:["networking","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Reduce network traversal between VMs",permalink:"/catalog/cloud/reduce-network-traversal-between-VMs"},next:{title:"Remove unused assets",permalink:"/catalog/cloud/remove-unused-assets"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],d={toc:c};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"reduce-transmitted-data"},"Reduce transmitted data"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"From an energy-efficiency perspective, it's better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Minimize the size of data transmitted by only sending properties or values deemed necessary. "),(0,a.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Reducing the size of data will impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": We reduce the total electricity required by reducing network traffic. "),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total size of data stored, the total embodied carbon is lower.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Suppose we choose to transfer data (e.g. payloads) to the client side as it is because some properties or values may be needed later. A better solution would be to consider curating the data set, ensuring only necessary properties are sent across the network so the overall network traffic is reduced. In many use cases, certain properties or values can be correlated later. ")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Another consideration is that different data formats will affect the overall network traffic depending on their size. For example, Protobuf is much more compact than XML. "))),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"It may reduce cloud bills because minimising the size of the data transmitted will cost less. "),(0,a.kt)("li",{parentName:"ul"},"If we minimize the data set by taking away properties or values, there may be overhead to corelate the missing properties or values.")),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/energy-efficiency"},"Energy Efficiency Principle"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/55960ee5.a5223009.js b/assets/js/55960ee5.f0713b46.js similarity index 58% rename from assets/js/55960ee5.a5223009.js rename to assets/js/55960ee5.f0713b46.js index a26efe1c..b0ccd530 100644 --- a/assets/js/55960ee5.a5223009.js +++ b/assets/js/55960ee5.f0713b46.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4121],{8070:e=>{e.exports=JSON.parse('[{"label":"ai","permalink":"/tags/ai","count":9},{"label":"machine-learning","permalink":"/tags/machine-learning","count":9},{"label":"role:data-scientist","permalink":"/tags/role-data-scientist","count":9},{"label":"size:small","permalink":"/tags/size-small","count":34},{"label":"serverless","permalink":"/tags/serverless","count":3},{"label":"networking","permalink":"/tags/networking","count":5},{"label":"role:cloud-engineer","permalink":"/tags/role-cloud-engineer","count":26},{"label":"cloud","permalink":"/tags/cloud","count":22},{"label":"size:medium","permalink":"/tags/size-medium","count":21},{"label":"compute","permalink":"/tags/compute","count":15},{"label":"kubernetes","permalink":"/tags/kubernetes","count":11},{"label":"storage","permalink":"/tags/storage","count":4},{"label":"security","permalink":"/tags/security","count":5},{"label":"network","permalink":"/tags/network","count":1},{"label":"role:software-engineer","permalink":"/tags/role-software-engineer","count":11},{"label":"Reliability/Availability","permalink":"/tags/reliability-availability","count":2},{"label":"Monitoring","permalink":"/tags/monitoring","count":4},{"label":"deployment","permalink":"/tags/deployment","count":1},{"label":"role:reliability-engineer","permalink":"/tags/role-reliability-engineer","count":3},{"label":"size:large","permalink":"/tags/size-large","count":1},{"label":"web","permalink":"/tags/web","count":12},{"label":"role:web-developer","permalink":"/tags/role-web-developer","count":12}]')}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4121],{8070:e=>{e.exports=JSON.parse('[{"label":"ai","permalink":"/tags/ai","count":9},{"label":"machine-learning","permalink":"/tags/machine-learning","count":9},{"label":"role:data-scientist","permalink":"/tags/role-data-scientist","count":9},{"label":"size:small","permalink":"/tags/size-small","count":35},{"label":"serverless","permalink":"/tags/serverless","count":3},{"label":"networking","permalink":"/tags/networking","count":5},{"label":"role:cloud-engineer","permalink":"/tags/role-cloud-engineer","count":28},{"label":"cloud","permalink":"/tags/cloud","count":24},{"label":"size:medium","permalink":"/tags/size-medium","count":22},{"label":"compute","permalink":"/tags/compute","count":16},{"label":"kubernetes","permalink":"/tags/kubernetes","count":12},{"label":"storage","permalink":"/tags/storage","count":4},{"label":"security","permalink":"/tags/security","count":5},{"label":"network","permalink":"/tags/network","count":2},{"label":"role:software-engineer","permalink":"/tags/role-software-engineer","count":11},{"label":"Reliability/Availability","permalink":"/tags/reliability-availability","count":2},{"label":"Monitoring","permalink":"/tags/monitoring","count":4},{"label":"deployment","permalink":"/tags/deployment","count":1},{"label":"role:reliability-engineer","permalink":"/tags/role-reliability-engineer","count":3},{"label":"size:large","permalink":"/tags/size-large","count":1},{"label":"programming-language","permalink":"/tags/programming-language","count":1},{"label":"web","permalink":"/tags/web","count":12},{"label":"role:web-developer","permalink":"/tags/role-web-developer","count":12}]')}}]); \ No newline at end of file diff --git a/assets/js/5b55fa8e.3033515f.js b/assets/js/5b55fa8e.3033515f.js deleted file mode 100644 index dda88cc2..00000000 --- a/assets/js/5b55fa8e.3033515f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[50],{7798:e=>{e.exports=JSON.parse('{"label":"size:medium","permalink":"/tags/size-medium","allTagsPath":"/tags","count":21,"items":[{"id":"catalog/web/avoid-excessive-dom-size","title":"Avoid an excessive DOM size","description":"The greater the amount of nodes that are defined in HTML, the greater the time spent processing and rendering each element.","permalink":"/catalog/web/avoid-excessive-dom-size"},{"id":"catalog/web/avoid-chaining-critical-requests","title":"Avoid chaining critical requests","description":"Most web experiences require a lot of work from the user\'s browser. The greater the length of the chains and the larger the download sizes, the more significant the impact on page load performance and the energy required to render a page.","permalink":"/catalog/web/avoid-chaining-critical-requests"},{"id":"catalog/cloud/compress-stored-data","title":"Compress stored data","description":"Description","permalink":"/catalog/cloud/compress-stored-data"},{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","permalink":"/catalog/cloud/containerize-your-workload-where-applicable"},{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","permalink":"/catalog/cloud/encrypt-what-is-necessary"},{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/web/keep-request-counts-low","title":"Keep request counts low","description":"Accessing a web page usually retrieves a HTML file from the web server. The HTML may then reference additional resources that the browser has to download.","permalink":"/catalog/web/keep-request-counts-low"},{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-avg-cpu-utilization"},{"id":"catalog/web/properly-sized-images","title":"Optimize image size","description":"Ideally, the stored pixel dimensions are exactly the same, or smaller, as the display size in pixels so that no bandwidth or storage space is wasted.","permalink":"/catalog/web/properly-sized-images"},{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-peak-cpu-utilization"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","permalink":"/catalog/cloud/scale-infrastructure-with-user-load"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","permalink":"/catalog/cloud/scale-logical-components-independently"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","title":"Time-shift Kubernetes cron jobs","description":"The carbon emissions of a software system depends on the power consumed by that software, but also on the Carbon intensity of the electricity it is powered on. For this reason, running energy-efficient software on carbon intensive electricity grid, might be inefficient to reduce its global carbon emissions. Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low.","permalink":"/catalog/cloud/time-shift-kubernetes-cron-jobs"},{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","permalink":"/catalog/cloud/evaluate-using-a-service-mesh"},{"id":"catalog/cloud/use-async-instead-of-sync","title":"Use Asynchronous network calls instead of synchronous","description":"When making calls across process boundaries to either databases or file systems or REST APIs, relying on synchronous calls can cause the calling thread to become blocked, putting additional load on the CPU","permalink":"/catalog/cloud/use-async-instead-of-sync"},{"id":"catalog/cloud/use-circuit-breaker","title":"Use circuit breaker patterns","description":"Modern applications need to communicate with other applications on a regular basis. Since these other applications have their own deployment schedule, downtimes and availability, the network connection to these application might have problems. If the other application is not reachable, all network requests against this other application will fail and future network requests are futile.","permalink":"/catalog/cloud/use-circuit-breaker"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","permalink":"/catalog/cloud/use-energy-efficient-hardware"}]}')}}]); \ No newline at end of file diff --git a/assets/js/5b55fa8e.7887cb5d.js b/assets/js/5b55fa8e.7887cb5d.js new file mode 100644 index 00000000..ed922679 --- /dev/null +++ b/assets/js/5b55fa8e.7887cb5d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[50],{7798:e=>{e.exports=JSON.parse('{"label":"size:medium","permalink":"/tags/size-medium","allTagsPath":"/tags","count":22,"items":[{"id":"catalog/web/avoid-excessive-dom-size","title":"Avoid an excessive DOM size","description":"The greater the amount of nodes that are defined in HTML, the greater the time spent processing and rendering each element.","permalink":"/catalog/web/avoid-excessive-dom-size"},{"id":"catalog/web/avoid-chaining-critical-requests","title":"Avoid chaining critical requests","description":"Most web experiences require a lot of work from the user\'s browser. The greater the length of the chains and the larger the download sizes, the more significant the impact on page load performance and the energy required to render a page.","permalink":"/catalog/web/avoid-chaining-critical-requests"},{"id":"catalog/cloud/compress-stored-data","title":"Compress stored data","description":"Description","permalink":"/catalog/cloud/compress-stored-data"},{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","permalink":"/catalog/cloud/containerize-your-workload-where-applicable"},{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","permalink":"/catalog/cloud/encrypt-what-is-necessary"},{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/web/keep-request-counts-low","title":"Keep request counts low","description":"Accessing a web page usually retrieves a HTML file from the web server. The HTML may then reference additional resources that the browser has to download.","permalink":"/catalog/web/keep-request-counts-low"},{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-avg-cpu-utilization"},{"id":"catalog/web/properly-sized-images","title":"Optimize image size","description":"Ideally, the stored pixel dimensions are exactly the same, or smaller, as the display size in pixels so that no bandwidth or storage space is wasted.","permalink":"/catalog/web/properly-sized-images"},{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-peak-cpu-utilization"},{"id":"catalog/cloud/reduce-network-traversal-between-VMs","title":"Reduce network traversal between VMs","description":"Description","permalink":"/catalog/cloud/reduce-network-traversal-between-VMs"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","permalink":"/catalog/cloud/scale-infrastructure-with-user-load"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","permalink":"/catalog/cloud/scale-logical-components-independently"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","title":"Time-shift Kubernetes cron jobs","description":"The carbon emissions of a software system depends on the power consumed by that software, but also on the Carbon intensity of the electricity it is powered on. For this reason, running energy-efficient software on carbon intensive electricity grid, might be inefficient to reduce its global carbon emissions. Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low.","permalink":"/catalog/cloud/time-shift-kubernetes-cron-jobs"},{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","permalink":"/catalog/cloud/evaluate-using-a-service-mesh"},{"id":"catalog/cloud/use-async-instead-of-sync","title":"Use Asynchronous network calls instead of synchronous","description":"When making calls across process boundaries to either databases or file systems or REST APIs, relying on synchronous calls can cause the calling thread to become blocked, putting additional load on the CPU","permalink":"/catalog/cloud/use-async-instead-of-sync"},{"id":"catalog/cloud/use-circuit-breaker","title":"Use circuit breaker patterns","description":"Modern applications need to communicate with other applications on a regular basis. Since these other applications have their own deployment schedule, downtimes and availability, the network connection to these application might have problems. If the other application is not reachable, all network requests against this other application will fail and future network requests are futile.","permalink":"/catalog/cloud/use-circuit-breaker"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","permalink":"/catalog/cloud/use-energy-efficient-hardware"}]}')}}]); \ No newline at end of file diff --git a/assets/js/5cff0ebf.b3ca71af.js b/assets/js/5cff0ebf.b3ca71af.js deleted file mode 100644 index 0c0d0a64..00000000 --- a/assets/js/5cff0ebf.b3ca71af.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8961],{3039:e=>{e.exports=JSON.parse('{"label":"compute","permalink":"/tags/compute","allTagsPath":"/tags","count":15,"items":[{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","permalink":"/catalog/cloud/containerize-your-workload-where-applicable"},{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/cloud/match-utilization-requirements-of-vm","title":"Match utilization requirements of virtual machines (VMs)","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-of-vm"},{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","title":"Match utilization requirements with pre-configured servers","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server"},{"id":"catalog/web/minimize-main-thread-work","title":"Minimize main thread work","description":"Description","permalink":"/catalog/web/minimize-main-thread-work"},{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-avg-cpu-utilization"},{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-peak-cpu-utilization"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","permalink":"/catalog/cloud/scale-infrastructure-with-user-load"},{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","permalink":"/catalog/cloud/scale-logical-components-independently"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/shed-lower-priority-traffic","title":"Shed lower priority traffic","description":"When resources are constrained during high-traffic events or when carbon intensity is high, more carbon emissions will be generated from your system. Adding more resources to support increased traffic requirements introduces more embodied carbon and more demand for electricity. Continuing to handle all requests during high carbon intensity will increase overall emissions for your system. Shedding traffic that is lower priority during these scenarios will save on resources and carbon emissions. This approach requires an understanding of your traffic, including which call requests are critical and which can best withstand retry attempts and failures.","permalink":"/catalog/cloud/shed-lower-priority-traffic"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/use-circuit-breaker","title":"Use circuit breaker patterns","description":"Modern applications need to communicate with other applications on a regular basis. Since these other applications have their own deployment schedule, downtimes and availability, the network connection to these application might have problems. If the other application is not reachable, all network requests against this other application will fail and future network requests are futile.","permalink":"/catalog/cloud/use-circuit-breaker"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","permalink":"/catalog/cloud/use-energy-efficient-hardware"}]}')}}]); \ No newline at end of file diff --git a/assets/js/5cff0ebf.ba24079c.js b/assets/js/5cff0ebf.ba24079c.js new file mode 100644 index 00000000..30ded40b --- /dev/null +++ b/assets/js/5cff0ebf.ba24079c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8961],{3039:e=>{e.exports=JSON.parse('{"label":"compute","permalink":"/tags/compute","allTagsPath":"/tags","count":16,"items":[{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","permalink":"/catalog/cloud/containerize-your-workload-where-applicable"},{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/cloud/match-utilization-requirements-of-vm","title":"Match utilization requirements of virtual machines (VMs)","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-of-vm"},{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","title":"Match utilization requirements with pre-configured servers","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server"},{"id":"catalog/web/minimize-main-thread-work","title":"Minimize main thread work","description":"Description","permalink":"/catalog/web/minimize-main-thread-work"},{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-avg-cpu-utilization"},{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-peak-cpu-utilization"},{"id":"catalog/cloud/reduce-network-traversal-between-VMs","title":"Reduce network traversal between VMs","description":"Description","permalink":"/catalog/cloud/reduce-network-traversal-between-VMs"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","permalink":"/catalog/cloud/scale-infrastructure-with-user-load"},{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","permalink":"/catalog/cloud/scale-logical-components-independently"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/shed-lower-priority-traffic","title":"Shed lower priority traffic","description":"When resources are constrained during high-traffic events or when carbon intensity is high, more carbon emissions will be generated from your system. Adding more resources to support increased traffic requirements introduces more embodied carbon and more demand for electricity. Continuing to handle all requests during high carbon intensity will increase overall emissions for your system. Shedding traffic that is lower priority during these scenarios will save on resources and carbon emissions. This approach requires an understanding of your traffic, including which call requests are critical and which can best withstand retry attempts and failures.","permalink":"/catalog/cloud/shed-lower-priority-traffic"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/use-circuit-breaker","title":"Use circuit breaker patterns","description":"Modern applications need to communicate with other applications on a regular basis. Since these other applications have their own deployment schedule, downtimes and availability, the network connection to these application might have problems. If the other application is not reachable, all network requests against this other application will fail and future network requests are futile.","permalink":"/catalog/cloud/use-circuit-breaker"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","permalink":"/catalog/cloud/use-energy-efficient-hardware"}]}')}}]); \ No newline at end of file diff --git a/assets/js/5e582b23.1e0eff5a.js b/assets/js/5e582b23.59948956.js similarity index 87% rename from assets/js/5e582b23.1e0eff5a.js rename to assets/js/5e582b23.59948956.js index cc0af041..d59f31f5 100644 --- a/assets/js/5e582b23.1e0eff5a.js +++ b/assets/js/5e582b23.59948956.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2645],{5554:e=>{e.exports=JSON.parse('{"label":"size:small","permalink":"/tags/size-small","allTagsPath":"/tags","count":34,"items":[{"id":"catalog/ai/serverless-model-development","title":"Adopt serverless architecture for AI/ML workload processes","description":"Building an ML model takes significant computing resources that need to be optimized for efficient utilization.","permalink":"/catalog/ai/serverless-model-development"},{"id":"catalog/web/avoid-tracking-unnecessary-data","title":"Avoid tracking unnecessary data","description":"User tracking, user data collection and targeting in things like advertisements are responsible for significant energy use in many digital products, and services.","permalink":"/catalog/web/avoid-tracking-unnecessary-data"},{"id":"catalog/cloud/cache-static-data","title":"Cache static data","description":"From an energy-efficiency perspective, it\'s better to reduce network traffic by reading the data locally through a cache rather than accessing it remotely over the network. Shortening the distance a network packet travels means that less energy is required to transmit it. Similarly, from an embodied carbon perspective, we are more efficient with hardware when a network packet traverses through less computing equipment.","permalink":"/catalog/cloud/cache-static-data"},{"id":"catalog/cloud/choose-region-closest-to-users","title":"Choose the region that is closest to users","description":"From an energy-efficiency perspective, it\'s better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.","permalink":"/catalog/cloud/choose-region-closest-to-users"},{"id":"catalog/cloud/compress-transmitted-data","title":"Compress transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.","permalink":"/catalog/cloud/compress-transmitted-data"},{"id":"catalog/web/defer-offscreen-images","title":"Defer offscreen images","description":"Web pages offer a lot of images that aren\'t displayed on the first loaded screen and can thus be loaded dynamically.","permalink":"/catalog/web/defer-offscreen-images"},{"id":"catalog/cloud/delete-unused-storage-resources","title":"Delete unused storage resources","description":"From an embodied carbon perspective, it\'s better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","permalink":"/catalog/cloud/delete-unused-storage-resources"},{"id":"catalog/web/deprecate-gifs","title":"Deprecate GIFs for animated content","description":"One direct replacement of the GIF is the MP4 video format which provides much smaller file sizes and higher quality at the same time.","permalink":"/catalog/web/deprecate-gifs"},{"id":"catalog/web/enable-text-compression","title":"Enable text compression","description":"Web browsers often communicate with web servers in a human readable format. These can be HTML, JavaScript and/or CSS files and REST requests which can return a response in JSON. This human readable communication is redundant and, as such, can be compressed to save bandwidth.","permalink":"/catalog/web/enable-text-compression"},{"id":"catalog/cloud/evaluate-other-cpu-architectures","title":"Evaluate other CPU architectures","description":"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types","permalink":"/catalog/cloud/evaluate-other-cpu-architectures"},{"id":"catalog/ai/pre-trained-transfer-learning","title":"Leverage pre-trained models and transfer learning for AI/ML development","description":"As part of your AI/ML process, you should evaluate using a pre-trained model and use transfer learning to avoid training a new model from scratch.","permalink":"/catalog/ai/pre-trained-transfer-learning"},{"id":"catalog/cloud/match-utilization-requirements-of-vm","title":"Match utilization requirements of virtual machines (VMs)","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-of-vm"},{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","title":"Match utilization requirements with pre-configured servers","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server"},{"id":"catalog/web/minify-web-assets","title":"Minify web assets","description":"Minification removes unnecessary or redundant data without affecting how the resource is processed by the web browser.","permalink":"/catalog/web/minify-web-assets"},{"id":"catalog/web/minimize-main-thread-work","title":"Minimize main thread work","description":"Description","permalink":"/catalog/web/minimize-main-thread-work"},{"id":"catalog/cloud/optimise-storage-resource-utilisation","title":"Optimise storage utilization","description":"It\'s better to maximise storage utilisation so the storage layer is optimised for the task, not only in terms of energy proportionality but also in terms of embodied carbon. Two storage units running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilised storage unit could be more efficiently used for another task or process.","permalink":"/catalog/cloud/optimise-storage-resource-utilisation"},{"id":"catalog/cloud/optimize-impact-on-customer-equipment","title":"Optimize impact on customer devices and equipment","description":"Description","permalink":"/catalog/cloud/optimize-impact-on-customer-equipment"},{"id":"catalog/ai/compress-ml-models-for-inference","title":"Optimize the size of AI/ML models","description":"Large-scale AI/ML models require significant storage space and take more resources to run as compared to optimized models.","permalink":"/catalog/ai/compress-ml-models-for-inference"},{"id":"catalog/cloud/queue-non-urgent-requests","title":"Queue non-urgent processing requests","description":"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.","permalink":"/catalog/cloud/queue-non-urgent-requests"},{"id":"catalog/cloud/reduce-transmitted-data","title":"Reduce transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.","permalink":"/catalog/cloud/reduce-transmitted-data"},{"id":"catalog/cloud/remove-unused-assets","title":"Remove unused assets","description":"Description","permalink":"/catalog/cloud/remove-unused-assets"},{"id":"catalog/web/remove-unused-css","title":"Remove unused CSS definitions","description":"CSS files are very complex and need energy intensive parsing and processing. Each added CSS definition increases the amount of time and processing power needed in this process.","permalink":"/catalog/web/remove-unused-css"},{"id":"catalog/ai/energy-efficent-ai-edge","title":"Run AI models at the edge","description":"Data computation for ML workloads and ML inference is a significant contributor to the carbon footprint of the ML application. Also, if the ML model is running on the cloud, the data needs to be transferred and processed on the cloud to the required format that can be used by the ML model for inference.","permalink":"/catalog/ai/energy-efficent-ai-edge"},{"id":"catalog/cloud/scale-down-unused-applications","title":"Scale down applications when not in use","description":"Applications consume CPU even when they are not actively in use. For example, background timers, garbage collection, health checks, etc. Even when the application is shut down, the underlying hardware is consuming idle power.","permalink":"/catalog/cloud/scale-down-unused-applications"},{"id":"catalog/cloud/scale-down-kubernetes-workloads","title":"Scale down kubernetes applications when not in use","description":"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes out of office hours. Thereby, optimization is implemented at the cluster level. For production clusters, where nodes need to stay up and running, optimization needs to be implemented at the application level.","permalink":"/catalog/cloud/scale-down-kubernetes-workloads"},{"id":"catalog/ai/energy-efficent-framework","title":"Select a more energy efficient AI/ML framework","description":"Training an AI model implies a significant carbon footprint. The underlying framework used for the development, training, and deployment of AI/ML needs to be evaluated and considered to ensure the process is as energy efficient as possible.","permalink":"/catalog/ai/energy-efficent-framework"},{"id":"catalog/ai/right-hardware-type","title":"Select the right hardware/VM instance types for AI/ML training","description":"Selecting the right hardware/VM instance types for training is one of the choices you should make as part of your energy-efficient AI/ML process.","permalink":"/catalog/ai/right-hardware-type"},{"id":"catalog/web/serve-images-in-modern-formats","title":"Serve images in modern formats","description":"Modern image formats can help to reduce bandwidth, storage and computing requirements on the displaying device.","permalink":"/catalog/web/serve-images-in-modern-formats"},{"id":"catalog/cloud/set-retention-policy-on-storage-resources","title":"Set storage retention policies","description":"From an embodied carbon perspective, it\'s better to have an automated mechanism to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","permalink":"/catalog/cloud/set-retention-policy-on-storage-resources"},{"id":"catalog/cloud/use-ddos-protection","title":"Use DDoS protection","description":"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.","permalink":"/catalog/cloud/use-ddos-protection"},{"id":"catalog/ai/efficent-format-for-model-training","title":"Use efficient file formats for AI/ML development","description":"Efficient storage of the model becomes extremely important to manage the data used for ML model development.","permalink":"/catalog/ai/efficent-format-for-model-training"},{"id":"catalog/ai/energy-efficent-models","title":"Use energy efficient AI/ML models","description":"Evaluate and use alternative, more energy efficient, models that provide similar functionality.","permalink":"/catalog/ai/energy-efficent-models"},{"id":"catalog/cloud/use-serverless","title":"Use serverless cloud services","description":"Description","permalink":"/catalog/cloud/use-serverless"},{"id":"catalog/ai/leverage-sustainable-regions","title":"Use sustainable regions for AI/ML training","description":"Depending on the model parameters and training iterations, training an AI/ML model consumes a lot of power and requires many servers which contribute to embodied emissions.","permalink":"/catalog/ai/leverage-sustainable-regions"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2645],{5554:e=>{e.exports=JSON.parse('{"label":"size:small","permalink":"/tags/size-small","allTagsPath":"/tags","count":35,"items":[{"id":"catalog/ai/serverless-model-development","title":"Adopt serverless architecture for AI/ML workload processes","description":"Building an ML model takes significant computing resources that need to be optimized for efficient utilization.","permalink":"/catalog/ai/serverless-model-development"},{"id":"catalog/web/avoid-tracking-unnecessary-data","title":"Avoid tracking unnecessary data","description":"User tracking, user data collection and targeting in things like advertisements are responsible for significant energy use in many digital products, and services.","permalink":"/catalog/web/avoid-tracking-unnecessary-data"},{"id":"catalog/cloud/cache-static-data","title":"Cache static data","description":"From an energy-efficiency perspective, it\'s better to reduce network traffic by reading the data locally through a cache rather than accessing it remotely over the network. Shortening the distance a network packet travels means that less energy is required to transmit it. Similarly, from an embodied carbon perspective, we are more efficient with hardware when a network packet traverses through less computing equipment.","permalink":"/catalog/cloud/cache-static-data"},{"id":"catalog/cloud/choose-region-closest-to-users","title":"Choose the region that is closest to users","description":"From an energy-efficiency perspective, it\'s better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.","permalink":"/catalog/cloud/choose-region-closest-to-users"},{"id":"catalog/cloud/compress-transmitted-data","title":"Compress transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.","permalink":"/catalog/cloud/compress-transmitted-data"},{"id":"catalog/web/defer-offscreen-images","title":"Defer offscreen images","description":"Web pages offer a lot of images that aren\'t displayed on the first loaded screen and can thus be loaded dynamically.","permalink":"/catalog/web/defer-offscreen-images"},{"id":"catalog/cloud/delete-unused-storage-resources","title":"Delete unused storage resources","description":"From an embodied carbon perspective, it\'s better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","permalink":"/catalog/cloud/delete-unused-storage-resources"},{"id":"catalog/web/deprecate-gifs","title":"Deprecate GIFs for animated content","description":"One direct replacement of the GIF is the MP4 video format which provides much smaller file sizes and higher quality at the same time.","permalink":"/catalog/web/deprecate-gifs"},{"id":"catalog/web/enable-text-compression","title":"Enable text compression","description":"Web browsers often communicate with web servers in a human readable format. These can be HTML, JavaScript and/or CSS files and REST requests which can return a response in JSON. This human readable communication is redundant and, as such, can be compressed to save bandwidth.","permalink":"/catalog/web/enable-text-compression"},{"id":"catalog/cloud/evaluate-other-cpu-architectures","title":"Evaluate other CPU architectures","description":"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types","permalink":"/catalog/cloud/evaluate-other-cpu-architectures"},{"id":"catalog/ai/pre-trained-transfer-learning","title":"Leverage pre-trained models and transfer learning for AI/ML development","description":"As part of your AI/ML process, you should evaluate using a pre-trained model and use transfer learning to avoid training a new model from scratch.","permalink":"/catalog/ai/pre-trained-transfer-learning"},{"id":"catalog/cloud/match-utilization-requirements-of-vm","title":"Match utilization requirements of virtual machines (VMs)","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-of-vm"},{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","title":"Match utilization requirements with pre-configured servers","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server"},{"id":"catalog/web/minify-web-assets","title":"Minify web assets","description":"Minification removes unnecessary or redundant data without affecting how the resource is processed by the web browser.","permalink":"/catalog/web/minify-web-assets"},{"id":"catalog/web/minimize-main-thread-work","title":"Minimize main thread work","description":"Description","permalink":"/catalog/web/minimize-main-thread-work"},{"id":"catalog/cloud/optimise-storage-resource-utilisation","title":"Optimise storage utilization","description":"It\'s better to maximise storage utilisation so the storage layer is optimised for the task, not only in terms of energy proportionality but also in terms of embodied carbon. Two storage units running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilised storage unit could be more efficiently used for another task or process.","permalink":"/catalog/cloud/optimise-storage-resource-utilisation"},{"id":"catalog/cloud/optimize-impact-on-customer-equipment","title":"Optimize impact on customer devices and equipment","description":"Description","permalink":"/catalog/cloud/optimize-impact-on-customer-equipment"},{"id":"catalog/ai/compress-ml-models-for-inference","title":"Optimize the size of AI/ML models","description":"Large-scale AI/ML models require significant storage space and take more resources to run as compared to optimized models.","permalink":"/catalog/ai/compress-ml-models-for-inference"},{"id":"catalog/cloud/queue-non-urgent-requests","title":"Queue non-urgent processing requests","description":"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.","permalink":"/catalog/cloud/queue-non-urgent-requests"},{"id":"catalog/cloud/reduce-transmitted-data","title":"Reduce transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.","permalink":"/catalog/cloud/reduce-transmitted-data"},{"id":"catalog/cloud/remove-unused-assets","title":"Remove unused assets","description":"Description","permalink":"/catalog/cloud/remove-unused-assets"},{"id":"catalog/web/remove-unused-css","title":"Remove unused CSS definitions","description":"CSS files are very complex and need energy intensive parsing and processing. Each added CSS definition increases the amount of time and processing power needed in this process.","permalink":"/catalog/web/remove-unused-css"},{"id":"catalog/ai/energy-efficent-ai-edge","title":"Run AI models at the edge","description":"Data computation for ML workloads and ML inference is a significant contributor to the carbon footprint of the ML application. Also, if the ML model is running on the cloud, the data needs to be transferred and processed on the cloud to the required format that can be used by the ML model for inference.","permalink":"/catalog/ai/energy-efficent-ai-edge"},{"id":"catalog/cloud/scale-down-unused-applications","title":"Scale down applications when not in use","description":"Applications consume CPU even when they are not actively in use. For example, background timers, garbage collection, health checks, etc. Even when the application is shut down, the underlying hardware is consuming idle power.","permalink":"/catalog/cloud/scale-down-unused-applications"},{"id":"catalog/cloud/scale-down-kubernetes-workloads","title":"Scale down kubernetes applications when not in use","description":"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes out of office hours. Thereby, optimization is implemented at the cluster level. For production clusters, where nodes need to stay up and running, optimization needs to be implemented at the application level.","permalink":"/catalog/cloud/scale-down-kubernetes-workloads"},{"id":"catalog/ai/energy-efficent-framework","title":"Select a more energy efficient AI/ML framework","description":"Training an AI model implies a significant carbon footprint. The underlying framework used for the development, training, and deployment of AI/ML needs to be evaluated and considered to ensure the process is as energy efficient as possible.","permalink":"/catalog/ai/energy-efficent-framework"},{"id":"catalog/ai/right-hardware-type","title":"Select the right hardware/VM instance types for AI/ML training","description":"Selecting the right hardware/VM instance types for training is one of the choices you should make as part of your energy-efficient AI/ML process.","permalink":"/catalog/ai/right-hardware-type"},{"id":"catalog/web/serve-images-in-modern-formats","title":"Serve images in modern formats","description":"Modern image formats can help to reduce bandwidth, storage and computing requirements on the displaying device.","permalink":"/catalog/web/serve-images-in-modern-formats"},{"id":"catalog/cloud/set-retention-policy-on-storage-resources","title":"Set storage retention policies","description":"From an embodied carbon perspective, it\'s better to have an automated mechanism to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","permalink":"/catalog/cloud/set-retention-policy-on-storage-resources"},{"id":"catalog/cloud/use-compiled-languages","title":"Use compiled languages","description":"Description","permalink":"/catalog/cloud/use-compiled-languages"},{"id":"catalog/cloud/use-ddos-protection","title":"Use DDoS protection","description":"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.","permalink":"/catalog/cloud/use-ddos-protection"},{"id":"catalog/ai/efficent-format-for-model-training","title":"Use efficient file formats for AI/ML development","description":"Efficient storage of the model becomes extremely important to manage the data used for ML model development.","permalink":"/catalog/ai/efficent-format-for-model-training"},{"id":"catalog/ai/energy-efficent-models","title":"Use energy efficient AI/ML models","description":"Evaluate and use alternative, more energy efficient, models that provide similar functionality.","permalink":"/catalog/ai/energy-efficent-models"},{"id":"catalog/cloud/use-serverless","title":"Use serverless cloud services","description":"Description","permalink":"/catalog/cloud/use-serverless"},{"id":"catalog/ai/leverage-sustainable-regions","title":"Use sustainable regions for AI/ML training","description":"Depending on the model parameters and training iterations, training an AI/ML model consumes a lot of power and requires many servers which contribute to embodied emissions.","permalink":"/catalog/ai/leverage-sustainable-regions"}]}')}}]); \ No newline at end of file diff --git a/assets/js/6dd24dad.57465850.js b/assets/js/6dd24dad.57465850.js deleted file mode 100644 index 2d529d60..00000000 --- a/assets/js/6dd24dad.57465850.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[9930],{4559:e=>{e.exports=JSON.parse('{"label":"network","permalink":"/tags/network","allTagsPath":"/tags","count":1,"items":[{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","permalink":"/catalog/cloud/evaluate-using-a-service-mesh"}]}')}}]); \ No newline at end of file diff --git a/assets/js/6dd24dad.66faac71.js b/assets/js/6dd24dad.66faac71.js new file mode 100644 index 00000000..06020dfc --- /dev/null +++ b/assets/js/6dd24dad.66faac71.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[9930],{4559:e=>{e.exports=JSON.parse('{"label":"network","permalink":"/tags/network","allTagsPath":"/tags","count":2,"items":[{"id":"catalog/cloud/reduce-network-traversal-between-VMs","title":"Reduce network traversal between VMs","description":"Description","permalink":"/catalog/cloud/reduce-network-traversal-between-VMs"},{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","permalink":"/catalog/cloud/evaluate-using-a-service-mesh"}]}')}}]); \ No newline at end of file diff --git a/assets/js/7ebec3ff.2b7b498a.js b/assets/js/7ebec3ff.2ae23e45.js similarity index 53% rename from assets/js/7ebec3ff.2b7b498a.js rename to assets/js/7ebec3ff.2ae23e45.js index f7fce4c7..b7f5e660 100644 --- a/assets/js/7ebec3ff.2b7b498a.js +++ b/assets/js/7ebec3ff.2ae23e45.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5419],{4321:e=>{e.exports=JSON.parse('{"label":"role:cloud-engineer","permalink":"/tags/role-cloud-engineer","allTagsPath":"/tags","count":26,"items":[{"id":"catalog/cloud/cache-static-data","title":"Cache static data","description":"From an energy-efficiency perspective, it\'s better to reduce network traffic by reading the data locally through a cache rather than accessing it remotely over the network. Shortening the distance a network packet travels means that less energy is required to transmit it. Similarly, from an embodied carbon perspective, we are more efficient with hardware when a network packet traverses through less computing equipment.","permalink":"/catalog/cloud/cache-static-data"},{"id":"catalog/cloud/choose-region-closest-to-users","title":"Choose the region that is closest to users","description":"From an energy-efficiency perspective, it\'s better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.","permalink":"/catalog/cloud/choose-region-closest-to-users"},{"id":"catalog/cloud/compress-transmitted-data","title":"Compress transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.","permalink":"/catalog/cloud/compress-transmitted-data"},{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","permalink":"/catalog/cloud/containerize-your-workload-where-applicable"},{"id":"catalog/cloud/delete-unused-storage-resources","title":"Delete unused storage resources","description":"From an embodied carbon perspective, it\'s better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","permalink":"/catalog/cloud/delete-unused-storage-resources"},{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","permalink":"/catalog/cloud/encrypt-what-is-necessary"},{"id":"catalog/cloud/match-utilization-requirements-of-vm","title":"Match utilization requirements of virtual machines (VMs)","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-of-vm"},{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","title":"Match utilization requirements with pre-configured servers","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server"},{"id":"catalog/cloud/optimise-storage-resource-utilisation","title":"Optimise storage utilization","description":"It\'s better to maximise storage utilisation so the storage layer is optimised for the task, not only in terms of energy proportionality but also in terms of embodied carbon. Two storage units running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilised storage unit could be more efficiently used for another task or process.","permalink":"/catalog/cloud/optimise-storage-resource-utilisation"},{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-avg-cpu-utilization"},{"id":"catalog/cloud/optimize-impact-on-customer-equipment","title":"Optimize impact on customer devices and equipment","description":"Description","permalink":"/catalog/cloud/optimize-impact-on-customer-equipment"},{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-peak-cpu-utilization"},{"id":"catalog/cloud/queue-non-urgent-requests","title":"Queue non-urgent processing requests","description":"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.","permalink":"/catalog/cloud/queue-non-urgent-requests"},{"id":"catalog/cloud/reduce-transmitted-data","title":"Reduce transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.","permalink":"/catalog/cloud/reduce-transmitted-data"},{"id":"catalog/cloud/remove-unused-assets","title":"Remove unused assets","description":"Description","permalink":"/catalog/cloud/remove-unused-assets"},{"id":"catalog/cloud/scale-down-kubernetes-workloads","title":"Scale down kubernetes applications when not in use","description":"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes out of office hours. Thereby, optimization is implemented at the cluster level. For production clusters, where nodes need to stay up and running, optimization needs to be implemented at the application level.","permalink":"/catalog/cloud/scale-down-kubernetes-workloads"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","permalink":"/catalog/cloud/scale-infrastructure-with-user-load"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","permalink":"/catalog/cloud/scale-logical-components-independently"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/set-retention-policy-on-storage-resources","title":"Set storage retention policies","description":"From an embodied carbon perspective, it\'s better to have an automated mechanism to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","permalink":"/catalog/cloud/set-retention-policy-on-storage-resources"},{"id":"catalog/cloud/shed-lower-priority-traffic","title":"Shed lower priority traffic","description":"When resources are constrained during high-traffic events or when carbon intensity is high, more carbon emissions will be generated from your system. Adding more resources to support increased traffic requirements introduces more embodied carbon and more demand for electricity. Continuing to handle all requests during high carbon intensity will increase overall emissions for your system. Shedding traffic that is lower priority during these scenarios will save on resources and carbon emissions. This approach requires an understanding of your traffic, including which call requests are critical and which can best withstand retry attempts and failures.","permalink":"/catalog/cloud/shed-lower-priority-traffic"},{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","title":"Time-shift Kubernetes cron jobs","description":"The carbon emissions of a software system depends on the power consumed by that software, but also on the Carbon intensity of the electricity it is powered on. For this reason, running energy-efficient software on carbon intensive electricity grid, might be inefficient to reduce its global carbon emissions. Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low.","permalink":"/catalog/cloud/time-shift-kubernetes-cron-jobs"},{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","permalink":"/catalog/cloud/evaluate-using-a-service-mesh"},{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","permalink":"/catalog/cloud/use-energy-efficient-hardware"},{"id":"catalog/cloud/use-serverless","title":"Use serverless cloud services","description":"Description","permalink":"/catalog/cloud/use-serverless"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5419],{4321:e=>{e.exports=JSON.parse('{"label":"role:cloud-engineer","permalink":"/tags/role-cloud-engineer","allTagsPath":"/tags","count":28,"items":[{"id":"catalog/cloud/cache-static-data","title":"Cache static data","description":"From an energy-efficiency perspective, it\'s better to reduce network traffic by reading the data locally through a cache rather than accessing it remotely over the network. Shortening the distance a network packet travels means that less energy is required to transmit it. Similarly, from an embodied carbon perspective, we are more efficient with hardware when a network packet traverses through less computing equipment.","permalink":"/catalog/cloud/cache-static-data"},{"id":"catalog/cloud/choose-region-closest-to-users","title":"Choose the region that is closest to users","description":"From an energy-efficiency perspective, it\'s better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.","permalink":"/catalog/cloud/choose-region-closest-to-users"},{"id":"catalog/cloud/compress-transmitted-data","title":"Compress transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.","permalink":"/catalog/cloud/compress-transmitted-data"},{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","permalink":"/catalog/cloud/containerize-your-workload-where-applicable"},{"id":"catalog/cloud/delete-unused-storage-resources","title":"Delete unused storage resources","description":"From an embodied carbon perspective, it\'s better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","permalink":"/catalog/cloud/delete-unused-storage-resources"},{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","permalink":"/catalog/cloud/encrypt-what-is-necessary"},{"id":"catalog/cloud/match-utilization-requirements-of-vm","title":"Match utilization requirements of virtual machines (VMs)","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-of-vm"},{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","title":"Match utilization requirements with pre-configured servers","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server"},{"id":"catalog/cloud/optimise-storage-resource-utilisation","title":"Optimise storage utilization","description":"It\'s better to maximise storage utilisation so the storage layer is optimised for the task, not only in terms of energy proportionality but also in terms of embodied carbon. Two storage units running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilised storage unit could be more efficiently used for another task or process.","permalink":"/catalog/cloud/optimise-storage-resource-utilisation"},{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-avg-cpu-utilization"},{"id":"catalog/cloud/optimize-impact-on-customer-equipment","title":"Optimize impact on customer devices and equipment","description":"Description","permalink":"/catalog/cloud/optimize-impact-on-customer-equipment"},{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-peak-cpu-utilization"},{"id":"catalog/cloud/queue-non-urgent-requests","title":"Queue non-urgent processing requests","description":"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.","permalink":"/catalog/cloud/queue-non-urgent-requests"},{"id":"catalog/cloud/reduce-network-traversal-between-VMs","title":"Reduce network traversal between VMs","description":"Description","permalink":"/catalog/cloud/reduce-network-traversal-between-VMs"},{"id":"catalog/cloud/reduce-transmitted-data","title":"Reduce transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.","permalink":"/catalog/cloud/reduce-transmitted-data"},{"id":"catalog/cloud/remove-unused-assets","title":"Remove unused assets","description":"Description","permalink":"/catalog/cloud/remove-unused-assets"},{"id":"catalog/cloud/scale-down-kubernetes-workloads","title":"Scale down kubernetes applications when not in use","description":"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes out of office hours. Thereby, optimization is implemented at the cluster level. For production clusters, where nodes need to stay up and running, optimization needs to be implemented at the application level.","permalink":"/catalog/cloud/scale-down-kubernetes-workloads"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","permalink":"/catalog/cloud/scale-infrastructure-with-user-load"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","permalink":"/catalog/cloud/scale-logical-components-independently"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/set-retention-policy-on-storage-resources","title":"Set storage retention policies","description":"From an embodied carbon perspective, it\'s better to have an automated mechanism to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","permalink":"/catalog/cloud/set-retention-policy-on-storage-resources"},{"id":"catalog/cloud/shed-lower-priority-traffic","title":"Shed lower priority traffic","description":"When resources are constrained during high-traffic events or when carbon intensity is high, more carbon emissions will be generated from your system. Adding more resources to support increased traffic requirements introduces more embodied carbon and more demand for electricity. Continuing to handle all requests during high carbon intensity will increase overall emissions for your system. Shedding traffic that is lower priority during these scenarios will save on resources and carbon emissions. This approach requires an understanding of your traffic, including which call requests are critical and which can best withstand retry attempts and failures.","permalink":"/catalog/cloud/shed-lower-priority-traffic"},{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","title":"Time-shift Kubernetes cron jobs","description":"The carbon emissions of a software system depends on the power consumed by that software, but also on the Carbon intensity of the electricity it is powered on. For this reason, running energy-efficient software on carbon intensive electricity grid, might be inefficient to reduce its global carbon emissions. Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low.","permalink":"/catalog/cloud/time-shift-kubernetes-cron-jobs"},{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","permalink":"/catalog/cloud/evaluate-using-a-service-mesh"},{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","permalink":"/catalog/cloud/use-energy-efficient-hardware"},{"id":"catalog/cloud/use-compiled-languages","title":"Use compiled languages","description":"Description","permalink":"/catalog/cloud/use-compiled-languages"},{"id":"catalog/cloud/use-serverless","title":"Use serverless cloud services","description":"Description","permalink":"/catalog/cloud/use-serverless"}]}')}}]); \ No newline at end of file diff --git a/assets/js/8d33f67c.3859ef35.js b/assets/js/8d33f67c.3859ef35.js deleted file mode 100644 index cd05cbfc..00000000 --- a/assets/js/8d33f67c.3859ef35.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[3079],{253:e=>{e.exports=JSON.parse('{"label":"kubernetes","permalink":"/tags/kubernetes","allTagsPath":"/tags","count":11,"items":[{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","permalink":"/catalog/cloud/containerize-your-workload-where-applicable"},{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/cloud/scale-down-kubernetes-workloads","title":"Scale down kubernetes applications when not in use","description":"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes out of office hours. Thereby, optimization is implemented at the cluster level. For production clusters, where nodes need to stay up and running, optimization needs to be implemented at the application level.","permalink":"/catalog/cloud/scale-down-kubernetes-workloads"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","permalink":"/catalog/cloud/scale-logical-components-independently"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","title":"Time-shift Kubernetes cron jobs","description":"The carbon emissions of a software system depends on the power consumed by that software, but also on the Carbon intensity of the electricity it is powered on. For this reason, running energy-efficient software on carbon intensive electricity grid, might be inefficient to reduce its global carbon emissions. Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low.","permalink":"/catalog/cloud/time-shift-kubernetes-cron-jobs"},{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","permalink":"/catalog/cloud/evaluate-using-a-service-mesh"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","permalink":"/catalog/cloud/use-energy-efficient-hardware"}]}')}}]); \ No newline at end of file diff --git a/assets/js/8d33f67c.95299b36.js b/assets/js/8d33f67c.95299b36.js new file mode 100644 index 00000000..0dec747d --- /dev/null +++ b/assets/js/8d33f67c.95299b36.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[3079],{253:e=>{e.exports=JSON.parse('{"label":"kubernetes","permalink":"/tags/kubernetes","allTagsPath":"/tags","count":12,"items":[{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","permalink":"/catalog/cloud/containerize-your-workload-where-applicable"},{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/cloud/reduce-network-traversal-between-VMs","title":"Reduce network traversal between VMs","description":"Description","permalink":"/catalog/cloud/reduce-network-traversal-between-VMs"},{"id":"catalog/cloud/scale-down-kubernetes-workloads","title":"Scale down kubernetes applications when not in use","description":"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes out of office hours. Thereby, optimization is implemented at the cluster level. For production clusters, where nodes need to stay up and running, optimization needs to be implemented at the application level.","permalink":"/catalog/cloud/scale-down-kubernetes-workloads"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","permalink":"/catalog/cloud/scale-logical-components-independently"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","title":"Time-shift Kubernetes cron jobs","description":"The carbon emissions of a software system depends on the power consumed by that software, but also on the Carbon intensity of the electricity it is powered on. For this reason, running energy-efficient software on carbon intensive electricity grid, might be inefficient to reduce its global carbon emissions. Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low.","permalink":"/catalog/cloud/time-shift-kubernetes-cron-jobs"},{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","permalink":"/catalog/cloud/evaluate-using-a-service-mesh"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","permalink":"/catalog/cloud/use-energy-efficient-hardware"}]}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.718b7629.js b/assets/js/935f2afb.718b7629.js deleted file mode 100644 index 23d3916f..00000000 --- a/assets/js/935f2afb.718b7629.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Green Software Patterns","href":"/","docId":"index"},{"type":"category","label":"Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Suggested Tags","href":"/guide/suggested-tags","docId":"guide/suggested-tags"},{"type":"link","label":"Initial Review Guide","href":"/guide/initial-reviewer-guide","docId":"guide/initial-reviewer-guide"},{"type":"link","label":"Subject Matter Expert (SME) Review Guide","href":"/guide/sme-reviewer-guide","docId":"guide/sme-reviewer-guide"}],"href":"/guide/"},{"type":"category","label":"Catalog","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Artificial Intelligence (AI)","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Optimize the size of AI/ML models","href":"/catalog/ai/compress-ml-models-for-inference","docId":"catalog/ai/compress-ml-models-for-inference"},{"type":"link","label":"Use efficient file formats for AI/ML development","href":"/catalog/ai/efficent-format-for-model-training","docId":"catalog/ai/efficent-format-for-model-training"},{"type":"link","label":"Run AI models at the edge","href":"/catalog/ai/energy-efficent-ai-edge","docId":"catalog/ai/energy-efficent-ai-edge"},{"type":"link","label":"Select a more energy efficient AI/ML framework","href":"/catalog/ai/energy-efficent-framework","docId":"catalog/ai/energy-efficent-framework"},{"type":"link","label":"Use energy efficient AI/ML models","href":"/catalog/ai/energy-efficent-models","docId":"catalog/ai/energy-efficent-models"},{"type":"link","label":"Use sustainable regions for AI/ML training","href":"/catalog/ai/leverage-sustainable-regions","docId":"catalog/ai/leverage-sustainable-regions"},{"type":"link","label":"Leverage pre-trained models and transfer learning for AI/ML development","href":"/catalog/ai/pre-trained-transfer-learning","docId":"catalog/ai/pre-trained-transfer-learning"},{"type":"link","label":"Select the right hardware/VM instance types for AI/ML training","href":"/catalog/ai/right-hardware-type","docId":"catalog/ai/right-hardware-type"},{"type":"link","label":"Adopt serverless architecture for AI/ML workload processes","href":"/catalog/ai/serverless-model-development","docId":"catalog/ai/serverless-model-development"}],"href":"/catalog/ai/"},{"type":"category","label":"Cloud","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Cache static data","href":"/catalog/cloud/cache-static-data","docId":"catalog/cloud/cache-static-data"},{"type":"link","label":"Choose the region that is closest to users","href":"/catalog/cloud/choose-region-closest-to-users","docId":"catalog/cloud/choose-region-closest-to-users"},{"type":"link","label":"Compress stored data","href":"/catalog/cloud/compress-stored-data","docId":"catalog/cloud/compress-stored-data"},{"type":"link","label":"Compress transmitted data","href":"/catalog/cloud/compress-transmitted-data","docId":"catalog/cloud/compress-transmitted-data"},{"type":"link","label":"Containerize your workloads","href":"/catalog/cloud/containerize-your-workload-where-applicable","docId":"catalog/cloud/containerize-your-workload-where-applicable"},{"type":"link","label":"Delete unused storage resources","href":"/catalog/cloud/delete-unused-storage-resources","docId":"catalog/cloud/delete-unused-storage-resources"},{"type":"link","label":"Encrypt what is necessary","href":"/catalog/cloud/encrypt-what-is-necessary","docId":"catalog/cloud/encrypt-what-is-necessary"},{"type":"link","label":"Evaluate other CPU architectures","href":"/catalog/cloud/evaluate-other-cpu-architectures","docId":"catalog/cloud/evaluate-other-cpu-architectures"},{"type":"link","label":"Use a service mesh only if needed","href":"/catalog/cloud/evaluate-using-a-service-mesh","docId":"catalog/cloud/evaluate-using-a-service-mesh"},{"type":"link","label":"Terminate TLS at border gateway","href":"/catalog/cloud/evaluate-whether-to-use-TLS-termination","docId":"catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"type":"link","label":"Implement stateless design","href":"/catalog/cloud/implement-stateless-design","docId":"catalog/cloud/implement-stateless-design"},{"type":"link","label":"Match your service level objectives to business needs","href":"/catalog/cloud/match-slo","docId":"catalog/cloud/match-slo"},{"type":"link","label":"Match utilization requirements of virtual machines (VMs)","href":"/catalog/cloud/match-utilization-requirements-of-vm","docId":"catalog/cloud/match-utilization-requirements-of-vm"},{"type":"link","label":"Match utilization requirements with pre-configured servers","href":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server","docId":"catalog/cloud/match-utilization-requirements-with-pre-configured-server"},{"type":"link","label":"Minimize the total number of deployed environments","href":"/catalog/cloud/minimizing-deployed-environments","docId":"catalog/cloud/minimizing-deployed-environments"},{"type":"link","label":"Optimise storage utilization","href":"/catalog/cloud/optimise-storage-resource-utilisation","docId":"catalog/cloud/optimise-storage-resource-utilisation"},{"type":"link","label":"Optimize average CPU utilization","href":"/catalog/cloud/optimize-avg-cpu-utilization","docId":"catalog/cloud/optimize-avg-cpu-utilization"},{"type":"link","label":"Optimize impact on customer devices and equipment","href":"/catalog/cloud/optimize-impact-on-customer-equipment","docId":"catalog/cloud/optimize-impact-on-customer-equipment"},{"type":"link","label":"Optimize peak CPU utilization","href":"/catalog/cloud/optimize-peak-cpu-utilization","docId":"catalog/cloud/optimize-peak-cpu-utilization"},{"type":"link","label":"Queue non-urgent processing requests","href":"/catalog/cloud/queue-non-urgent-requests","docId":"catalog/cloud/queue-non-urgent-requests"},{"type":"link","label":"Reduce transmitted data","href":"/catalog/cloud/reduce-transmitted-data","docId":"catalog/cloud/reduce-transmitted-data"},{"type":"link","label":"Remove unused assets","href":"/catalog/cloud/remove-unused-assets","docId":"catalog/cloud/remove-unused-assets"},{"type":"link","label":"Scale down kubernetes applications when not in use","href":"/catalog/cloud/scale-down-kubernetes-workloads","docId":"catalog/cloud/scale-down-kubernetes-workloads"},{"type":"link","label":"Scale down applications when not in use","href":"/catalog/cloud/scale-down-unused-applications","docId":"catalog/cloud/scale-down-unused-applications"},{"type":"link","label":"Scale infrastructure with user load","href":"/catalog/cloud/scale-infrastructure-with-user-load","docId":"catalog/cloud/scale-infrastructure-with-user-load"},{"type":"link","label":"Scale Kubernetes workloads based on relevant demand metrics","href":"/catalog/cloud/scale-kubernetes-workloads-based-on-events","docId":"catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"type":"link","label":"Scale logical components independently","href":"/catalog/cloud/scale-logical-components-independently","docId":"catalog/cloud/scale-logical-components-independently"},{"type":"link","label":"Scan for vulnerabilities","href":"/catalog/cloud/scan-for-vulnerabilities","docId":"catalog/cloud/scan-for-vulnerabilities"},{"type":"link","label":"Set storage retention policies","href":"/catalog/cloud/set-retention-policy-on-storage-resources","docId":"catalog/cloud/set-retention-policy-on-storage-resources"},{"type":"link","label":"Shed lower priority traffic","href":"/catalog/cloud/shed-lower-priority-traffic","docId":"catalog/cloud/shed-lower-priority-traffic"},{"type":"link","label":"Time-shift Kubernetes cron jobs","href":"/catalog/cloud/time-shift-kubernetes-cron-jobs","docId":"catalog/cloud/time-shift-kubernetes-cron-jobs"},{"type":"link","label":"Use Asynchronous network calls instead of synchronous","href":"/catalog/cloud/use-async-instead-of-sync","docId":"catalog/cloud/use-async-instead-of-sync"},{"type":"link","label":"Use circuit breaker patterns","href":"/catalog/cloud/use-circuit-breaker","docId":"catalog/cloud/use-circuit-breaker"},{"type":"link","label":"Use cloud native network security tools and controls","href":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls","docId":"catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"type":"link","label":"Use DDoS protection","href":"/catalog/cloud/use-ddos-protection","docId":"catalog/cloud/use-ddos-protection"},{"type":"link","label":"Use cloud native processor VMs","href":"/catalog/cloud/use-energy-efficient-hardware","docId":"catalog/cloud/use-energy-efficient-hardware"},{"type":"link","label":"Use serverless cloud services","href":"/catalog/cloud/use-serverless","docId":"catalog/cloud/use-serverless"}],"href":"/catalog/cloud/"},{"type":"category","label":"Web","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Avoid chaining critical requests","href":"/catalog/web/avoid-chaining-critical-requests","docId":"catalog/web/avoid-chaining-critical-requests"},{"type":"link","label":"Avoid an excessive DOM size","href":"/catalog/web/avoid-excessive-dom-size","docId":"catalog/web/avoid-excessive-dom-size"},{"type":"link","label":"Avoid tracking unnecessary data","href":"/catalog/web/avoid-tracking-unnecessary-data","docId":"catalog/web/avoid-tracking-unnecessary-data"},{"type":"link","label":"Defer offscreen images","href":"/catalog/web/defer-offscreen-images","docId":"catalog/web/defer-offscreen-images"},{"type":"link","label":"Deprecate GIFs for animated content","href":"/catalog/web/deprecate-gifs","docId":"catalog/web/deprecate-gifs"},{"type":"link","label":"Enable text compression","href":"/catalog/web/enable-text-compression","docId":"catalog/web/enable-text-compression"},{"type":"link","label":"Keep request counts low","href":"/catalog/web/keep-request-counts-low","docId":"catalog/web/keep-request-counts-low"},{"type":"link","label":"Minify web assets","href":"/catalog/web/minify-web-assets","docId":"catalog/web/minify-web-assets"},{"type":"link","label":"Minimize main thread work","href":"/catalog/web/minimize-main-thread-work","docId":"catalog/web/minimize-main-thread-work"},{"type":"link","label":"Optimize image size","href":"/catalog/web/properly-sized-images","docId":"catalog/web/properly-sized-images"},{"type":"link","label":"Remove unused CSS definitions","href":"/catalog/web/remove-unused-css","docId":"catalog/web/remove-unused-css"},{"type":"link","label":"Serve images in modern formats","href":"/catalog/web/serve-images-in-modern-formats","docId":"catalog/web/serve-images-in-modern-formats"},{"type":"link","label":"Use server-side rendering for high-traffic pages","href":"/catalog/web/use-server-side-rendering","docId":"catalog/web/use-server-side-rendering"}],"href":"/catalog/web/"}],"href":"/catalog/"},{"type":"link","label":"Tags","href":"/tags/","docId":"tags/index"}]},"docs":{"catalog/ai/compress-ml-models-for-inference":{"id":"catalog/ai/compress-ml-models-for-inference","title":"Optimize the size of AI/ML models","description":"Large-scale AI/ML models require significant storage space and take more resources to run as compared to optimized models.","sidebar":"tutorialSidebar"},"catalog/ai/efficent-format-for-model-training":{"id":"catalog/ai/efficent-format-for-model-training","title":"Use efficient file formats for AI/ML development","description":"Efficient storage of the model becomes extremely important to manage the data used for ML model development.","sidebar":"tutorialSidebar"},"catalog/ai/energy-efficent-ai-edge":{"id":"catalog/ai/energy-efficent-ai-edge","title":"Run AI models at the edge","description":"Data computation for ML workloads and ML inference is a significant contributor to the carbon footprint of the ML application. Also, if the ML model is running on the cloud, the data needs to be transferred and processed on the cloud to the required format that can be used by the ML model for inference.","sidebar":"tutorialSidebar"},"catalog/ai/energy-efficent-framework":{"id":"catalog/ai/energy-efficent-framework","title":"Select a more energy efficient AI/ML framework","description":"Training an AI model implies a significant carbon footprint. The underlying framework used for the development, training, and deployment of AI/ML needs to be evaluated and considered to ensure the process is as energy efficient as possible.","sidebar":"tutorialSidebar"},"catalog/ai/energy-efficent-models":{"id":"catalog/ai/energy-efficent-models","title":"Use energy efficient AI/ML models","description":"Evaluate and use alternative, more energy efficient, models that provide similar functionality.","sidebar":"tutorialSidebar"},"catalog/ai/index":{"id":"catalog/ai/index","title":"Artificial Intelligence (AI)","description":"Subject Matter Experts","sidebar":"tutorialSidebar"},"catalog/ai/leverage-sustainable-regions":{"id":"catalog/ai/leverage-sustainable-regions","title":"Use sustainable regions for AI/ML training","description":"Depending on the model parameters and training iterations, training an AI/ML model consumes a lot of power and requires many servers which contribute to embodied emissions.","sidebar":"tutorialSidebar"},"catalog/ai/pre-trained-transfer-learning":{"id":"catalog/ai/pre-trained-transfer-learning","title":"Leverage pre-trained models and transfer learning for AI/ML development","description":"As part of your AI/ML process, you should evaluate using a pre-trained model and use transfer learning to avoid training a new model from scratch.","sidebar":"tutorialSidebar"},"catalog/ai/right-hardware-type":{"id":"catalog/ai/right-hardware-type","title":"Select the right hardware/VM instance types for AI/ML training","description":"Selecting the right hardware/VM instance types for training is one of the choices you should make as part of your energy-efficient AI/ML process.","sidebar":"tutorialSidebar"},"catalog/ai/serverless-model-development":{"id":"catalog/ai/serverless-model-development","title":"Adopt serverless architecture for AI/ML workload processes","description":"Building an ML model takes significant computing resources that need to be optimized for efficient utilization.","sidebar":"tutorialSidebar"},"catalog/cloud/cache-static-data":{"id":"catalog/cloud/cache-static-data","title":"Cache static data","description":"From an energy-efficiency perspective, it\'s better to reduce network traffic by reading the data locally through a cache rather than accessing it remotely over the network. Shortening the distance a network packet travels means that less energy is required to transmit it. Similarly, from an embodied carbon perspective, we are more efficient with hardware when a network packet traverses through less computing equipment.","sidebar":"tutorialSidebar"},"catalog/cloud/choose-region-closest-to-users":{"id":"catalog/cloud/choose-region-closest-to-users","title":"Choose the region that is closest to users","description":"From an energy-efficiency perspective, it\'s better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.","sidebar":"tutorialSidebar"},"catalog/cloud/compress-stored-data":{"id":"catalog/cloud/compress-stored-data","title":"Compress stored data","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/compress-transmitted-data":{"id":"catalog/cloud/compress-transmitted-data","title":"Compress transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.","sidebar":"tutorialSidebar"},"catalog/cloud/containerize-your-workload-where-applicable":{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/delete-unused-storage-resources":{"id":"catalog/cloud/delete-unused-storage-resources","title":"Delete unused storage resources","description":"From an embodied carbon perspective, it\'s better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","sidebar":"tutorialSidebar"},"catalog/cloud/encrypt-what-is-necessary":{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","sidebar":"tutorialSidebar"},"catalog/cloud/evaluate-other-cpu-architectures":{"id":"catalog/cloud/evaluate-other-cpu-architectures","title":"Evaluate other CPU architectures","description":"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types","sidebar":"tutorialSidebar"},"catalog/cloud/evaluate-using-a-service-mesh":{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/evaluate-whether-to-use-TLS-termination":{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","sidebar":"tutorialSidebar"},"catalog/cloud/implement-stateless-design":{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","sidebar":"tutorialSidebar"},"catalog/cloud/index":{"id":"catalog/cloud/index","title":"Cloud","description":"Subject Matter Experts","sidebar":"tutorialSidebar"},"catalog/cloud/match-slo":{"id":"catalog/cloud/match-slo","title":"Match your service level objectives to business needs","description":"If service downtimes are acceptable it\'s better to not strive for highest availability but to design the solution according to real business needs. Lower availability guarantees can help reduce energy consumption by using less infrastructure components.","sidebar":"tutorialSidebar"},"catalog/cloud/match-utilization-requirements-of-vm":{"id":"catalog/cloud/match-utilization-requirements-of-vm","title":"Match utilization requirements of virtual machines (VMs)","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","sidebar":"tutorialSidebar"},"catalog/cloud/match-utilization-requirements-with-pre-configured-server":{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","title":"Match utilization requirements with pre-configured servers","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","sidebar":"tutorialSidebar"},"catalog/cloud/minimizing-deployed-environments":{"id":"catalog/cloud/minimizing-deployed-environments","title":"Minimize the total number of deployed environments","description":"In a given application, there may be a need to utilize multiple environments in the application workflow. Typically, a development environment is used for regular updates, while staging or testing enviroments are used to make sure there are no issues before code reaches a production environment where users may have access. Each added environment has an increasing energy impact, which in turn creates more emissions. As such, it is important to understand the necessity of each enviroment and it\'s environmental impact.","sidebar":"tutorialSidebar"},"catalog/cloud/optimise-storage-resource-utilisation":{"id":"catalog/cloud/optimise-storage-resource-utilisation","title":"Optimise storage utilization","description":"It\'s better to maximise storage utilisation so the storage layer is optimised for the task, not only in terms of energy proportionality but also in terms of embodied carbon. Two storage units running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilised storage unit could be more efficiently used for another task or process.","sidebar":"tutorialSidebar"},"catalog/cloud/optimize-avg-cpu-utilization":{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","sidebar":"tutorialSidebar"},"catalog/cloud/optimize-impact-on-customer-equipment":{"id":"catalog/cloud/optimize-impact-on-customer-equipment","title":"Optimize impact on customer devices and equipment","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/optimize-peak-cpu-utilization":{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","sidebar":"tutorialSidebar"},"catalog/cloud/queue-non-urgent-requests":{"id":"catalog/cloud/queue-non-urgent-requests","title":"Queue non-urgent processing requests","description":"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.","sidebar":"tutorialSidebar"},"catalog/cloud/reduce-transmitted-data":{"id":"catalog/cloud/reduce-transmitted-data","title":"Reduce transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.","sidebar":"tutorialSidebar"},"catalog/cloud/remove-unused-assets":{"id":"catalog/cloud/remove-unused-assets","title":"Remove unused assets","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/scale-down-kubernetes-workloads":{"id":"catalog/cloud/scale-down-kubernetes-workloads","title":"Scale down kubernetes applications when not in use","description":"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes out of office hours. Thereby, optimization is implemented at the cluster level. For production clusters, where nodes need to stay up and running, optimization needs to be implemented at the application level.","sidebar":"tutorialSidebar"},"catalog/cloud/scale-down-unused-applications":{"id":"catalog/cloud/scale-down-unused-applications","title":"Scale down applications when not in use","description":"Applications consume CPU even when they are not actively in use. For example, background timers, garbage collection, health checks, etc. Even when the application is shut down, the underlying hardware is consuming idle power.","sidebar":"tutorialSidebar"},"catalog/cloud/scale-infrastructure-with-user-load":{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","sidebar":"tutorialSidebar"},"catalog/cloud/scale-kubernetes-workloads-based-on-events":{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","sidebar":"tutorialSidebar"},"catalog/cloud/scale-logical-components-independently":{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/scan-for-vulnerabilities":{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","sidebar":"tutorialSidebar"},"catalog/cloud/set-retention-policy-on-storage-resources":{"id":"catalog/cloud/set-retention-policy-on-storage-resources","title":"Set storage retention policies","description":"From an embodied carbon perspective, it\'s better to have an automated mechanism to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","sidebar":"tutorialSidebar"},"catalog/cloud/shed-lower-priority-traffic":{"id":"catalog/cloud/shed-lower-priority-traffic","title":"Shed lower priority traffic","description":"When resources are constrained during high-traffic events or when carbon intensity is high, more carbon emissions will be generated from your system. Adding more resources to support increased traffic requirements introduces more embodied carbon and more demand for electricity. Continuing to handle all requests during high carbon intensity will increase overall emissions for your system. Shedding traffic that is lower priority during these scenarios will save on resources and carbon emissions. This approach requires an understanding of your traffic, including which call requests are critical and which can best withstand retry attempts and failures.","sidebar":"tutorialSidebar"},"catalog/cloud/time-shift-kubernetes-cron-jobs":{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","title":"Time-shift Kubernetes cron jobs","description":"The carbon emissions of a software system depends on the power consumed by that software, but also on the Carbon intensity of the electricity it is powered on. For this reason, running energy-efficient software on carbon intensive electricity grid, might be inefficient to reduce its global carbon emissions. Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low.","sidebar":"tutorialSidebar"},"catalog/cloud/use-async-instead-of-sync":{"id":"catalog/cloud/use-async-instead-of-sync","title":"Use Asynchronous network calls instead of synchronous","description":"When making calls across process boundaries to either databases or file systems or REST APIs, relying on synchronous calls can cause the calling thread to become blocked, putting additional load on the CPU","sidebar":"tutorialSidebar"},"catalog/cloud/use-circuit-breaker":{"id":"catalog/cloud/use-circuit-breaker","title":"Use circuit breaker patterns","description":"Modern applications need to communicate with other applications on a regular basis. Since these other applications have their own deployment schedule, downtimes and availability, the network connection to these application might have problems. If the other application is not reachable, all network requests against this other application will fail and future network requests are futile.","sidebar":"tutorialSidebar"},"catalog/cloud/use-cloud-native-network-security-tools-and-controls":{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","sidebar":"tutorialSidebar"},"catalog/cloud/use-ddos-protection":{"id":"catalog/cloud/use-ddos-protection","title":"Use DDoS protection","description":"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.","sidebar":"tutorialSidebar"},"catalog/cloud/use-energy-efficient-hardware":{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/use-serverless":{"id":"catalog/cloud/use-serverless","title":"Use serverless cloud services","description":"Description","sidebar":"tutorialSidebar"},"catalog/index":{"id":"catalog/index","title":"Catalog","description":"","sidebar":"tutorialSidebar"},"catalog/web/avoid-chaining-critical-requests":{"id":"catalog/web/avoid-chaining-critical-requests","title":"Avoid chaining critical requests","description":"Most web experiences require a lot of work from the user\'s browser. The greater the length of the chains and the larger the download sizes, the more significant the impact on page load performance and the energy required to render a page.","sidebar":"tutorialSidebar"},"catalog/web/avoid-excessive-dom-size":{"id":"catalog/web/avoid-excessive-dom-size","title":"Avoid an excessive DOM size","description":"The greater the amount of nodes that are defined in HTML, the greater the time spent processing and rendering each element.","sidebar":"tutorialSidebar"},"catalog/web/avoid-tracking-unnecessary-data":{"id":"catalog/web/avoid-tracking-unnecessary-data","title":"Avoid tracking unnecessary data","description":"User tracking, user data collection and targeting in things like advertisements are responsible for significant energy use in many digital products, and services.","sidebar":"tutorialSidebar"},"catalog/web/defer-offscreen-images":{"id":"catalog/web/defer-offscreen-images","title":"Defer offscreen images","description":"Web pages offer a lot of images that aren\'t displayed on the first loaded screen and can thus be loaded dynamically.","sidebar":"tutorialSidebar"},"catalog/web/deprecate-gifs":{"id":"catalog/web/deprecate-gifs","title":"Deprecate GIFs for animated content","description":"One direct replacement of the GIF is the MP4 video format which provides much smaller file sizes and higher quality at the same time.","sidebar":"tutorialSidebar"},"catalog/web/enable-text-compression":{"id":"catalog/web/enable-text-compression","title":"Enable text compression","description":"Web browsers often communicate with web servers in a human readable format. These can be HTML, JavaScript and/or CSS files and REST requests which can return a response in JSON. This human readable communication is redundant and, as such, can be compressed to save bandwidth.","sidebar":"tutorialSidebar"},"catalog/web/index":{"id":"catalog/web/index","title":"Web","description":"Subject Matter Experts","sidebar":"tutorialSidebar"},"catalog/web/keep-request-counts-low":{"id":"catalog/web/keep-request-counts-low","title":"Keep request counts low","description":"Accessing a web page usually retrieves a HTML file from the web server. The HTML may then reference additional resources that the browser has to download.","sidebar":"tutorialSidebar"},"catalog/web/minify-web-assets":{"id":"catalog/web/minify-web-assets","title":"Minify web assets","description":"Minification removes unnecessary or redundant data without affecting how the resource is processed by the web browser.","sidebar":"tutorialSidebar"},"catalog/web/minimize-main-thread-work":{"id":"catalog/web/minimize-main-thread-work","title":"Minimize main thread work","description":"Description","sidebar":"tutorialSidebar"},"catalog/web/properly-sized-images":{"id":"catalog/web/properly-sized-images","title":"Optimize image size","description":"Ideally, the stored pixel dimensions are exactly the same, or smaller, as the display size in pixels so that no bandwidth or storage space is wasted.","sidebar":"tutorialSidebar"},"catalog/web/remove-unused-css":{"id":"catalog/web/remove-unused-css","title":"Remove unused CSS definitions","description":"CSS files are very complex and need energy intensive parsing and processing. Each added CSS definition increases the amount of time and processing power needed in this process.","sidebar":"tutorialSidebar"},"catalog/web/serve-images-in-modern-formats":{"id":"catalog/web/serve-images-in-modern-formats","title":"Serve images in modern formats","description":"Modern image formats can help to reduce bandwidth, storage and computing requirements on the displaying device.","sidebar":"tutorialSidebar"},"catalog/web/use-server-side-rendering":{"id":"catalog/web/use-server-side-rendering","title":"Use server-side rendering for high-traffic pages","description":"Use server-side rendering for high-traffic pages","sidebar":"tutorialSidebar"},"guide/index":{"id":"guide/index","title":"Guide","description":"What is a green software pattern?","sidebar":"tutorialSidebar"},"guide/initial-reviewer-guide":{"id":"guide/initial-reviewer-guide","title":"Initial Review Guide","description":"This is the guide that our Initial Reviewers will follow to determine if a submitted Green Software Pattern meets the requirements to move the Subject Matter Expert review or not. If any issues arise, the reviewer will provide feedback directly in the pull request that the submitter should update before moving forward. Once the pattern passes the initial review guidelines, the reviewer will assign it to an appropriate Subject Matter Expert (SME) for a deeper technical review. This process is expected to take no more than 1 week barring any lengthy feedback cycles.","sidebar":"tutorialSidebar"},"guide/sme-reviewer-guide":{"id":"guide/sme-reviewer-guide","title":"Subject Matter Expert (SME) Review Guide","description":"This is the guide that our Subject Matter Experts (SMEs) will follow to determine if a submitted Green Software Pattern meets the requirements to move the Team Consensus Review or not. If any issues arise, the reviewer will provide feedback in the pull request that the submitter should update before moving forward. Once the pattern passes the SME Review guidelines, the reviewer add the appropriate label for the next stage of Team Consensus review. This process is expected to take no more than 2 weeks barring any lengthy feedback cycles.","sidebar":"tutorialSidebar"},"guide/suggested-tags":{"id":"guide/suggested-tags","title":"Suggested Tags","description":"Please use the tags within this section for your proposed pattern. New tags must be proposed through the defined proposal process and be approved by the working group.","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Green Software Patterns","description":"An online open-source database of green software patterns reviewed and curated by the Green Software Foundation","sidebar":"tutorialSidebar"},"tags/index":{"id":"tags/index","title":"Tags","description":"","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.73c6af59.js b/assets/js/935f2afb.73c6af59.js new file mode 100644 index 00000000..bd6a59f6 --- /dev/null +++ b/assets/js/935f2afb.73c6af59.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Green Software Patterns","href":"/","docId":"index"},{"type":"category","label":"Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Suggested Tags","href":"/guide/suggested-tags","docId":"guide/suggested-tags"},{"type":"link","label":"Initial Review Guide","href":"/guide/initial-reviewer-guide","docId":"guide/initial-reviewer-guide"},{"type":"link","label":"Subject Matter Expert (SME) Review Guide","href":"/guide/sme-reviewer-guide","docId":"guide/sme-reviewer-guide"}],"href":"/guide/"},{"type":"category","label":"Catalog","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Artificial Intelligence (AI)","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Optimize the size of AI/ML models","href":"/catalog/ai/compress-ml-models-for-inference","docId":"catalog/ai/compress-ml-models-for-inference"},{"type":"link","label":"Use efficient file formats for AI/ML development","href":"/catalog/ai/efficent-format-for-model-training","docId":"catalog/ai/efficent-format-for-model-training"},{"type":"link","label":"Run AI models at the edge","href":"/catalog/ai/energy-efficent-ai-edge","docId":"catalog/ai/energy-efficent-ai-edge"},{"type":"link","label":"Select a more energy efficient AI/ML framework","href":"/catalog/ai/energy-efficent-framework","docId":"catalog/ai/energy-efficent-framework"},{"type":"link","label":"Use energy efficient AI/ML models","href":"/catalog/ai/energy-efficent-models","docId":"catalog/ai/energy-efficent-models"},{"type":"link","label":"Use sustainable regions for AI/ML training","href":"/catalog/ai/leverage-sustainable-regions","docId":"catalog/ai/leverage-sustainable-regions"},{"type":"link","label":"Leverage pre-trained models and transfer learning for AI/ML development","href":"/catalog/ai/pre-trained-transfer-learning","docId":"catalog/ai/pre-trained-transfer-learning"},{"type":"link","label":"Select the right hardware/VM instance types for AI/ML training","href":"/catalog/ai/right-hardware-type","docId":"catalog/ai/right-hardware-type"},{"type":"link","label":"Adopt serverless architecture for AI/ML workload processes","href":"/catalog/ai/serverless-model-development","docId":"catalog/ai/serverless-model-development"}],"href":"/catalog/ai/"},{"type":"category","label":"Cloud","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Cache static data","href":"/catalog/cloud/cache-static-data","docId":"catalog/cloud/cache-static-data"},{"type":"link","label":"Choose the region that is closest to users","href":"/catalog/cloud/choose-region-closest-to-users","docId":"catalog/cloud/choose-region-closest-to-users"},{"type":"link","label":"Compress stored data","href":"/catalog/cloud/compress-stored-data","docId":"catalog/cloud/compress-stored-data"},{"type":"link","label":"Compress transmitted data","href":"/catalog/cloud/compress-transmitted-data","docId":"catalog/cloud/compress-transmitted-data"},{"type":"link","label":"Containerize your workloads","href":"/catalog/cloud/containerize-your-workload-where-applicable","docId":"catalog/cloud/containerize-your-workload-where-applicable"},{"type":"link","label":"Delete unused storage resources","href":"/catalog/cloud/delete-unused-storage-resources","docId":"catalog/cloud/delete-unused-storage-resources"},{"type":"link","label":"Encrypt what is necessary","href":"/catalog/cloud/encrypt-what-is-necessary","docId":"catalog/cloud/encrypt-what-is-necessary"},{"type":"link","label":"Evaluate other CPU architectures","href":"/catalog/cloud/evaluate-other-cpu-architectures","docId":"catalog/cloud/evaluate-other-cpu-architectures"},{"type":"link","label":"Use a service mesh only if needed","href":"/catalog/cloud/evaluate-using-a-service-mesh","docId":"catalog/cloud/evaluate-using-a-service-mesh"},{"type":"link","label":"Terminate TLS at border gateway","href":"/catalog/cloud/evaluate-whether-to-use-TLS-termination","docId":"catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"type":"link","label":"Implement stateless design","href":"/catalog/cloud/implement-stateless-design","docId":"catalog/cloud/implement-stateless-design"},{"type":"link","label":"Match your service level objectives to business needs","href":"/catalog/cloud/match-slo","docId":"catalog/cloud/match-slo"},{"type":"link","label":"Match utilization requirements of virtual machines (VMs)","href":"/catalog/cloud/match-utilization-requirements-of-vm","docId":"catalog/cloud/match-utilization-requirements-of-vm"},{"type":"link","label":"Match utilization requirements with pre-configured servers","href":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server","docId":"catalog/cloud/match-utilization-requirements-with-pre-configured-server"},{"type":"link","label":"Minimize the total number of deployed environments","href":"/catalog/cloud/minimizing-deployed-environments","docId":"catalog/cloud/minimizing-deployed-environments"},{"type":"link","label":"Optimise storage utilization","href":"/catalog/cloud/optimise-storage-resource-utilisation","docId":"catalog/cloud/optimise-storage-resource-utilisation"},{"type":"link","label":"Optimize average CPU utilization","href":"/catalog/cloud/optimize-avg-cpu-utilization","docId":"catalog/cloud/optimize-avg-cpu-utilization"},{"type":"link","label":"Optimize impact on customer devices and equipment","href":"/catalog/cloud/optimize-impact-on-customer-equipment","docId":"catalog/cloud/optimize-impact-on-customer-equipment"},{"type":"link","label":"Optimize peak CPU utilization","href":"/catalog/cloud/optimize-peak-cpu-utilization","docId":"catalog/cloud/optimize-peak-cpu-utilization"},{"type":"link","label":"Queue non-urgent processing requests","href":"/catalog/cloud/queue-non-urgent-requests","docId":"catalog/cloud/queue-non-urgent-requests"},{"type":"link","label":"Reduce network traversal between VMs","href":"/catalog/cloud/reduce-network-traversal-between-VMs","docId":"catalog/cloud/reduce-network-traversal-between-VMs"},{"type":"link","label":"Reduce transmitted data","href":"/catalog/cloud/reduce-transmitted-data","docId":"catalog/cloud/reduce-transmitted-data"},{"type":"link","label":"Remove unused assets","href":"/catalog/cloud/remove-unused-assets","docId":"catalog/cloud/remove-unused-assets"},{"type":"link","label":"Scale down kubernetes applications when not in use","href":"/catalog/cloud/scale-down-kubernetes-workloads","docId":"catalog/cloud/scale-down-kubernetes-workloads"},{"type":"link","label":"Scale down applications when not in use","href":"/catalog/cloud/scale-down-unused-applications","docId":"catalog/cloud/scale-down-unused-applications"},{"type":"link","label":"Scale infrastructure with user load","href":"/catalog/cloud/scale-infrastructure-with-user-load","docId":"catalog/cloud/scale-infrastructure-with-user-load"},{"type":"link","label":"Scale Kubernetes workloads based on relevant demand metrics","href":"/catalog/cloud/scale-kubernetes-workloads-based-on-events","docId":"catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"type":"link","label":"Scale logical components independently","href":"/catalog/cloud/scale-logical-components-independently","docId":"catalog/cloud/scale-logical-components-independently"},{"type":"link","label":"Scan for vulnerabilities","href":"/catalog/cloud/scan-for-vulnerabilities","docId":"catalog/cloud/scan-for-vulnerabilities"},{"type":"link","label":"Set storage retention policies","href":"/catalog/cloud/set-retention-policy-on-storage-resources","docId":"catalog/cloud/set-retention-policy-on-storage-resources"},{"type":"link","label":"Shed lower priority traffic","href":"/catalog/cloud/shed-lower-priority-traffic","docId":"catalog/cloud/shed-lower-priority-traffic"},{"type":"link","label":"Time-shift Kubernetes cron jobs","href":"/catalog/cloud/time-shift-kubernetes-cron-jobs","docId":"catalog/cloud/time-shift-kubernetes-cron-jobs"},{"type":"link","label":"Use Asynchronous network calls instead of synchronous","href":"/catalog/cloud/use-async-instead-of-sync","docId":"catalog/cloud/use-async-instead-of-sync"},{"type":"link","label":"Use circuit breaker patterns","href":"/catalog/cloud/use-circuit-breaker","docId":"catalog/cloud/use-circuit-breaker"},{"type":"link","label":"Use cloud native network security tools and controls","href":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls","docId":"catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"type":"link","label":"Use compiled languages","href":"/catalog/cloud/use-compiled-languages","docId":"catalog/cloud/use-compiled-languages"},{"type":"link","label":"Use DDoS protection","href":"/catalog/cloud/use-ddos-protection","docId":"catalog/cloud/use-ddos-protection"},{"type":"link","label":"Use cloud native processor VMs","href":"/catalog/cloud/use-energy-efficient-hardware","docId":"catalog/cloud/use-energy-efficient-hardware"},{"type":"link","label":"Use serverless cloud services","href":"/catalog/cloud/use-serverless","docId":"catalog/cloud/use-serverless"}],"href":"/catalog/cloud/"},{"type":"category","label":"Web","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Avoid chaining critical requests","href":"/catalog/web/avoid-chaining-critical-requests","docId":"catalog/web/avoid-chaining-critical-requests"},{"type":"link","label":"Avoid an excessive DOM size","href":"/catalog/web/avoid-excessive-dom-size","docId":"catalog/web/avoid-excessive-dom-size"},{"type":"link","label":"Avoid tracking unnecessary data","href":"/catalog/web/avoid-tracking-unnecessary-data","docId":"catalog/web/avoid-tracking-unnecessary-data"},{"type":"link","label":"Defer offscreen images","href":"/catalog/web/defer-offscreen-images","docId":"catalog/web/defer-offscreen-images"},{"type":"link","label":"Deprecate GIFs for animated content","href":"/catalog/web/deprecate-gifs","docId":"catalog/web/deprecate-gifs"},{"type":"link","label":"Enable text compression","href":"/catalog/web/enable-text-compression","docId":"catalog/web/enable-text-compression"},{"type":"link","label":"Keep request counts low","href":"/catalog/web/keep-request-counts-low","docId":"catalog/web/keep-request-counts-low"},{"type":"link","label":"Minify web assets","href":"/catalog/web/minify-web-assets","docId":"catalog/web/minify-web-assets"},{"type":"link","label":"Minimize main thread work","href":"/catalog/web/minimize-main-thread-work","docId":"catalog/web/minimize-main-thread-work"},{"type":"link","label":"Optimize image size","href":"/catalog/web/properly-sized-images","docId":"catalog/web/properly-sized-images"},{"type":"link","label":"Remove unused CSS definitions","href":"/catalog/web/remove-unused-css","docId":"catalog/web/remove-unused-css"},{"type":"link","label":"Serve images in modern formats","href":"/catalog/web/serve-images-in-modern-formats","docId":"catalog/web/serve-images-in-modern-formats"},{"type":"link","label":"Use server-side rendering for high-traffic pages","href":"/catalog/web/use-server-side-rendering","docId":"catalog/web/use-server-side-rendering"}],"href":"/catalog/web/"}],"href":"/catalog/"},{"type":"link","label":"Tags","href":"/tags/","docId":"tags/index"}]},"docs":{"catalog/ai/compress-ml-models-for-inference":{"id":"catalog/ai/compress-ml-models-for-inference","title":"Optimize the size of AI/ML models","description":"Large-scale AI/ML models require significant storage space and take more resources to run as compared to optimized models.","sidebar":"tutorialSidebar"},"catalog/ai/efficent-format-for-model-training":{"id":"catalog/ai/efficent-format-for-model-training","title":"Use efficient file formats for AI/ML development","description":"Efficient storage of the model becomes extremely important to manage the data used for ML model development.","sidebar":"tutorialSidebar"},"catalog/ai/energy-efficent-ai-edge":{"id":"catalog/ai/energy-efficent-ai-edge","title":"Run AI models at the edge","description":"Data computation for ML workloads and ML inference is a significant contributor to the carbon footprint of the ML application. Also, if the ML model is running on the cloud, the data needs to be transferred and processed on the cloud to the required format that can be used by the ML model for inference.","sidebar":"tutorialSidebar"},"catalog/ai/energy-efficent-framework":{"id":"catalog/ai/energy-efficent-framework","title":"Select a more energy efficient AI/ML framework","description":"Training an AI model implies a significant carbon footprint. The underlying framework used for the development, training, and deployment of AI/ML needs to be evaluated and considered to ensure the process is as energy efficient as possible.","sidebar":"tutorialSidebar"},"catalog/ai/energy-efficent-models":{"id":"catalog/ai/energy-efficent-models","title":"Use energy efficient AI/ML models","description":"Evaluate and use alternative, more energy efficient, models that provide similar functionality.","sidebar":"tutorialSidebar"},"catalog/ai/index":{"id":"catalog/ai/index","title":"Artificial Intelligence (AI)","description":"Subject Matter Experts","sidebar":"tutorialSidebar"},"catalog/ai/leverage-sustainable-regions":{"id":"catalog/ai/leverage-sustainable-regions","title":"Use sustainable regions for AI/ML training","description":"Depending on the model parameters and training iterations, training an AI/ML model consumes a lot of power and requires many servers which contribute to embodied emissions.","sidebar":"tutorialSidebar"},"catalog/ai/pre-trained-transfer-learning":{"id":"catalog/ai/pre-trained-transfer-learning","title":"Leverage pre-trained models and transfer learning for AI/ML development","description":"As part of your AI/ML process, you should evaluate using a pre-trained model and use transfer learning to avoid training a new model from scratch.","sidebar":"tutorialSidebar"},"catalog/ai/right-hardware-type":{"id":"catalog/ai/right-hardware-type","title":"Select the right hardware/VM instance types for AI/ML training","description":"Selecting the right hardware/VM instance types for training is one of the choices you should make as part of your energy-efficient AI/ML process.","sidebar":"tutorialSidebar"},"catalog/ai/serverless-model-development":{"id":"catalog/ai/serverless-model-development","title":"Adopt serverless architecture for AI/ML workload processes","description":"Building an ML model takes significant computing resources that need to be optimized for efficient utilization.","sidebar":"tutorialSidebar"},"catalog/cloud/cache-static-data":{"id":"catalog/cloud/cache-static-data","title":"Cache static data","description":"From an energy-efficiency perspective, it\'s better to reduce network traffic by reading the data locally through a cache rather than accessing it remotely over the network. Shortening the distance a network packet travels means that less energy is required to transmit it. Similarly, from an embodied carbon perspective, we are more efficient with hardware when a network packet traverses through less computing equipment.","sidebar":"tutorialSidebar"},"catalog/cloud/choose-region-closest-to-users":{"id":"catalog/cloud/choose-region-closest-to-users","title":"Choose the region that is closest to users","description":"From an energy-efficiency perspective, it\'s better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.","sidebar":"tutorialSidebar"},"catalog/cloud/compress-stored-data":{"id":"catalog/cloud/compress-stored-data","title":"Compress stored data","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/compress-transmitted-data":{"id":"catalog/cloud/compress-transmitted-data","title":"Compress transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.","sidebar":"tutorialSidebar"},"catalog/cloud/containerize-your-workload-where-applicable":{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/delete-unused-storage-resources":{"id":"catalog/cloud/delete-unused-storage-resources","title":"Delete unused storage resources","description":"From an embodied carbon perspective, it\'s better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","sidebar":"tutorialSidebar"},"catalog/cloud/encrypt-what-is-necessary":{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","sidebar":"tutorialSidebar"},"catalog/cloud/evaluate-other-cpu-architectures":{"id":"catalog/cloud/evaluate-other-cpu-architectures","title":"Evaluate other CPU architectures","description":"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types","sidebar":"tutorialSidebar"},"catalog/cloud/evaluate-using-a-service-mesh":{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/evaluate-whether-to-use-TLS-termination":{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","sidebar":"tutorialSidebar"},"catalog/cloud/implement-stateless-design":{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","sidebar":"tutorialSidebar"},"catalog/cloud/index":{"id":"catalog/cloud/index","title":"Cloud","description":"Subject Matter Experts","sidebar":"tutorialSidebar"},"catalog/cloud/match-slo":{"id":"catalog/cloud/match-slo","title":"Match your service level objectives to business needs","description":"If service downtimes are acceptable it\'s better to not strive for highest availability but to design the solution according to real business needs. Lower availability guarantees can help reduce energy consumption by using less infrastructure components.","sidebar":"tutorialSidebar"},"catalog/cloud/match-utilization-requirements-of-vm":{"id":"catalog/cloud/match-utilization-requirements-of-vm","title":"Match utilization requirements of virtual machines (VMs)","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","sidebar":"tutorialSidebar"},"catalog/cloud/match-utilization-requirements-with-pre-configured-server":{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","title":"Match utilization requirements with pre-configured servers","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","sidebar":"tutorialSidebar"},"catalog/cloud/minimizing-deployed-environments":{"id":"catalog/cloud/minimizing-deployed-environments","title":"Minimize the total number of deployed environments","description":"In a given application, there may be a need to utilize multiple environments in the application workflow. Typically, a development environment is used for regular updates, while staging or testing enviroments are used to make sure there are no issues before code reaches a production environment where users may have access. Each added environment has an increasing energy impact, which in turn creates more emissions. As such, it is important to understand the necessity of each enviroment and it\'s environmental impact.","sidebar":"tutorialSidebar"},"catalog/cloud/optimise-storage-resource-utilisation":{"id":"catalog/cloud/optimise-storage-resource-utilisation","title":"Optimise storage utilization","description":"It\'s better to maximise storage utilisation so the storage layer is optimised for the task, not only in terms of energy proportionality but also in terms of embodied carbon. Two storage units running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilised storage unit could be more efficiently used for another task or process.","sidebar":"tutorialSidebar"},"catalog/cloud/optimize-avg-cpu-utilization":{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","sidebar":"tutorialSidebar"},"catalog/cloud/optimize-impact-on-customer-equipment":{"id":"catalog/cloud/optimize-impact-on-customer-equipment","title":"Optimize impact on customer devices and equipment","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/optimize-peak-cpu-utilization":{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","sidebar":"tutorialSidebar"},"catalog/cloud/queue-non-urgent-requests":{"id":"catalog/cloud/queue-non-urgent-requests","title":"Queue non-urgent processing requests","description":"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.","sidebar":"tutorialSidebar"},"catalog/cloud/reduce-network-traversal-between-VMs":{"id":"catalog/cloud/reduce-network-traversal-between-VMs","title":"Reduce network traversal between VMs","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/reduce-transmitted-data":{"id":"catalog/cloud/reduce-transmitted-data","title":"Reduce transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.","sidebar":"tutorialSidebar"},"catalog/cloud/remove-unused-assets":{"id":"catalog/cloud/remove-unused-assets","title":"Remove unused assets","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/scale-down-kubernetes-workloads":{"id":"catalog/cloud/scale-down-kubernetes-workloads","title":"Scale down kubernetes applications when not in use","description":"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes out of office hours. Thereby, optimization is implemented at the cluster level. For production clusters, where nodes need to stay up and running, optimization needs to be implemented at the application level.","sidebar":"tutorialSidebar"},"catalog/cloud/scale-down-unused-applications":{"id":"catalog/cloud/scale-down-unused-applications","title":"Scale down applications when not in use","description":"Applications consume CPU even when they are not actively in use. For example, background timers, garbage collection, health checks, etc. Even when the application is shut down, the underlying hardware is consuming idle power.","sidebar":"tutorialSidebar"},"catalog/cloud/scale-infrastructure-with-user-load":{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","sidebar":"tutorialSidebar"},"catalog/cloud/scale-kubernetes-workloads-based-on-events":{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","sidebar":"tutorialSidebar"},"catalog/cloud/scale-logical-components-independently":{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/scan-for-vulnerabilities":{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","sidebar":"tutorialSidebar"},"catalog/cloud/set-retention-policy-on-storage-resources":{"id":"catalog/cloud/set-retention-policy-on-storage-resources","title":"Set storage retention policies","description":"From an embodied carbon perspective, it\'s better to have an automated mechanism to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","sidebar":"tutorialSidebar"},"catalog/cloud/shed-lower-priority-traffic":{"id":"catalog/cloud/shed-lower-priority-traffic","title":"Shed lower priority traffic","description":"When resources are constrained during high-traffic events or when carbon intensity is high, more carbon emissions will be generated from your system. Adding more resources to support increased traffic requirements introduces more embodied carbon and more demand for electricity. Continuing to handle all requests during high carbon intensity will increase overall emissions for your system. Shedding traffic that is lower priority during these scenarios will save on resources and carbon emissions. This approach requires an understanding of your traffic, including which call requests are critical and which can best withstand retry attempts and failures.","sidebar":"tutorialSidebar"},"catalog/cloud/time-shift-kubernetes-cron-jobs":{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","title":"Time-shift Kubernetes cron jobs","description":"The carbon emissions of a software system depends on the power consumed by that software, but also on the Carbon intensity of the electricity it is powered on. For this reason, running energy-efficient software on carbon intensive electricity grid, might be inefficient to reduce its global carbon emissions. Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low.","sidebar":"tutorialSidebar"},"catalog/cloud/use-async-instead-of-sync":{"id":"catalog/cloud/use-async-instead-of-sync","title":"Use Asynchronous network calls instead of synchronous","description":"When making calls across process boundaries to either databases or file systems or REST APIs, relying on synchronous calls can cause the calling thread to become blocked, putting additional load on the CPU","sidebar":"tutorialSidebar"},"catalog/cloud/use-circuit-breaker":{"id":"catalog/cloud/use-circuit-breaker","title":"Use circuit breaker patterns","description":"Modern applications need to communicate with other applications on a regular basis. Since these other applications have their own deployment schedule, downtimes and availability, the network connection to these application might have problems. If the other application is not reachable, all network requests against this other application will fail and future network requests are futile.","sidebar":"tutorialSidebar"},"catalog/cloud/use-cloud-native-network-security-tools-and-controls":{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","sidebar":"tutorialSidebar"},"catalog/cloud/use-compiled-languages":{"id":"catalog/cloud/use-compiled-languages","title":"Use compiled languages","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/use-ddos-protection":{"id":"catalog/cloud/use-ddos-protection","title":"Use DDoS protection","description":"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.","sidebar":"tutorialSidebar"},"catalog/cloud/use-energy-efficient-hardware":{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/use-serverless":{"id":"catalog/cloud/use-serverless","title":"Use serverless cloud services","description":"Description","sidebar":"tutorialSidebar"},"catalog/index":{"id":"catalog/index","title":"Catalog","description":"","sidebar":"tutorialSidebar"},"catalog/web/avoid-chaining-critical-requests":{"id":"catalog/web/avoid-chaining-critical-requests","title":"Avoid chaining critical requests","description":"Most web experiences require a lot of work from the user\'s browser. The greater the length of the chains and the larger the download sizes, the more significant the impact on page load performance and the energy required to render a page.","sidebar":"tutorialSidebar"},"catalog/web/avoid-excessive-dom-size":{"id":"catalog/web/avoid-excessive-dom-size","title":"Avoid an excessive DOM size","description":"The greater the amount of nodes that are defined in HTML, the greater the time spent processing and rendering each element.","sidebar":"tutorialSidebar"},"catalog/web/avoid-tracking-unnecessary-data":{"id":"catalog/web/avoid-tracking-unnecessary-data","title":"Avoid tracking unnecessary data","description":"User tracking, user data collection and targeting in things like advertisements are responsible for significant energy use in many digital products, and services.","sidebar":"tutorialSidebar"},"catalog/web/defer-offscreen-images":{"id":"catalog/web/defer-offscreen-images","title":"Defer offscreen images","description":"Web pages offer a lot of images that aren\'t displayed on the first loaded screen and can thus be loaded dynamically.","sidebar":"tutorialSidebar"},"catalog/web/deprecate-gifs":{"id":"catalog/web/deprecate-gifs","title":"Deprecate GIFs for animated content","description":"One direct replacement of the GIF is the MP4 video format which provides much smaller file sizes and higher quality at the same time.","sidebar":"tutorialSidebar"},"catalog/web/enable-text-compression":{"id":"catalog/web/enable-text-compression","title":"Enable text compression","description":"Web browsers often communicate with web servers in a human readable format. These can be HTML, JavaScript and/or CSS files and REST requests which can return a response in JSON. This human readable communication is redundant and, as such, can be compressed to save bandwidth.","sidebar":"tutorialSidebar"},"catalog/web/index":{"id":"catalog/web/index","title":"Web","description":"Subject Matter Experts","sidebar":"tutorialSidebar"},"catalog/web/keep-request-counts-low":{"id":"catalog/web/keep-request-counts-low","title":"Keep request counts low","description":"Accessing a web page usually retrieves a HTML file from the web server. The HTML may then reference additional resources that the browser has to download.","sidebar":"tutorialSidebar"},"catalog/web/minify-web-assets":{"id":"catalog/web/minify-web-assets","title":"Minify web assets","description":"Minification removes unnecessary or redundant data without affecting how the resource is processed by the web browser.","sidebar":"tutorialSidebar"},"catalog/web/minimize-main-thread-work":{"id":"catalog/web/minimize-main-thread-work","title":"Minimize main thread work","description":"Description","sidebar":"tutorialSidebar"},"catalog/web/properly-sized-images":{"id":"catalog/web/properly-sized-images","title":"Optimize image size","description":"Ideally, the stored pixel dimensions are exactly the same, or smaller, as the display size in pixels so that no bandwidth or storage space is wasted.","sidebar":"tutorialSidebar"},"catalog/web/remove-unused-css":{"id":"catalog/web/remove-unused-css","title":"Remove unused CSS definitions","description":"CSS files are very complex and need energy intensive parsing and processing. Each added CSS definition increases the amount of time and processing power needed in this process.","sidebar":"tutorialSidebar"},"catalog/web/serve-images-in-modern-formats":{"id":"catalog/web/serve-images-in-modern-formats","title":"Serve images in modern formats","description":"Modern image formats can help to reduce bandwidth, storage and computing requirements on the displaying device.","sidebar":"tutorialSidebar"},"catalog/web/use-server-side-rendering":{"id":"catalog/web/use-server-side-rendering","title":"Use server-side rendering for high-traffic pages","description":"Use server-side rendering for high-traffic pages","sidebar":"tutorialSidebar"},"guide/index":{"id":"guide/index","title":"Guide","description":"What is a green software pattern?","sidebar":"tutorialSidebar"},"guide/initial-reviewer-guide":{"id":"guide/initial-reviewer-guide","title":"Initial Review Guide","description":"This is the guide that our Initial Reviewers will follow to determine if a submitted Green Software Pattern meets the requirements to move the Subject Matter Expert review or not. If any issues arise, the reviewer will provide feedback directly in the pull request that the submitter should update before moving forward. Once the pattern passes the initial review guidelines, the reviewer will assign it to an appropriate Subject Matter Expert (SME) for a deeper technical review. This process is expected to take no more than 1 week barring any lengthy feedback cycles.","sidebar":"tutorialSidebar"},"guide/sme-reviewer-guide":{"id":"guide/sme-reviewer-guide","title":"Subject Matter Expert (SME) Review Guide","description":"This is the guide that our Subject Matter Experts (SMEs) will follow to determine if a submitted Green Software Pattern meets the requirements to move the Team Consensus Review or not. If any issues arise, the reviewer will provide feedback in the pull request that the submitter should update before moving forward. Once the pattern passes the SME Review guidelines, the reviewer add the appropriate label for the next stage of Team Consensus review. This process is expected to take no more than 2 weeks barring any lengthy feedback cycles.","sidebar":"tutorialSidebar"},"guide/suggested-tags":{"id":"guide/suggested-tags","title":"Suggested Tags","description":"Please use the tags within this section for your proposed pattern. New tags must be proposed through the defined proposal process and be approved by the working group.","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Green Software Patterns","description":"An online open-source database of green software patterns reviewed and curated by the Green Software Foundation","sidebar":"tutorialSidebar"},"tags/index":{"id":"tags/index","title":"Tags","description":"","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/b8dc3674.06dcbace.js b/assets/js/b8dc3674.414a347b.js similarity index 64% rename from assets/js/b8dc3674.06dcbace.js rename to assets/js/b8dc3674.414a347b.js index d7254fba..6409af20 100644 --- a/assets/js/b8dc3674.06dcbace.js +++ b/assets/js/b8dc3674.414a347b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[3505],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(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 s(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}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),m=o,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||a;return n?r.createElement(f,s(s({ref:t},u),{},{components:n})):r.createElement(f,s({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=p;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:o,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(7462),o=(n(7294),n(4137));const a={version:1,submitted_by:"yelghali",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.",tags:["cloud","security","networking","compute","kubernetes","role:software-engineer","size:medium"]},s="Use cloud native network security tools and controls",i={unversionedId:"catalog/cloud/use-cloud-native-network-security-tools-and-controls",id:"catalog/cloud/use-cloud-native-network-security-tools-and-controls",title:"Use cloud native network security tools and controls",description:"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.",source:"@site/docs/catalog/cloud/use-cloud-native-network-security-tools-and-controls.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/use-cloud-native-network-security-tools-and-controls",permalink:"/catalog/cloud/use-cloud-native-network-security-tools-and-controls",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/use-cloud-native-network-security-tools-and-controls.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"security",permalink:"/tags/security"},{label:"networking",permalink:"/tags/networking"},{label:"compute",permalink:"/tags/compute"},{label:"kubernetes",permalink:"/tags/kubernetes"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"yelghali",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.",tags:["cloud","security","networking","compute","kubernetes","role:software-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Use circuit breaker patterns",permalink:"/catalog/cloud/use-circuit-breaker"},next:{title:"Use DDoS protection",permalink:"/catalog/cloud/use-ddos-protection"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function d(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"use-cloud-native-network-security-tools-and-controls"},"Use cloud native network security tools and controls"),(0,o.kt)("h2",{id:"description"},"Description"),(0,o.kt)("p",null,"Network & web application firewalls provide protection against ",(0,o.kt)("a",{parentName:"p",href:"https://owasp.org/Top10/"},"most common attacks")," and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure."),(0,o.kt)("h2",{id:"solution"},"Solution"),(0,o.kt)("p",null,"Filter ingress and egress traffic at the source to block any unauthorized data transmissions."),(0,o.kt)("p",null,"Use cloud native security tools, as they scale based on demand, and only the necessary infrastructure resources."),(0,o.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,o.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,o.kt)("p",null,"Using cloud native security controls and tools will impact SCI as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"E"),": By filtering transmitted data, less energy is consumed by the networking resources."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"M"),": By scaling the tools based on demand and maximizing resource utilization, the total embodied carbon emissions are lower.")),(0,o.kt)("h2",{id:"assumptions"},"Assumptions"),(0,o.kt)("p",null,"Deployment and configuration of the security tools is automated."),(0,o.kt)("h2",{id:"considerations"},"Considerations"),(0,o.kt)("p",null,"Consider implementing a zero trust model, where security controls are layered."),(0,o.kt)("h2",{id:"references"},"References"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://learn.microsoft.com/en-us/azure/architecture/framework/sustainability/sustainability-security"},"Microsoft Azure well architected framework sustainability patterns")))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[3505],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(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 s(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}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),m=o,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||a;return n?r.createElement(f,s(s({ref:t},u),{},{components:n})):r.createElement(f,s({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=p;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:o,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(7462),o=(n(7294),n(4137));const a={version:1,submitted_by:"yelghali",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.",tags:["cloud","security","networking","compute","kubernetes","role:software-engineer","size:medium"]},s="Use cloud native network security tools and controls",i={unversionedId:"catalog/cloud/use-cloud-native-network-security-tools-and-controls",id:"catalog/cloud/use-cloud-native-network-security-tools-and-controls",title:"Use cloud native network security tools and controls",description:"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.",source:"@site/docs/catalog/cloud/use-cloud-native-network-security-tools-and-controls.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/use-cloud-native-network-security-tools-and-controls",permalink:"/catalog/cloud/use-cloud-native-network-security-tools-and-controls",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/use-cloud-native-network-security-tools-and-controls.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"security",permalink:"/tags/security"},{label:"networking",permalink:"/tags/networking"},{label:"compute",permalink:"/tags/compute"},{label:"kubernetes",permalink:"/tags/kubernetes"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"yelghali",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.",tags:["cloud","security","networking","compute","kubernetes","role:software-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Use circuit breaker patterns",permalink:"/catalog/cloud/use-circuit-breaker"},next:{title:"Use compiled languages",permalink:"/catalog/cloud/use-compiled-languages"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function d(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"use-cloud-native-network-security-tools-and-controls"},"Use cloud native network security tools and controls"),(0,o.kt)("h2",{id:"description"},"Description"),(0,o.kt)("p",null,"Network & web application firewalls provide protection against ",(0,o.kt)("a",{parentName:"p",href:"https://owasp.org/Top10/"},"most common attacks")," and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure."),(0,o.kt)("h2",{id:"solution"},"Solution"),(0,o.kt)("p",null,"Filter ingress and egress traffic at the source to block any unauthorized data transmissions."),(0,o.kt)("p",null,"Use cloud native security tools, as they scale based on demand, and only the necessary infrastructure resources."),(0,o.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,o.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,o.kt)("p",null,"Using cloud native security controls and tools will impact SCI as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"E"),": By filtering transmitted data, less energy is consumed by the networking resources."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"M"),": By scaling the tools based on demand and maximizing resource utilization, the total embodied carbon emissions are lower.")),(0,o.kt)("h2",{id:"assumptions"},"Assumptions"),(0,o.kt)("p",null,"Deployment and configuration of the security tools is automated."),(0,o.kt)("h2",{id:"considerations"},"Considerations"),(0,o.kt)("p",null,"Consider implementing a zero trust model, where security controls are layered."),(0,o.kt)("h2",{id:"references"},"References"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://learn.microsoft.com/en-us/azure/architecture/framework/sustainability/sustainability-security"},"Microsoft Azure well architected framework sustainability patterns")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cbb6a674.4e30cc76.js b/assets/js/cbb6a674.4e30cc76.js new file mode 100644 index 00000000..2105115e --- /dev/null +++ b/assets/js/cbb6a674.4e30cc76.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7143],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var o=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function i(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=o.createContext({}),c=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var r=e.components,a=e.mdxType,n=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),m=a,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||n;return r?o.createElement(f,i(i({ref:t},u),{},{components:r})):o.createElement(f,i({ref:t},u))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=r.length,i=new Array(n);i[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:a,i[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var o=r(7462),a=(r(7294),r(4137));const n={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2024-03-14T00:00:00.000Z"),category:"cloud",description:"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.",tags:["cloud","size:small"]},i="Use DDoS protection",s={unversionedId:"catalog/cloud/use-ddos-protection",id:"catalog/cloud/use-ddos-protection",title:"Use DDoS protection",description:"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.",source:"@site/docs/catalog/cloud/use-ddos-protection.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/use-ddos-protection",permalink:"/catalog/cloud/use-ddos-protection",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/use-ddos-protection.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2024-03-14T00:00:00.000Z",category:"cloud",description:"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.",tags:["cloud","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Use compiled languages",permalink:"/catalog/cloud/use-compiled-languages"},next:{title:"Use cloud native processor VMs",permalink:"/catalog/cloud/use-energy-efficient-hardware"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function d(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,o.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"use-ddos-protection"},"Use DDoS protection"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.\nDue to the nature of attack, a lot of environmental resources are used up by nonsensical requests."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"All cloud providers have some form of DDoS protection (AWS Shield, Azure DDoS Protection, GCP DDoS Protection, CloudFlare, etc.) that can prevent those attacks."),(0,a.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"DDoS protection impacts the SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"R"),": The functional unit is impacted because the amount of requests will be reduced.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"There is budget for the DDoS protection service.")),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Consider purchasing advanced protection to be fully protected against other attack patterns similar to DDoS attacks.")),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://learn.microsoft.com/en-us/azure/architecture/framework/sustainability/sustainability-application-design"},"Azure Well-Architected Framework Sustainability Pillar"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cbb6a674.e7a07a55.js b/assets/js/cbb6a674.e7a07a55.js deleted file mode 100644 index 36a4e36e..00000000 --- a/assets/js/cbb6a674.e7a07a55.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7143],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=o.createContext({}),c=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),m=n,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||a;return r?o.createElement(f,i(i({ref:t},u),{},{components:r})):o.createElement(f,i({ref:t},u))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,i=new Array(a);i[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:n,i[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var o=r(7462),n=(r(7294),r(4137));const a={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2024-03-14T00:00:00.000Z"),category:"cloud",description:"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.",tags:["cloud","size:small"]},i="Use DDoS protection",s={unversionedId:"catalog/cloud/use-ddos-protection",id:"catalog/cloud/use-ddos-protection",title:"Use DDoS protection",description:"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.",source:"@site/docs/catalog/cloud/use-ddos-protection.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/use-ddos-protection",permalink:"/catalog/cloud/use-ddos-protection",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/use-ddos-protection.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2024-03-14T00:00:00.000Z",category:"cloud",description:"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.",tags:["cloud","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Use cloud native network security tools and controls",permalink:"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},next:{title:"Use cloud native processor VMs",permalink:"/catalog/cloud/use-energy-efficient-hardware"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function d(e){let{components:t,...r}=e;return(0,n.kt)("wrapper",(0,o.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"use-ddos-protection"},"Use DDoS protection"),(0,n.kt)("h2",{id:"description"},"Description"),(0,n.kt)("p",null,"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.\nDue to the nature of attack, a lot of environmental resources are used up by nonsensical requests."),(0,n.kt)("h2",{id:"solution"},"Solution"),(0,n.kt)("p",null,"All cloud providers have some form of DDoS protection (AWS Shield, Azure DDoS Protection, GCP DDoS Protection, CloudFlare, etc.) that can prevent those attacks."),(0,n.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,n.kt)("p",null,(0,n.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,n.kt)("p",null,"DDoS protection impacts the SCI as follows:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"R"),": The functional unit is impacted because the amount of requests will be reduced.")),(0,n.kt)("h2",{id:"assumptions"},"Assumptions"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"There is budget for the DDoS protection service.")),(0,n.kt)("h2",{id:"considerations"},"Considerations"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Consider purchasing advanced protection to be fully protected against other attack patterns similar to DDoS attacks.")),(0,n.kt)("h2",{id:"references"},"References"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://learn.microsoft.com/en-us/azure/architecture/framework/sustainability/sustainability-application-design"},"Azure Well-Architected Framework Sustainability Pillar"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e40996b3.639e3f23.js b/assets/js/e40996b3.639e3f23.js new file mode 100644 index 00000000..c70e25ac --- /dev/null +++ b/assets/js/e40996b3.639e3f23.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8511],{6501:a=>{a.exports=JSON.parse('{"label":"programming-language","permalink":"/tags/programming-language","allTagsPath":"/tags","count":1,"items":[{"id":"catalog/cloud/use-compiled-languages","title":"Use compiled languages","description":"Description","permalink":"/catalog/cloud/use-compiled-languages"}]}')}}]); \ No newline at end of file diff --git a/assets/js/ed645329.aafb71e3.js b/assets/js/ed645329.aafb71e3.js new file mode 100644 index 00000000..27d219dc --- /dev/null +++ b/assets/js/ed645329.aafb71e3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4236],{2578:e=>{e.exports=JSON.parse('{"label":"cloud","permalink":"/tags/cloud","allTagsPath":"/tags","count":24,"items":[{"id":"catalog/cloud/compress-stored-data","title":"Compress stored data","description":"Description","permalink":"/catalog/cloud/compress-stored-data"},{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","permalink":"/catalog/cloud/containerize-your-workload-where-applicable"},{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","permalink":"/catalog/cloud/encrypt-what-is-necessary"},{"id":"catalog/cloud/evaluate-other-cpu-architectures","title":"Evaluate other CPU architectures","description":"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types","permalink":"/catalog/cloud/evaluate-other-cpu-architectures"},{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/cloud/match-slo","title":"Match your service level objectives to business needs","description":"If service downtimes are acceptable it\'s better to not strive for highest availability but to design the solution according to real business needs. Lower availability guarantees can help reduce energy consumption by using less infrastructure components.","permalink":"/catalog/cloud/match-slo"},{"id":"catalog/cloud/minimizing-deployed-environments","title":"Minimize the total number of deployed environments","description":"In a given application, there may be a need to utilize multiple environments in the application workflow. Typically, a development environment is used for regular updates, while staging or testing enviroments are used to make sure there are no issues before code reaches a production environment where users may have access. Each added environment has an increasing energy impact, which in turn creates more emissions. As such, it is important to understand the necessity of each enviroment and it\'s environmental impact.","permalink":"/catalog/cloud/minimizing-deployed-environments"},{"id":"catalog/cloud/optimize-impact-on-customer-equipment","title":"Optimize impact on customer devices and equipment","description":"Description","permalink":"/catalog/cloud/optimize-impact-on-customer-equipment"},{"id":"catalog/cloud/queue-non-urgent-requests","title":"Queue non-urgent processing requests","description":"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.","permalink":"/catalog/cloud/queue-non-urgent-requests"},{"id":"catalog/cloud/reduce-network-traversal-between-VMs","title":"Reduce network traversal between VMs","description":"Description","permalink":"/catalog/cloud/reduce-network-traversal-between-VMs"},{"id":"catalog/cloud/remove-unused-assets","title":"Remove unused assets","description":"Description","permalink":"/catalog/cloud/remove-unused-assets"},{"id":"catalog/cloud/scale-down-unused-applications","title":"Scale down applications when not in use","description":"Applications consume CPU even when they are not actively in use. For example, background timers, garbage collection, health checks, etc. Even when the application is shut down, the underlying hardware is consuming idle power.","permalink":"/catalog/cloud/scale-down-unused-applications"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","permalink":"/catalog/cloud/scale-infrastructure-with-user-load"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","permalink":"/catalog/cloud/scale-logical-components-independently"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","permalink":"/catalog/cloud/evaluate-using-a-service-mesh"},{"id":"catalog/cloud/use-async-instead-of-sync","title":"Use Asynchronous network calls instead of synchronous","description":"When making calls across process boundaries to either databases or file systems or REST APIs, relying on synchronous calls can cause the calling thread to become blocked, putting additional load on the CPU","permalink":"/catalog/cloud/use-async-instead-of-sync"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","permalink":"/catalog/cloud/use-energy-efficient-hardware"},{"id":"catalog/cloud/use-compiled-languages","title":"Use compiled languages","description":"Description","permalink":"/catalog/cloud/use-compiled-languages"},{"id":"catalog/cloud/use-ddos-protection","title":"Use DDoS protection","description":"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.","permalink":"/catalog/cloud/use-ddos-protection"},{"id":"catalog/cloud/use-serverless","title":"Use serverless cloud services","description":"Description","permalink":"/catalog/cloud/use-serverless"}]}')}}]); \ No newline at end of file diff --git a/assets/js/ed645329.ab1520c3.js b/assets/js/ed645329.ab1520c3.js deleted file mode 100644 index a6c2a3fc..00000000 --- a/assets/js/ed645329.ab1520c3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4236],{2578:e=>{e.exports=JSON.parse('{"label":"cloud","permalink":"/tags/cloud","allTagsPath":"/tags","count":22,"items":[{"id":"catalog/cloud/compress-stored-data","title":"Compress stored data","description":"Description","permalink":"/catalog/cloud/compress-stored-data"},{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","permalink":"/catalog/cloud/containerize-your-workload-where-applicable"},{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","permalink":"/catalog/cloud/encrypt-what-is-necessary"},{"id":"catalog/cloud/evaluate-other-cpu-architectures","title":"Evaluate other CPU architectures","description":"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types","permalink":"/catalog/cloud/evaluate-other-cpu-architectures"},{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/cloud/match-slo","title":"Match your service level objectives to business needs","description":"If service downtimes are acceptable it\'s better to not strive for highest availability but to design the solution according to real business needs. Lower availability guarantees can help reduce energy consumption by using less infrastructure components.","permalink":"/catalog/cloud/match-slo"},{"id":"catalog/cloud/minimizing-deployed-environments","title":"Minimize the total number of deployed environments","description":"In a given application, there may be a need to utilize multiple environments in the application workflow. Typically, a development environment is used for regular updates, while staging or testing enviroments are used to make sure there are no issues before code reaches a production environment where users may have access. Each added environment has an increasing energy impact, which in turn creates more emissions. As such, it is important to understand the necessity of each enviroment and it\'s environmental impact.","permalink":"/catalog/cloud/minimizing-deployed-environments"},{"id":"catalog/cloud/optimize-impact-on-customer-equipment","title":"Optimize impact on customer devices and equipment","description":"Description","permalink":"/catalog/cloud/optimize-impact-on-customer-equipment"},{"id":"catalog/cloud/queue-non-urgent-requests","title":"Queue non-urgent processing requests","description":"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.","permalink":"/catalog/cloud/queue-non-urgent-requests"},{"id":"catalog/cloud/remove-unused-assets","title":"Remove unused assets","description":"Description","permalink":"/catalog/cloud/remove-unused-assets"},{"id":"catalog/cloud/scale-down-unused-applications","title":"Scale down applications when not in use","description":"Applications consume CPU even when they are not actively in use. For example, background timers, garbage collection, health checks, etc. Even when the application is shut down, the underlying hardware is consuming idle power.","permalink":"/catalog/cloud/scale-down-unused-applications"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","permalink":"/catalog/cloud/scale-infrastructure-with-user-load"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","permalink":"/catalog/cloud/scale-logical-components-independently"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","permalink":"/catalog/cloud/evaluate-using-a-service-mesh"},{"id":"catalog/cloud/use-async-instead-of-sync","title":"Use Asynchronous network calls instead of synchronous","description":"When making calls across process boundaries to either databases or file systems or REST APIs, relying on synchronous calls can cause the calling thread to become blocked, putting additional load on the CPU","permalink":"/catalog/cloud/use-async-instead-of-sync"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","permalink":"/catalog/cloud/use-energy-efficient-hardware"},{"id":"catalog/cloud/use-ddos-protection","title":"Use DDoS protection","description":"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.","permalink":"/catalog/cloud/use-ddos-protection"},{"id":"catalog/cloud/use-serverless","title":"Use serverless cloud services","description":"Description","permalink":"/catalog/cloud/use-serverless"}]}')}}]); \ No newline at end of file diff --git a/assets/js/f08cef58.13e789a7.js b/assets/js/f08cef58.13e789a7.js new file mode 100644 index 00000000..0f069d81 --- /dev/null +++ b/assets/js/f08cef58.13e789a7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7632],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(r),m=a,k=d["".concat(s,".").concat(m)]||d[m]||p[m]||o;return r?n.createElement(k,l(l({ref:t},u),{},{components:r})):n.createElement(k,l({ref:t},u))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,l=new Array(o);l[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:a,l[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var n=r(7462),a=(r(7294),r(4137));const o={version:1,submitted_by:"yelghali",published_date:new Date("2024-07-30T00:00:00.000Z"),category:"cloud",tags:["cloud","network","compute","kubernetes","role:cloud-engineer","size:medium"]},l="Reduce network traversal between VMs",i={unversionedId:"catalog/cloud/reduce-network-traversal-between-VMs",id:"catalog/cloud/reduce-network-traversal-between-VMs",title:"Reduce network traversal between VMs",description:"Description",source:"@site/docs/catalog/cloud/reduce-network-traversal-between-VMs.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/reduce-network-traversal-between-VMs",permalink:"/catalog/cloud/reduce-network-traversal-between-VMs",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/reduce-network-traversal-between-VMs.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"network",permalink:"/tags/network"},{label:"compute",permalink:"/tags/compute"},{label:"kubernetes",permalink:"/tags/kubernetes"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"yelghali",published_date:"2024-07-30T00:00:00.000Z",category:"cloud",tags:["cloud","network","compute","kubernetes","role:cloud-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Queue non-urgent processing requests",permalink:"/catalog/cloud/queue-non-urgent-requests"},next:{title:"Reduce transmitted data",permalink:"/catalog/cloud/reduce-transmitted-data"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2}],u={toc:c};function p(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"reduce-network-traversal-between-vms"},"Reduce network traversal between VMs"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Placing VMs in a single region or a single availability zone reduces the physical distance between the instances. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Choose the VM placement that is best for your workload. "),(0,a.kt)("p",null,"Most cloud providers provide various options, like"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html"},"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://cloud.google.com/compute/docs/instances/define-instance-placement"},"https://cloud.google.com/compute/docs/instances/define-instance-placement")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://learn.microsoft.com/en-us/azure-stack/hci/manage/vm-affinity"},"https://learn.microsoft.com/en-us/azure-stack/hci/manage/vm-affinity"))),(0,a.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Regarding the SCI equation, reducing network traversal between VMs will impact:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": By reducing network travel distance, we reduce the amount of energy consumed.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"VM placement options provided by cloud providers are adequate for this workload,")),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"For business critical workloads, you need to ensure your workload is spread across multiple availability-zones, which may result in more network traversal and increase in your carbon footprint.")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.2544877b.js b/assets/js/main.2544877b.js new file mode 100644 index 00000000..252bff24 --- /dev/null +++ b/assets/js/main.2544877b.js @@ -0,0 +1,2 @@ +/*! For license information please see main.2544877b.js.LICENSE.txt */ +(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[179],{997:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),l=n(6887);const s={"007e88ba":[()=>n.e(7647).then(n.bind(n,7370)),"@site/docs/catalog/web/defer-offscreen-images.md",7370],"0751a84b":[()=>n.e(4996).then(n.t.bind(n,8406,19)),"~docs/default/tag-tags-size-large-273.json",8406],"0bfc0a96":[()=>n.e(8988).then(n.t.bind(n,6075,19)),"~docs/default/tag-tags-monitoring-45e.json",6075],"0c466652":[()=>n.e(5453).then(n.t.bind(n,4045,19)),"~docs/default/tag-tags-role-web-developer-697.json",4045],"0f563736":[()=>n.e(9692).then(n.bind(n,5140)),"@site/docs/catalog/cloud/match-slo.md",5140],"134c4c1b":[()=>n.e(4679).then(n.bind(n,9912)),"@site/docs/catalog/cloud/use-compiled-languages.md",9912],"1388c4ac":[()=>Promise.all([n.e(532),n.e(1765),n.e(5852)]).then(n.bind(n,1545)),"@site/docs/catalog/ai/index.md",1545],"14ede2c4":[()=>n.e(6972).then(n.t.bind(n,1520,19)),"~docs/default/tag-tags-security-95f.json",1520],"16fb93b6":[()=>n.e(2677).then(n.bind(n,4150)),"@site/docs/catalog/cloud/implement-stateless-design.md",4150],17896441:[()=>Promise.all([n.e(532),n.e(7918)]).then(n.bind(n,7574)),"@theme/DocItem",7574],"1ba1fdde":[()=>n.e(5025).then(n.bind(n,409)),"@site/docs/catalog/cloud/use-serverless.md",409],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,1299)),"@theme/DocPage",1299],"237b5df5":[()=>n.e(8110).then(n.bind(n,1173)),"@site/docs/catalog/cloud/scale-down-unused-applications.md",1173],"27fa7df4":[()=>n.e(8604).then(n.bind(n,1860)),"@site/docs/catalog/cloud/scale-logical-components-independently.md",1860],"2bcf1a01":[()=>n.e(6686).then(n.bind(n,3180)),"@site/docs/catalog/ai/energy-efficent-models.md",3180],"2ec3b088":[()=>n.e(2351).then(n.bind(n,3656)),"@site/docs/catalog/web/remove-unused-css.md",3656],"336012cf":[()=>n.e(7358).then(n.t.bind(n,8623,19)),"~docs/default/tag-tags-deployment-7e5.json",8623],"339e0e38":[()=>n.e(4124).then(n.bind(n,4784)),"@site/docs/catalog/cloud/use-async-instead-of-sync.md",4784],"356d1211":[()=>n.e(7904).then(n.bind(n,7969)),"@site/docs/catalog/web/minify-web-assets.md",7969],"359b770c":[()=>n.e(5677).then(n.bind(n,1490)),"@site/docs/catalog/cloud/scale-kubernetes-workloads-based-on-events.md",1490],"3720c009":[()=>Promise.all([n.e(532),n.e(3751)]).then(n.bind(n,6495)),"@theme/DocTagsListPage",6495],"3dd08d97":[()=>n.e(8751).then(n.bind(n,2647)),"@site/docs/catalog/cloud/set-retention-policy-on-storage-resources.md",2647],"3ea99f16":[()=>n.e(6330).then(n.bind(n,2118)),"@site/docs/catalog/ai/right-hardware-type.md",2118],"41cb6a13":[()=>n.e(5082).then(n.bind(n,3477)),"@site/docs/catalog/cloud/evaluate-other-cpu-architectures.md",3477],"473c0143":[()=>n.e(4601).then(n.bind(n,1651)),"@site/docs/catalog/cloud/queue-non-urgent-requests.md",1651],"48e9e5f1":[()=>n.e(7538).then(n.bind(n,4407)),"@site/docs/catalog/cloud/shed-lower-priority-traffic.md",4407],"4a01a261":[()=>n.e(5497).then(n.bind(n,9394)),"@site/docs/catalog/ai/serverless-model-development.md",9394],"4a0e72b8":[()=>n.e(2340).then(n.t.bind(n,8689,19)),"~docs/default/tag-tags-reliability-availability-86f.json",8689],"4bc4971a":[()=>n.e(1938).then(n.bind(n,296)),"@site/docs/catalog/cloud/reduce-transmitted-data.md",296],"4edc808e":[()=>Promise.all([n.e(532),n.e(4173)]).then(n.bind(n,1211)),"@site/docs/index.mdx",1211],"55960ee5":[()=>n.e(4121).then(n.t.bind(n,8070,19)),"~docs/default/tags-list-current-prop-15a.json",8070],"56c122aa":[()=>n.e(1286).then(n.bind(n,4688)),"@site/docs/catalog/ai/pre-trained-transfer-learning.md",4688],"5b55fa8e":[()=>n.e(50).then(n.t.bind(n,7798,19)),"~docs/default/tag-tags-size-medium-805.json",7798],"5bdcc37f":[()=>n.e(2949).then(n.bind(n,2834)),"@site/docs/catalog/index.md",2834],"5cff0ebf":[()=>n.e(8961).then(n.t.bind(n,3039,19)),"~docs/default/tag-tags-compute-461.json",3039],"5e582b23":[()=>n.e(2645).then(n.t.bind(n,5554,19)),"~docs/default/tag-tags-size-small-284.json",5554],"6dd24dad":[()=>n.e(9930).then(n.t.bind(n,4559,19)),"~docs/default/tag-tags-network-a82.json",4559],"6e7c13c8":[()=>n.e(7821).then(n.bind(n,9845)),"@site/docs/guide/suggested-tags.md",9845],"717128d8":[()=>n.e(2122).then(n.bind(n,5383)),"@site/docs/catalog/cloud/optimize-impact-on-customer-equipment.md",5383],"72b27058":[()=>n.e(3969).then(n.bind(n,2401)),"@site/docs/catalog/cloud/match-utilization-requirements-of-vm.md",2401],"770c5109":[()=>n.e(8725).then(n.bind(n,3846)),"@site/docs/catalog/cloud/cache-static-data.md",3846],"777526ec":[()=>n.e(2072).then(n.t.bind(n,4390,19)),"~docs/default/tag-tags-role-data-scientist-44c.json",4390],"778078a6":[()=>n.e(8450).then(n.bind(n,1573)),"@site/docs/catalog/web/serve-images-in-modern-formats.md",1573],"782ac186":[()=>n.e(4148).then(n.bind(n,6810)),"@site/docs/catalog/cloud/containerize-your-workload-where-applicable.md",6810],"78f57216":[()=>n.e(7070).then(n.bind(n,211)),"@site/docs/catalog/cloud/remove-unused-assets.md",211],"7a11bfb9":[()=>n.e(1421).then(n.bind(n,5965)),"@site/docs/catalog/cloud/scan-for-vulnerabilities.md",5965],"7d16b062":[()=>n.e(5754).then(n.t.bind(n,1336,19)),"~docs/default/tag-tags-networking-604.json",1336],"7d4685ea":[()=>n.e(9797).then(n.bind(n,5103)),"@site/docs/guide/index.md",5103],"7ebec3ff":[()=>n.e(5419).then(n.t.bind(n,4321,19)),"~docs/default/tag-tags-role-cloud-engineer-91c.json",4321],"8002bf56":[()=>n.e(7860).then(n.bind(n,5532)),"@site/docs/catalog/web/avoid-tracking-unnecessary-data.md",5532],"836ef5f0":[()=>n.e(146).then(n.bind(n,6686)),"@site/docs/catalog/cloud/minimizing-deployed-environments.md",6686],"8d01fc8d":[()=>n.e(8802).then(n.bind(n,1308)),"@site/docs/catalog/web/use-server-side-rendering.md",1308],"8d33f67c":[()=>n.e(3079).then(n.t.bind(n,253,19)),"~docs/default/tag-tags-kubernetes-7ba.json",253],"8e1e143b":[()=>n.e(9825).then(n.bind(n,5925)),"@site/docs/catalog/cloud/encrypt-what-is-necessary.md",5925],"8f91f489":[()=>n.e(7182).then(n.bind(n,8273)),"@site/docs/catalog/cloud/optimise-storage-resource-utilisation.md",8273],"9209d359":[()=>n.e(6214).then(n.bind(n,3075)),"@site/docs/tags/index.md",3075],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"93d64a37":[()=>n.e(1215).then(n.bind(n,4017)),"@site/docs/catalog/cloud/evaluate-whether-to-use-TLS-termination.md",4017],"957fd519":[()=>n.e(9275).then(n.bind(n,9534)),"@site/docs/catalog/ai/leverage-sustainable-regions.md",9534],"98ee5961":[()=>n.e(9401).then(n.bind(n,3806)),"@site/docs/catalog/cloud/use-circuit-breaker.md",3806],"9e642b58":[()=>n.e(8456).then(n.bind(n,4337)),"@site/docs/catalog/cloud/choose-region-closest-to-users.md",4337],a3d45d30:[()=>n.e(6431).then(n.bind(n,784)),"@site/docs/catalog/web/avoid-chaining-critical-requests.md",784],a4b181a9:[()=>n.e(8989).then(n.t.bind(n,9161,19)),"~docs/default/tag-tags-role-reliability-engineer-2d5.json",9161],a4dfb062:[()=>Promise.all([n.e(532),n.e(1765),n.e(2805)]).then(n.bind(n,7045)),"@site/docs/catalog/web/index.md",7045],a637ac13:[()=>n.e(6187).then(n.bind(n,8664)),"@site/docs/catalog/cloud/time-shift-kubernetes-cron-jobs.md",8664],a829cb4e:[()=>n.e(5920).then(n.bind(n,2131)),"@site/docs/catalog/cloud/compress-transmitted-data.md",2131],ab84bad5:[()=>n.e(1375).then(n.bind(n,1233)),"@site/docs/catalog/web/minimize-main-thread-work.md",1233],b02fcbbe:[()=>n.e(8540).then(n.bind(n,1102)),"@site/docs/catalog/cloud/optimize-avg-cpu-utilization.md",1102],b084ff01:[()=>n.e(8668).then(n.bind(n,601)),"@site/docs/catalog/ai/energy-efficent-ai-edge.md",601],b0cf2206:[()=>Promise.all([n.e(532),n.e(1765),n.e(252)]).then(n.bind(n,1685)),"@site/docs/catalog/cloud/index.md",1685],b6af033a:[()=>n.e(4923).then(n.bind(n,3677)),"@site/docs/catalog/web/properly-sized-images.md",3677],b8dc3674:[()=>n.e(3505).then(n.bind(n,2831)),"@site/docs/catalog/cloud/use-cloud-native-network-security-tools-and-controls.md",2831],be4eaa02:[()=>n.e(8066).then(n.bind(n,7632)),"@site/docs/catalog/cloud/use-energy-efficient-hardware.md",7632],bf31d9bc:[()=>n.e(6795).then(n.bind(n,6767)),"@site/docs/catalog/cloud/scale-down-kubernetes-workloads.md",6767],c0a2235c:[()=>n.e(2092).then(n.bind(n,7198)),"@site/docs/catalog/ai/efficent-format-for-model-training.md",7198],c30665ef:[()=>n.e(6755).then(n.t.bind(n,6671,19)),"~docs/default/tag-tags-ai-5b5.json",6671],c5a0b084:[()=>n.e(4403).then(n.bind(n,8589)),"@site/docs/catalog/web/deprecate-gifs.md",8589],cbb6a674:[()=>n.e(7143).then(n.bind(n,4335)),"@site/docs/catalog/cloud/use-ddos-protection.md",4335],cc299ddb:[()=>n.e(2467).then(n.bind(n,5247)),"@site/docs/catalog/cloud/delete-unused-storage-resources.md",5247],d6c3f943:[()=>n.e(3890).then(n.t.bind(n,1130,19)),"~docs/default/tag-tags-machine-learning-7b6.json",1130],d8d29226:[()=>n.e(2097).then(n.bind(n,8242)),"@site/docs/catalog/cloud/evaluate-using-a-service-mesh.md",8242],df203c0f:[()=>n.e(9924).then(n.bind(n,9385)),"@theme/DocTagDocListPage",9385],e0c6c906:[()=>n.e(8536).then(n.bind(n,9775)),"@site/docs/catalog/cloud/compress-stored-data.md",9775],e20ae084:[()=>n.e(6181).then(n.bind(n,7704)),"@site/docs/catalog/cloud/match-utilization-requirements-with-pre-configured-server.md",7704],e40996b3:[()=>n.e(8511).then(n.t.bind(n,6501,19)),"~docs/default/tag-tags-programming-language-7f8.json",6501],e450c455:[()=>n.e(6513).then(n.bind(n,9669)),"@site/docs/guide/initial-reviewer-guide.md",9669],ed645329:[()=>n.e(4236).then(n.t.bind(n,2578,19)),"~docs/default/tag-tags-cloud-c13.json",2578],f00aede0:[()=>n.e(3043).then(n.bind(n,6739)),"@site/docs/catalog/web/enable-text-compression.md",6739],f08cef58:[()=>n.e(7632).then(n.bind(n,4054)),"@site/docs/catalog/cloud/reduce-network-traversal-between-VMs.md",4054],f217acd3:[()=>n.e(4077).then(n.t.bind(n,3769,19)),"/home/runner/work/patterns/patterns/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],f31c573f:[()=>n.e(3777).then(n.bind(n,2502)),"@site/docs/guide/sme-reviewer-guide.md",2502],f415b733:[()=>n.e(6934).then(n.t.bind(n,4930,19)),"~docs/default/tag-tags-serverless-f69.json",4930],f4e56079:[()=>n.e(7030).then(n.t.bind(n,8022,19)),"~docs/default/tag-tags-storage-547.json",8022],f542e803:[()=>n.e(6559).then(n.bind(n,2154)),"@site/docs/catalog/ai/compress-ml-models-for-inference.md",2154],f59c19d8:[()=>n.e(5189).then(n.bind(n,2780)),"@site/docs/catalog/web/avoid-excessive-dom-size.md",2780],f80b235d:[()=>n.e(1492).then(n.t.bind(n,3444,19)),"~docs/default/tag-tags-web-fd1.json",3444],fada8994:[()=>n.e(727).then(n.bind(n,8158)),"@site/docs/catalog/cloud/optimize-peak-cpu-utilization.md",8158],fb227624:[()=>n.e(2704).then(n.bind(n,8771)),"@site/docs/catalog/cloud/scale-infrastructure-with-user-load.md",8771],fb940ba6:[()=>n.e(927).then(n.bind(n,5911)),"@site/docs/catalog/ai/energy-efficent-framework.md",5911],fd82f3a4:[()=>n.e(3422).then(n.bind(n,7322)),"@site/docs/catalog/web/keep-request-counts-low.md",7322],ff23dbd5:[()=>n.e(4876).then(n.t.bind(n,9627,19)),"~docs/default/tag-tags-role-software-engineer-c0b.json",9627]};function c(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("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%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("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"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var u=n(5304),d=n(9656);function f(e,t){if("*"===e)return i()({loading:c,loader:()=>n.e(4248).then(n.bind(n,4248)),modules:["@theme/NotFound"],webpack:()=>[4248],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[e+"-"+t],f={},p=[],m=[],g=(0,u.Z)(o);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=s[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:c,loader:f,modules:p,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));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 o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,a.Z)({},i,n)))}})}const p=[{path:"/tags",component:f("/tags","68f"),exact:!0},{path:"/tags/ai",component:f("/tags/ai","a2c"),exact:!0},{path:"/tags/cloud",component:f("/tags/cloud","de5"),exact:!0},{path:"/tags/compute",component:f("/tags/compute","777"),exact:!0},{path:"/tags/deployment",component:f("/tags/deployment","694"),exact:!0},{path:"/tags/kubernetes",component:f("/tags/kubernetes","90f"),exact:!0},{path:"/tags/machine-learning",component:f("/tags/machine-learning","9bf"),exact:!0},{path:"/tags/monitoring",component:f("/tags/monitoring","903"),exact:!0},{path:"/tags/network",component:f("/tags/network","ced"),exact:!0},{path:"/tags/networking",component:f("/tags/networking","b32"),exact:!0},{path:"/tags/programming-language",component:f("/tags/programming-language","6d7"),exact:!0},{path:"/tags/reliability-availability",component:f("/tags/reliability-availability","fff"),exact:!0},{path:"/tags/role-cloud-engineer",component:f("/tags/role-cloud-engineer","d87"),exact:!0},{path:"/tags/role-data-scientist",component:f("/tags/role-data-scientist","df6"),exact:!0},{path:"/tags/role-reliability-engineer",component:f("/tags/role-reliability-engineer","338"),exact:!0},{path:"/tags/role-software-engineer",component:f("/tags/role-software-engineer","da4"),exact:!0},{path:"/tags/role-web-developer",component:f("/tags/role-web-developer","aad"),exact:!0},{path:"/tags/security",component:f("/tags/security","3dd"),exact:!0},{path:"/tags/serverless",component:f("/tags/serverless","792"),exact:!0},{path:"/tags/size-large",component:f("/tags/size-large","ab7"),exact:!0},{path:"/tags/size-medium",component:f("/tags/size-medium","270"),exact:!0},{path:"/tags/size-small",component:f("/tags/size-small","4f5"),exact:!0},{path:"/tags/storage",component:f("/tags/storage","8ea"),exact:!0},{path:"/tags/web",component:f("/tags/web","4ad"),exact:!0},{path:"/",component:f("/","e2a"),routes:[{path:"/",component:f("/","7d9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/",component:f("/catalog/","7d8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/",component:f("/catalog/ai/","625"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/compress-ml-models-for-inference",component:f("/catalog/ai/compress-ml-models-for-inference","f94"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/efficent-format-for-model-training",component:f("/catalog/ai/efficent-format-for-model-training","d50"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/energy-efficent-ai-edge",component:f("/catalog/ai/energy-efficent-ai-edge","b3d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/energy-efficent-framework",component:f("/catalog/ai/energy-efficent-framework","efb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/energy-efficent-models",component:f("/catalog/ai/energy-efficent-models","761"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/leverage-sustainable-regions",component:f("/catalog/ai/leverage-sustainable-regions","755"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/pre-trained-transfer-learning",component:f("/catalog/ai/pre-trained-transfer-learning","61e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/right-hardware-type",component:f("/catalog/ai/right-hardware-type","a60"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/serverless-model-development",component:f("/catalog/ai/serverless-model-development","585"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/",component:f("/catalog/cloud/","bb3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/cache-static-data",component:f("/catalog/cloud/cache-static-data","0c2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/choose-region-closest-to-users",component:f("/catalog/cloud/choose-region-closest-to-users","483"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/compress-stored-data",component:f("/catalog/cloud/compress-stored-data","c4a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/compress-transmitted-data",component:f("/catalog/cloud/compress-transmitted-data","569"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/containerize-your-workload-where-applicable",component:f("/catalog/cloud/containerize-your-workload-where-applicable","727"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/delete-unused-storage-resources",component:f("/catalog/cloud/delete-unused-storage-resources","504"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/encrypt-what-is-necessary",component:f("/catalog/cloud/encrypt-what-is-necessary","ad9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/evaluate-other-cpu-architectures",component:f("/catalog/cloud/evaluate-other-cpu-architectures","775"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/evaluate-using-a-service-mesh",component:f("/catalog/cloud/evaluate-using-a-service-mesh","032"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/evaluate-whether-to-use-TLS-termination",component:f("/catalog/cloud/evaluate-whether-to-use-TLS-termination","ef8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/implement-stateless-design",component:f("/catalog/cloud/implement-stateless-design","411"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/match-slo",component:f("/catalog/cloud/match-slo","9f1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/match-utilization-requirements-of-vm",component:f("/catalog/cloud/match-utilization-requirements-of-vm","ff8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/match-utilization-requirements-with-pre-configured-server",component:f("/catalog/cloud/match-utilization-requirements-with-pre-configured-server","61d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/minimizing-deployed-environments",component:f("/catalog/cloud/minimizing-deployed-environments","151"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/optimise-storage-resource-utilisation",component:f("/catalog/cloud/optimise-storage-resource-utilisation","e69"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/optimize-avg-cpu-utilization",component:f("/catalog/cloud/optimize-avg-cpu-utilization","d5e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/optimize-impact-on-customer-equipment",component:f("/catalog/cloud/optimize-impact-on-customer-equipment","6ba"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/optimize-peak-cpu-utilization",component:f("/catalog/cloud/optimize-peak-cpu-utilization","e53"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/queue-non-urgent-requests",component:f("/catalog/cloud/queue-non-urgent-requests","2b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/reduce-network-traversal-between-VMs",component:f("/catalog/cloud/reduce-network-traversal-between-VMs","50f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/reduce-transmitted-data",component:f("/catalog/cloud/reduce-transmitted-data","554"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/remove-unused-assets",component:f("/catalog/cloud/remove-unused-assets","c9d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/scale-down-kubernetes-workloads",component:f("/catalog/cloud/scale-down-kubernetes-workloads","3d4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/scale-down-unused-applications",component:f("/catalog/cloud/scale-down-unused-applications","890"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/scale-infrastructure-with-user-load",component:f("/catalog/cloud/scale-infrastructure-with-user-load","58c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/scale-kubernetes-workloads-based-on-events",component:f("/catalog/cloud/scale-kubernetes-workloads-based-on-events","b00"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/scale-logical-components-independently",component:f("/catalog/cloud/scale-logical-components-independently","3b5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/scan-for-vulnerabilities",component:f("/catalog/cloud/scan-for-vulnerabilities","c71"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/set-retention-policy-on-storage-resources",component:f("/catalog/cloud/set-retention-policy-on-storage-resources","efa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/shed-lower-priority-traffic",component:f("/catalog/cloud/shed-lower-priority-traffic","d65"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/time-shift-kubernetes-cron-jobs",component:f("/catalog/cloud/time-shift-kubernetes-cron-jobs","e2f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/use-async-instead-of-sync",component:f("/catalog/cloud/use-async-instead-of-sync","b65"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/use-circuit-breaker",component:f("/catalog/cloud/use-circuit-breaker","3d0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/use-cloud-native-network-security-tools-and-controls",component:f("/catalog/cloud/use-cloud-native-network-security-tools-and-controls","52e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/use-compiled-languages",component:f("/catalog/cloud/use-compiled-languages","a80"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/use-ddos-protection",component:f("/catalog/cloud/use-ddos-protection","3ab"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/use-energy-efficient-hardware",component:f("/catalog/cloud/use-energy-efficient-hardware","9a8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/use-serverless",component:f("/catalog/cloud/use-serverless","089"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/",component:f("/catalog/web/","b72"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/avoid-chaining-critical-requests",component:f("/catalog/web/avoid-chaining-critical-requests","50e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/avoid-excessive-dom-size",component:f("/catalog/web/avoid-excessive-dom-size","946"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/avoid-tracking-unnecessary-data",component:f("/catalog/web/avoid-tracking-unnecessary-data","99d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/defer-offscreen-images",component:f("/catalog/web/defer-offscreen-images","a82"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/deprecate-gifs",component:f("/catalog/web/deprecate-gifs","86c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/enable-text-compression",component:f("/catalog/web/enable-text-compression","3cc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/keep-request-counts-low",component:f("/catalog/web/keep-request-counts-low","98b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/minify-web-assets",component:f("/catalog/web/minify-web-assets","39a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/minimize-main-thread-work",component:f("/catalog/web/minimize-main-thread-work","dc9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/properly-sized-images",component:f("/catalog/web/properly-sized-images","73a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/remove-unused-css",component:f("/catalog/web/remove-unused-css","1fc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/serve-images-in-modern-formats",component:f("/catalog/web/serve-images-in-modern-formats","2e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/use-server-side-rendering",component:f("/catalog/web/use-server-side-rendering","6bd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/guide/",component:f("/guide/","9b2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/guide/initial-reviewer-guide",component:f("/guide/initial-reviewer-guide","346"),exact:!0,sidebar:"tutorialSidebar"},{path:"/guide/sme-reviewer-guide",component:f("/guide/sme-reviewer-guide","c9c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/guide/suggested-tags",component:f("/guide/suggested-tags","d83"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tags/",component:f("/tags/","1a7"),exact:!0,sidebar:"tutorialSidebar"}]},{path:"*",component:f("*")}]},8121:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},654:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),l=n(6136);const s=[n(4313),n(984),n(2251),n(9957),n(6930)];var c=n(997),u=n(6775),d=n(8790);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(7462),m=n(1514),g=n(9962),h=n(9524),b=n(107),v=n(5463),y=n(626),w=n(8181),k=n(246),E=n(3647);function S(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),a=function(){const{siteConfig:{url:e}}=(0,g.Z)(),{pathname:t}=(0,u.TH)();return e+(0,h.Z)(t)}(),o=t?""+n+t:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function _(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(v.d,{image:n}),r.createElement(x,null),r.createElement(S,null),r.createElement(E.Z,{tag:k.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const C=new Map;function T(e){if(C.has(e.pathname))return{...e,pathname:C.get(e.pathname)};if((0,d.f)(c.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return C.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return C.set(e.pathname,t),{...e,pathname:t}}var L=n(8121),A=n(694);function P(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{var r,a;const o=null!=(r=null==(a=t.default)?void 0:a[e])?r:t[e];return null==o?void 0:o(...n)}));return()=>a.forEach((e=>null==e?void 0:e()))}const R=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(a&&function(e){const{hash:t}=e;if(t){const e=decodeURIComponent(t.substring(1)),n=document.getElementById(e);null==n||n.scrollIntoView()}else window.scrollTo(0,0)}(n),P("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function N(e){const t=(0,d.f)(c.Z,e);return Promise.all(t.map((e=>null==e.route.component.preload?void 0:e.route.component.preload())))}class O extends r.Component{constructor(e){super(e),this.previousLocation=void 0,this.routeUpdateCleanupCb=void 0,this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?P("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=P("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),N(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 r.createElement(R,{previousLocation:this.previousLocation,location:t},r.createElement(u.AW,{location:t,render:()=>e}))}}const D=O,I="docusaurus-base-url-issue-banner-container",M="docusaurus-base-url-issue-banner-suggestion-container",F="__DOCUSAURUS_INSERT_BASEURL_BANNER";function z(e){return"\nwindow['"+F+"'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['"+F+"'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('"+I+"');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = "+JSON.stringify(function(e){return'\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = '+e+" "+("/"===e?" (default value)":"")+'

\n

We suggest trying baseUrl =

\n
\n'}(e)).replace(/{window[F]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,z(e))),r.createElement("div",{id:I}))}function B(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.Z)(),{pathname:n}=(0,u.TH)();return t&&n===e?r.createElement(j,null):null}function U(){const{siteConfig:{favicon:e,title:t},i18n:{currentLocale:n,localeConfigs:a}}=(0,g.Z)(),o=(0,h.Z)(e),{htmlLang:i,direction:l}=a[n];return r.createElement(m.Z,null,r.createElement("html",{lang:i,dir:l}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),e&&r.createElement("link",{rel:"icon",href:o}))}var q=n(3256);function G(){const e=(0,d.H)(c.Z),t=(0,u.TH)();return r.createElement(q.Z,null,r.createElement(A.M,null,r.createElement(L.t,null,r.createElement(f,null,r.createElement(U,null),r.createElement(_,null),r.createElement(B,null),r.createElement(D,{location:T(t)},e)))))}var $=n(6887);const H=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{var r,a;if("undefined"==typeof document)return void n();const o=document.createElement("link");o.setAttribute("rel","prefetch"),o.setAttribute("href",e),o.onload=()=>t(),o.onerror=()=>n();const i=null!=(r=document.getElementsByTagName("head")[0])?r:null==(a=document.getElementsByName("script")[0])?void 0:a.parentNode;null==i||i.appendChild(o)}))}: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 Z=n(5304);const V=new Set,W=new Set,Y=()=>{var e,t;return(null==(e=navigator.connection)?void 0:e.effectiveType.includes("2g"))||(null==(t=navigator.connection)?void 0:t.saveData)},K={prefetch(e){if(!(e=>!Y()&&!W.has(e)&&!V.has(e))(e))return!1;V.add(e);const t=(0,d.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries($).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Z.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?H(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!Y()&&!W.has(e))(e)&&(W.add(e),N(e))},Q=Object.freeze(K);if(l.Z.canUseDOM){window.docusaurus=Q;const e=a.hydrate;N(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(G,null))),document.getElementById("__docusaurus"))}))}},694:(e,t,n)=>{"use strict";n.d(t,{_:()=>u,M:()=>d});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":"G-G3P4S2WSTC","anonymizeIP":false,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/","mainDocId":"index","docs":[{"id":"catalog/ai/compress-ml-models-for-inference","path":"/catalog/ai/compress-ml-models-for-inference","sidebar":"tutorialSidebar"},{"id":"catalog/ai/efficent-format-for-model-training","path":"/catalog/ai/efficent-format-for-model-training","sidebar":"tutorialSidebar"},{"id":"catalog/ai/energy-efficent-ai-edge","path":"/catalog/ai/energy-efficent-ai-edge","sidebar":"tutorialSidebar"},{"id":"catalog/ai/energy-efficent-framework","path":"/catalog/ai/energy-efficent-framework","sidebar":"tutorialSidebar"},{"id":"catalog/ai/energy-efficent-models","path":"/catalog/ai/energy-efficent-models","sidebar":"tutorialSidebar"},{"id":"catalog/ai/index","path":"/catalog/ai/","sidebar":"tutorialSidebar"},{"id":"catalog/ai/leverage-sustainable-regions","path":"/catalog/ai/leverage-sustainable-regions","sidebar":"tutorialSidebar"},{"id":"catalog/ai/pre-trained-transfer-learning","path":"/catalog/ai/pre-trained-transfer-learning","sidebar":"tutorialSidebar"},{"id":"catalog/ai/right-hardware-type","path":"/catalog/ai/right-hardware-type","sidebar":"tutorialSidebar"},{"id":"catalog/ai/serverless-model-development","path":"/catalog/ai/serverless-model-development","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/cache-static-data","path":"/catalog/cloud/cache-static-data","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/choose-region-closest-to-users","path":"/catalog/cloud/choose-region-closest-to-users","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/compress-stored-data","path":"/catalog/cloud/compress-stored-data","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/compress-transmitted-data","path":"/catalog/cloud/compress-transmitted-data","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/containerize-your-workload-where-applicable","path":"/catalog/cloud/containerize-your-workload-where-applicable","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/delete-unused-storage-resources","path":"/catalog/cloud/delete-unused-storage-resources","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/encrypt-what-is-necessary","path":"/catalog/cloud/encrypt-what-is-necessary","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/evaluate-other-cpu-architectures","path":"/catalog/cloud/evaluate-other-cpu-architectures","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/evaluate-using-a-service-mesh","path":"/catalog/cloud/evaluate-using-a-service-mesh","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","path":"/catalog/cloud/evaluate-whether-to-use-TLS-termination","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/implement-stateless-design","path":"/catalog/cloud/implement-stateless-design","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/index","path":"/catalog/cloud/","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/match-slo","path":"/catalog/cloud/match-slo","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/match-utilization-requirements-of-vm","path":"/catalog/cloud/match-utilization-requirements-of-vm","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","path":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/minimizing-deployed-environments","path":"/catalog/cloud/minimizing-deployed-environments","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/optimise-storage-resource-utilisation","path":"/catalog/cloud/optimise-storage-resource-utilisation","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/optimize-avg-cpu-utilization","path":"/catalog/cloud/optimize-avg-cpu-utilization","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/optimize-impact-on-customer-equipment","path":"/catalog/cloud/optimize-impact-on-customer-equipment","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/optimize-peak-cpu-utilization","path":"/catalog/cloud/optimize-peak-cpu-utilization","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/queue-non-urgent-requests","path":"/catalog/cloud/queue-non-urgent-requests","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/reduce-network-traversal-between-VMs","path":"/catalog/cloud/reduce-network-traversal-between-VMs","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/reduce-transmitted-data","path":"/catalog/cloud/reduce-transmitted-data","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/remove-unused-assets","path":"/catalog/cloud/remove-unused-assets","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/scale-down-kubernetes-workloads","path":"/catalog/cloud/scale-down-kubernetes-workloads","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/scale-down-unused-applications","path":"/catalog/cloud/scale-down-unused-applications","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","path":"/catalog/cloud/scale-infrastructure-with-user-load","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","path":"/catalog/cloud/scale-kubernetes-workloads-based-on-events","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/scale-logical-components-independently","path":"/catalog/cloud/scale-logical-components-independently","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/scan-for-vulnerabilities","path":"/catalog/cloud/scan-for-vulnerabilities","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/set-retention-policy-on-storage-resources","path":"/catalog/cloud/set-retention-policy-on-storage-resources","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/shed-lower-priority-traffic","path":"/catalog/cloud/shed-lower-priority-traffic","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","path":"/catalog/cloud/time-shift-kubernetes-cron-jobs","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/use-async-instead-of-sync","path":"/catalog/cloud/use-async-instead-of-sync","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/use-circuit-breaker","path":"/catalog/cloud/use-circuit-breaker","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","path":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/use-compiled-languages","path":"/catalog/cloud/use-compiled-languages","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/use-ddos-protection","path":"/catalog/cloud/use-ddos-protection","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/use-energy-efficient-hardware","path":"/catalog/cloud/use-energy-efficient-hardware","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/use-serverless","path":"/catalog/cloud/use-serverless","sidebar":"tutorialSidebar"},{"id":"catalog/index","path":"/catalog/","sidebar":"tutorialSidebar"},{"id":"catalog/web/avoid-chaining-critical-requests","path":"/catalog/web/avoid-chaining-critical-requests","sidebar":"tutorialSidebar"},{"id":"catalog/web/avoid-excessive-dom-size","path":"/catalog/web/avoid-excessive-dom-size","sidebar":"tutorialSidebar"},{"id":"catalog/web/avoid-tracking-unnecessary-data","path":"/catalog/web/avoid-tracking-unnecessary-data","sidebar":"tutorialSidebar"},{"id":"catalog/web/defer-offscreen-images","path":"/catalog/web/defer-offscreen-images","sidebar":"tutorialSidebar"},{"id":"catalog/web/deprecate-gifs","path":"/catalog/web/deprecate-gifs","sidebar":"tutorialSidebar"},{"id":"catalog/web/enable-text-compression","path":"/catalog/web/enable-text-compression","sidebar":"tutorialSidebar"},{"id":"catalog/web/index","path":"/catalog/web/","sidebar":"tutorialSidebar"},{"id":"catalog/web/keep-request-counts-low","path":"/catalog/web/keep-request-counts-low","sidebar":"tutorialSidebar"},{"id":"catalog/web/minify-web-assets","path":"/catalog/web/minify-web-assets","sidebar":"tutorialSidebar"},{"id":"catalog/web/minimize-main-thread-work","path":"/catalog/web/minimize-main-thread-work","sidebar":"tutorialSidebar"},{"id":"catalog/web/properly-sized-images","path":"/catalog/web/properly-sized-images","sidebar":"tutorialSidebar"},{"id":"catalog/web/remove-unused-css","path":"/catalog/web/remove-unused-css","sidebar":"tutorialSidebar"},{"id":"catalog/web/serve-images-in-modern-formats","path":"/catalog/web/serve-images-in-modern-formats","sidebar":"tutorialSidebar"},{"id":"catalog/web/use-server-side-rendering","path":"/catalog/web/use-server-side-rendering","sidebar":"tutorialSidebar"},{"id":"guide/index","path":"/guide/","sidebar":"tutorialSidebar"},{"id":"guide/initial-reviewer-guide","path":"/guide/initial-reviewer-guide","sidebar":"tutorialSidebar"},{"id":"guide/sme-reviewer-guide","path":"/guide/sme-reviewer-guide","sidebar":"tutorialSidebar"},{"id":"guide/suggested-tags","path":"/guide/suggested-tags","sidebar":"tutorialSidebar"},{"id":"index","path":"/","sidebar":"tutorialSidebar"},{"id":"tags/index","path":"/tags/","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/","label":"index"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.0.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.0.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.0.1"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"2.0.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.0.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.0.1"},"docusaurus-plugin-ideal-image":{"type":"package","name":"@docusaurus/plugin-ideal-image","version":"2.0.1"}}}'),c={siteConfig:a.Z,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},u=r.createContext(c);function d(e){let{children:t}=e;return r.createElement(u.Provider,{value:c},t)}},3256:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7294),a=n(6136),o=n(1514),i=n(9142);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",height:"50vh",width:"100%",fontSize:"20px"}},r.createElement("h1",null,"This page crashed."),r.createElement("p",null,t.message),r.createElement("button",{type:"button",onClick:n},"Try again"))}function s(e){let{error:t,tryAgain:n}=e;return r.createElement(u,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(i.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const c=e=>r.createElement(s,e);class u extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){var n;const e={error:t,tryAgain:()=>this.setState({error:null})};return(null!=(n=this.props.fallback)?n:c)(e)}return null!=e?e:null}}},6136:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},1514:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},3699:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7462),a=n(7294),o=n(3727),i=n(3905),l=n(9962),s=n(2735),c=n(6136);const u=a.createContext({collectLink:()=>{}});var d=n(9524);function f(e,t){var n,f;let{isNavLink:p,to:m,href:g,activeClassName:h,isActive:b,"data-noBrokenLinkCheck":v,autoAddBaseUrl:y=!0,...w}=e;const{siteConfig:{trailingSlash:k,baseUrl:E}}=(0,l.Z)(),{withBaseUrl:S}=(0,d.C)(),x=(0,a.useContext)(u),_=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>_.current));const C=m||g;const T=(0,s.Z)(C),L=null==C?void 0:C.replace("pathname://","");let A=void 0!==L?(P=L,y&&(e=>e.startsWith("/"))(P)?S(P):P):void 0;var P;A&&T&&(A=(0,i.applyTrailingSlash)(A,{trailingSlash:k,baseUrl:E}));const R=(0,a.useRef)(!1),N=p?o.OL:o.rU,O=c.Z.canUseIntersectionObserver,D=(0,a.useRef)();(0,a.useEffect)((()=>(!O&&T&&null!=A&&window.docusaurus.prefetch(A),()=>{O&&D.current&&D.current.disconnect()})),[D,A,O,T]);const I=null!=(n=null==(f=A)?void 0:f.startsWith("#"))&&n,M=!A||!T||I;return M||v||x.collectLink(A),M?a.createElement("a",(0,r.Z)({ref:_,href:A},C&&!T&&{target:"_blank",rel:"noopener noreferrer"},w)):a.createElement(N,(0,r.Z)({},w,{onMouseEnter:()=>{R.current||null==A||(window.docusaurus.preload(A),R.current=!0)},innerRef:e=>{_.current=e,O&&e&&T&&(D.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(D.current.unobserve(e),D.current.disconnect(),null!=A&&window.docusaurus.prefetch(A))}))})),D.current.observe(e))},to:A},p&&{isActive:b,activeClassName:h}))}const p=a.forwardRef(f)},7325:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=null==t?void 0: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 o=n(7529);function i(e){var t,n;let{id:r,message:a}=e;if(void 0===r&&void 0===a)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return null!=(t=null!=(n=o[null!=r?r:a])?n:a)?t:r}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},6875:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},2735:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},9524:(e,t,n)=>{"use strict";n.d(t,{C:()=>o,Z:()=>i});var r=n(9962),a=n(2735);function o(){const{siteConfig:{baseUrl:e,url:t}}=(0,r.Z)();return{withBaseUrl:(n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.b)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)}}function i(e,t){void 0===t&&(t={});const{withBaseUrl:n}=o();return n(e,t)}},9962:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(694);function o(){return(0,r.useContext)(a._)}},1048:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8121);function o(){return(0,r.useContext)(a._)}},5304:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});function r(e){const t={};return function e(n,r){Object.entries(n).forEach((n=>{let[a,o]=n;const i=r?r+"."+a:a;var l;"object"==typeof(l=o)&&l&&Object.keys(l).length>0?e(o,i):t[i]=o}))}(e),t}},9656:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(7294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(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,...null==n?void 0:n.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},9871:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>g,gA:()=>f,_r:()=>u,Jo:()=>h,zh:()=>d,yW:()=>m,gB:()=>p});var r=n(6775),a=n(9962),o=n(6875);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin.');return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=function(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=null==n?void 0:n.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const c={},u=()=>{var e;return null!=(e=i("docusaurus-plugin-content-docs"))?e:c},d=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=null==r?void 0:r[t];if(!a&&n.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin with id "'+t+'".');return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=u(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&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 o}(t,n,e)}function p(e){return d(e).versions}function m(e){const t=d(e);return l(t)}function g(e){const t=d(e),{pathname:n}=(0,r.TH)();return s(t,n)}function h(e){const t=d(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},4313:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("event","page_view",{page_title:document.title,page_location:window.location.href,page_path:t.pathname+t.search+t.hash})}))}}},9957:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},2251:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.Z,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(6726)("./prism-"+e)})),delete globalThis.Prism}(r.Z)},4082:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a="iconExternalLink_nPIU";function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a},r.createElement("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"}))}},9142:(e,t,n)=>{"use strict";n.d(t,{Z:()=>rt});var r=n(7294),a=n(6010),o=n(3256),i=n(5463),l=n(3702),s=n(8181),c=n(7325),u=n(6775),d=n(3266);function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}const p="skipToContent_fXgn";function m(){const{containerRef:e,handleSkip:t}=function(){const e=(0,r.useRef)(null),{action:t}=(0,u.k6)(),n=(0,r.useCallback)((e=>{var t;e.preventDefault();const n=null!=(t=document.querySelector("main:first-of-type"))?t:document.querySelector("."+l.k.wrapper.main);n&&f(n)}),[]);return(0,d.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,handleSkip:n}}();return r.createElement("div",{ref:e,role:"region"},r.createElement("a",{href:"#",className:p,onClick:t},r.createElement(c.Z,{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"},"Skip to main content")))}var g=n(107),h=n(5830),b=n(7462);function v(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...l}=e;return r.createElement("svg",(0,b.Z)({viewBox:"0 0 15 15",width:t,height:n},l),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const y="announcementBar_mb4j",w="announcementBarPlaceholder_vyr4",k="announcementBarClose_gvF7",E="announcementBarContent_xLdY";function S(){const{isActive:e,close:t}=(0,h.nT)(),{announcementBar:n}=(0,g.L)();if(!e)return null;const{content:o,backgroundColor:i,textColor:l,isCloseable:s}=n;return r.createElement("div",{className:y,style:{backgroundColor:i,color:l},role:"banner"},s&&r.createElement("div",{className:w}),r.createElement("div",{className:E,dangerouslySetInnerHTML:{__html:o}}),s?r.createElement("button",{type:"button",className:(0,a.Z)("clean-btn close",k),onClick:t,"aria-label":(0,c.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},r.createElement(v,{width:14,height:14,strokeWidth:3.1})):null)}var x=n(2600),_=n(2957);var C=n(3768),T=n(3086);const L=r.createContext(null);function A(e){let{children:t}=e;const n=function(){const e=(0,x.e)(),t=(0,T.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,C.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(L.Provider,{value:n},t)}function P(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function R(){const e=(0,r.useContext)(L);if(!e)throw new C.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,T.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:P(o)})),[a,o,t])}function N(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=R();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var O=n(9200),D=n(1048);function I(e){return r.createElement("svg",(0,b.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("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 M(e){return r.createElement("svg",(0,b.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("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 F={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function z(e){let{className:t,value:n,onChange:o}=e;const i=(0,D.Z)(),l=(0,c.I)({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"===n?(0,c.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,c.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)(F.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",F.toggleButton,!i&&F.toggleButtonDisabled),type:"button",onClick:()=>o("dark"===n?"light":"dark"),disabled:!i,title:l,"aria-label":l},r.createElement(I,{className:(0,a.Z)(F.toggleIcon,F.lightToggleIcon)}),r.createElement(M,{className:(0,a.Z)(F.toggleIcon,F.darkToggleIcon)})))}const j=r.memo(z);function B(e){let{className:t}=e;const n=(0,g.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,O.I)();return n?null:r.createElement(j,{className:t,value:a,onChange:o})}var U=n(6811);function q(){return r.createElement(U.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function G(){const e=(0,x.e)();return r.createElement("button",{type:"button",className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(v,{color:"var(--ifm-color-emphasis-600)"}))}function $(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(q,null),r.createElement(B,{className:"margin-right--md"}),r.createElement(G,null))}var H=n(3699),Z=n(9524),V=n(2735);function W(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var Y=n(4082);function K(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:l,isDropdownLink:s,prependBaseUrlToHref:c,...u}=e;const d=(0,Z.Z)(a),f=(0,Z.Z)(t),p=(0,Z.Z)(o,{forcePrependBaseUrl:!0}),m=i&&o&&!(0,V.Z)(o),g=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,i,m&&r.createElement(Y.Z,s&&{width:12,height:12}))};return o?r.createElement(H.Z,(0,b.Z)({href:c?p:o},u,g)):r.createElement(H.Z,(0,b.Z)({to:d,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?W(n,t.pathname):t.pathname.startsWith(f)},u,g))}function Q(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(K,(0,b.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function X(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(K,(0,b.Z)({className:(0,a.Z)("menu__link",t)},o)))}function J(e){var t;let{mobile:n=!1,position:a,...o}=e;const i=n?X:Q;return r.createElement(i,(0,b.Z)({},o,{activeClassName:null!=(t=o.activeClassName)?t:n?"menu__link--active":"navbar__link--active"}))}var ee=n(4639),te=n(9003),ne=n(9962);function re(e,t){return e.some((e=>function(e,t){return!!(0,te.Mg)(e.to,t)||!!W(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ae(e){var t;let{items:n,position:o,className:i,onClick:l,...s}=e;const c=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{c.current&&!c.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[c]),r.createElement("div",{ref:c,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===o,"dropdown--show":u})},r.createElement(K,(0,b.Z)({"aria-haspopup":"true","aria-expanded":u,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",i)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))}}),null!=(t=s.children)?t:s.label),r.createElement("ul",{className:"dropdown__menu"},n.map(((e,t)=>r.createElement(ve,(0,b.Z)({isDropdownItem:!0,onKeyDown:e=>{if(t===n.length-1&&"Tab"===e.key){e.preventDefault(),d(!1);const t=c.current.nextElementSibling;if(t){(t instanceof HTMLAnchorElement?t:t.querySelector("a")).focus()}}},activeClassName:"dropdown__link--active"},e,{key:t}))))))}function oe(e){var t;let{items:n,className:o,position:i,onClick:l,...s}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,ne.Z)(),{pathname:t}=(0,u.TH)();return t.replace(e,"/")}(),d=re(n,c),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,ee.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(K,(0,b.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",o)},s,{onClick:e=>{e.preventDefault(),p()}}),null!=(t=s.children)?t:s.label),r.createElement(ee.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},n.map(((e,t)=>r.createElement(ve,(0,b.Z)({mobile:!0,isDropdownItem:!0,onClick:l,activeClassName:"menu__link--active"},e,{key:t}))))))}function ie(e){let{mobile:t=!1,...n}=e;const a=t?oe:ae;return r.createElement(a,n)}var le=n(626);function se(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,b.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("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 ce="iconLanguage_nlXk";const ue=()=>null,de="searchBox_ZlJk";function fe(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,de)},t)}var pe=n(9871),me=n(3734);var ge=n(6409);const he=e=>e.docs.find((t=>t.id===e.mainDocId));const be={default:J,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:l,localeConfigs:s}}=(0,ne.Z)(),u=(0,le.l)(),d=[...n,...l.map((e=>{const n="pathname://"+u.createUrl({locale:e,fullyQualified:!1});return{label:s[e].label,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],f=t?(0,c.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):s[i].label;return r.createElement(ie,(0,b.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(se,{className:ce}),f),items:d}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(fe,{className:n},r.createElement(ue,null))},dropdown:ie,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,pe.Iw)(a),l=(0,me.vY)(t,a);return null===l?null:r.createElement(J,(0,b.Z)({exact:!0},o,{isActive:()=>(null==i?void 0:i.path)===l.path||!(null==i||!i.sidebar)&&i.sidebar===l.sidebar,label:null!=n?n:l.id,to:l.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,pe.Iw)(a),l=(0,me.oz)(t,a).link;if(!l)throw new Error('DocSidebarNavbarItem: Sidebar with ID "'+t+"\" doesn't have anything to be linked to.");return r.createElement(J,(0,b.Z)({exact:!0},o,{isActive:()=>(null==i?void 0:i.sidebar)===t,label:null!=n?n:l.label,to:l.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,me.lO)(a)[0],l=null!=t?t:i.label,s=null!=n?n:(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(J,(0,b.Z)({},o,{label:l,to:s}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...l}=e;const s=(0,pe.Iw)(n),u=(0,pe.gB)(n),{savePreferredVersionName:d}=(0,ge.J)(n),f=[...o,...u.map((e=>{var t;const n=null!=(t=s.alternateDocVersions[e.name])?t:he(e);return{label:e.label,to:n.path,isActive:()=>e===s.activeVersion,onClick:()=>d(e.name)}})),...i],p=(0,me.lO)(n)[0],m=t&&f.length>1?(0,c.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):p.label,g=t&&f.length>1?void 0:he(p).path;return f.length<=1?r.createElement(J,(0,b.Z)({},l,{mobile:t,label:m,to:g,isActive:a?()=>!1:void 0})):r.createElement(ie,(0,b.Z)({},l,{mobile:t,label:m,to:g,items:f,isActive:a?()=>!1:void 0}))}};function ve(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=be[a];if(!o)throw new Error('No NavbarItem component found for type "'+t+'".');return r.createElement(o,n)}function ye(){const e=(0,x.e)(),t=(0,g.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(ve,(0,b.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function we(e){return r.createElement("button",(0,b.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(c.Z,{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)"},"\u2190 Back to main menu"))}function ke(){const e=0===(0,g.L)().navbar.items.length,t=R();return r.createElement(r.Fragment,null,!e&&r.createElement(we,{onClick:()=>t.hide()}),t.content)}function Ee(){const e=(0,x.e)();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?r.createElement(N,{header:r.createElement($,null),primaryMenu:r.createElement(ye,null),secondaryMenu:r.createElement(ke,null)}):null}const Se="navbarHideable_m1mJ",xe="navbarHidden_jGov";function _e(e){return r.createElement("div",(0,b.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Ce(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,g.L)(),i=(0,x.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,_.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+c{if(e)return t.location.hash?(a.current=!0,void n(!1)):void n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Se,!s&&xe],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(_e,{onClick:i.toggle}),r.createElement(Ee,null))}function Te(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,b.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function Le(){const e=(0,x.e)();return r.createElement("button",{onClick:e.toggle,onKeyDown:e.toggle,"aria-label":"Navigation bar toggle",className:"navbar__toggle clean-btn",type:"button",tabIndex:0},r.createElement(Te,null))}const Ae="colorModeToggle_DEke";function Pe(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(ve,(0,b.Z)({},e,{key:t})))))}function Re(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function Ne(){const e=(0,x.e)(),t=(0,g.L)().navbar.items,[n,a]=function(e){function t(e){var t;return"left"===(null!=(t=e.position)?t:"right")}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(Re,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(Le,null),r.createElement(q,null),r.createElement(Pe,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(Pe,{items:a}),r.createElement(B,{className:Ae}),!o&&r.createElement(fe,null,r.createElement(ue,null)))})}function Oe(){return r.createElement(Ce,null,r.createElement(Ne,null))}function De(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...l}=t,s=(0,Z.Z)(n),c=(0,Z.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(H.Z,(0,b.Z)({className:"footer__link-item"},a?{href:i?c:a}:{to:s},l),o,a&&!(0,V.Z)(a)&&r.createElement(Y.Z,null))}function Ie(e){var t;let{item:n}=e;return n.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:n.html}}):r.createElement("li",{key:null!=(t=n.href)?t:n.to,className:"footer__item"},r.createElement(De,{item:n}))}function Me(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(Ie,{key:t,item:e})))))}function Fe(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(Me,{key:t,column:e}))))}function ze(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function je(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(De,{item:t})}function Be(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(je,{item:e}),t.length!==n+1&&r.createElement(ze,null))))))}function Ue(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(Fe,{columns:t}):r.createElement(Be,{links:t})}var qe=n(7909);const Ge="footerLogoLink_BH7S";function $e(e){var t;let{logo:n}=e;const{withBaseUrl:o}=(0,Z.C)(),i={light:o(n.src),dark:o(null!=(t=n.srcDark)?t:n.src)};return r.createElement(qe.Z,{className:(0,a.Z)("footer__logo",n.className),alt:n.alt,sources:i,width:n.width,height:n.height,style:n.style})}function He(e){let{logo:t}=e;return t.href?r.createElement(H.Z,{href:t.href,className:Ge,target:t.target},r.createElement($e,{logo:t})):r.createElement($e,{logo:t})}function Ze(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Ve(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function We(){const{footer:e}=(0,g.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(Ve,{style:o,links:n&&n.length>0&&r.createElement(Ue,{links:n}),logo:a&&r.createElement(He,{logo:a}),copyright:t&&r.createElement(Ze,{copyright:t})})}const Ye=r.memo(We);var Ke=n(2560);const Qe="docusaurus.tab.",Xe=r.createContext(void 0);const Je=(0,C.Qc)([O.S,h.pl,function(e){let{children:t}=e;const n=function(){const[e,t]=(0,r.useState)({}),n=(0,r.useCallback)(((e,t)=>{(0,Ke.W)("docusaurus.tab."+e).set(t)}),[]);(0,r.useEffect)((()=>{try{const e={};(0,Ke._)().forEach((t=>{if(t.startsWith(Qe)){const n=t.substring(Qe.length);e[n]=(0,Ke.W)(t).get()}})),t(e)}catch(e){console.error(e)}}),[]);const a=(0,r.useCallback)(((e,r)=>{t((t=>({...t,[e]:r}))),n(e,r)}),[n]);return(0,r.useMemo)((()=>({tabGroupChoices:e,setTabGroupChoices:a})),[e,a])}();return r.createElement(Xe.Provider,{value:n},t)},_.OC,ge.L5,i.VC,function(e){let{children:t}=e;return r.createElement(T.n2,null,r.createElement(x.M,null,r.createElement(A,null,t)))}]);function et(e){let{children:t}=e;return r.createElement(Je,null,t)}function tt(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(c.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("p",null,t.message),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},r.createElement(c.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}const nt="mainWrapper_z2l0";function rt(e){const{children:t,noFooter:n,wrapperClassName:c,title:u,description:d}=e;return(0,s.t)(),r.createElement(et,null,r.createElement(i.d,{title:u,description:d}),r.createElement(m,null),r.createElement(S,null),r.createElement(Oe,null),r.createElement("div",{className:(0,a.Z)(l.k.wrapper.main,nt,c)},r.createElement(o.Z,{fallback:e=>r.createElement(tt,e)},t)),!n&&r.createElement(Ye,null))}},6811:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(3699),i=n(9524),l=n(9962),s=n(107),c=n(7909);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=a.createElement(c.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){var t;const{siteConfig:{title:n}}=(0,l.Z)(),{navbar:{title:c,logo:d}}=(0,s.L)(),{imageClassName:f,titleClassName:p,...m}=e,g=(0,i.Z)((null==d?void 0:d.href)||"/"),h=c?"":n,b=null!=(t=null==d?void 0:d.alt)?t:h;return a.createElement(o.Z,(0,r.Z)({to:g},m,(null==d?void 0:d.target)&&{target:d.target}),d&&a.createElement(u,{logo:d,alt:b,imageClassName:f}),null!=c&&a.createElement("b",{className:p},c))}},3647:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(1514);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},7909:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7462),a=n(7294),o=n(6010),i=n(1048),l=n(9200);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function c(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:c,className:u,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.Z)({key:e,src:c[e],alt:d,className:(0,o.Z)(s.themedImage,s["themedImage--"+e],u)},f)))))}},4639:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,z:()=>m});var r=n(7462),a=n(7294),o=n(6136);function i(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(null!=t&&t),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const l={display:"none",overflow:"hidden",height:"0px"},s={display:"block",overflow:"visible",height:"auto"};function c(e,t){const n=t?l:s;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function u(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){var t,n;const a=e.scrollHeight,o=null!=(t=null==r?void 0:r.duration)?t:function(e){const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(a);return{transition:"height "+o+"ms "+(null!=(n=null==r?void 0:r.easing)?n:"ease-in-out"),height:a+"px"}}function i(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return c(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(i(),requestAnimationFrame((()=>{e.style.height=l.height,e.style.overflow=l.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{i()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function d(e){if(!o.Z.canUseDOM)return e?l:s}function f(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const f=(0,a.useRef)(null);return u({collapsibleRef:f,collapsed:n,animation:o}),a.createElement(t,{ref:f,style:s?void 0:d(n),onTransitionEnd:e=>{"height"===e.propertyName&&(c(f.current,n),null==i||i(n))},className:l},r)}function p(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(f,(0,r.Z)({},n,{collapsed:l})):null}function m(e){let{lazy:t,...n}=e;const r=t?p:f;return a.createElement(r,n)}},5830:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(7294),a=n(1048),o=n(2560),i=n(3768),l=n(107);const s=(0,o.W)("docusaurus.announcement.dismiss"),c=(0,o.W)("docusaurus.announcement.id"),u=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&u()));(0,r.useEffect)((()=>{o(u())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&d(!1),!r&&u()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},9200:(e,t,n)=>{"use strict";n.d(t,{I:()=>h,S:()=>g});var r=n(7294),a=n(6136),o=n(3768),i=n(2560),l=n(107);const s=r.createContext(void 0),c="theme",u=(0,i.W)(c),d="light",f="dark",p=e=>e===f?f:d;function m(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[o,i]=(0,r.useState)((e=>a.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e))(e));(0,r.useEffect)((()=>{t&&u.del()}),[t]);const s=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(i(t),a&&(e=>{u.set(p(e))})(t)):(i(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f:d:e),u.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!==c)return;const t=u.get();null!==t&&s(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,s]);const m=(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||m.current?m.current=window.matchMedia("print").matches:s(null)};return e.addListener(r),()=>e.removeListener(r)}),[s,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:s,get isDarkTheme(){return o===f},setLightTheme(){s(d)},setDarkTheme(){s(f)}})),[o,s])}function g(e){let{children:t}=e;const n=m();return r.createElement(s.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},6409:(e,t,n)=>{"use strict";n.d(t,{J:()=>y,L5:()=>b});var r=n(7294),a=n(9871),o=n(6875),i=n(107),l=n(3734),s=n(3768),c=n(2560);const u=e=>"docs-preferred-version-"+e,d=(e,t,n)=>{(0,c.W)(u(e),{persistence:t}).set(n)},f=(e,t)=>(0,c.W)(u(e),{persistence:t}).get(),p=(e,t)=>{(0,c.W)(u(e),{persistence:t}).del()};const m=r.createContext(null);function g(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>(e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}]))))(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=f(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=g();return r.createElement(m.Provider,{value:n},t)}function b(e){let{children:t}=e;return l.cE?r.createElement(h,null,t):r.createElement(r.Fragment,null,t)}function v(){const e=(0,r.useContext)(m);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function y(e){var t;void 0===e&&(e=o.m);const n=(0,a.zh)(e),[i,l]=v(),{preferredVersionName:s}=i[e];return{preferredVersion:null!=(t=n.versions.find((e=>e.name===s)))?t:null,savePreferredVersionName:(0,r.useCallback)((t=>{l.savePreferredVersion(e,t)}),[l,e])}}},4432:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(7294),a=n(3768);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},2600:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(7294),a=n(3086),o=n(3488),i=n(6775),l=n(3768);function s(e){!function(e){const t=(0,i.k6)(),n=(0,l.zX)(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(107);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,c.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const u=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:i})),[e,n,u,i])}function f(e){let{children:t}=e;const n=d();return r.createElement(u.Provider,{value:n},t)}function p(){const e=r.useContext(u);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3086:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(7294),a=n(3768);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},8181:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},3488:(e,t,n)=>{"use strict";n.d(t,{i:()=>c});var r=n(7294),a=n(6136);const o="desktop",i="mobile",l="ssr";function s(){return a.Z.canUseDOM?window.innerWidth>996?o:i:l}function c(){const[e,t]=(0,r.useState)((()=>s()));return(0,r.useEffect)((()=>{function e(){t(s())}return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(undefined)}}),[]),e}},3702:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-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",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:{}}},3734:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>f,_F:()=>m,cE:()=>d,hI:()=>y,lO:()=>h,vY:()=>v,oz:()=>b,s1:()=>g});var r=n(7294),a=n(6775),o=n(8790),i=n(9871),l=n(6409),s=n(4432);function c(e){return Array.from(new Set(e))}var u=n(9003);const d=!!i._r;function f(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=f(t);if(e)return e}}}const p=(e,t)=>void 0!==e&&(0,u.Mg)(e,t);function m(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||((e,t)=>e.some((e=>m(e,t))))(e.items,t))}function g(){var e;const t=(0,s.V)(),{pathname:n}=(0,a.TH)();if(!1===(null==(e=(0,i.gA)())?void 0:e.pluginData.breadcrumbs)||!t)return null;const r=[];return function e(t){for(const a of t)if("category"===a.type&&((0,u.Mg)(a.href,n)||e(a.items))||"link"===a.type&&(0,u.Mg)(a.href,n))return r.push(a),!0;return!1}(t.items),r.reverse()}function h(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>c([t,n,a].filter(Boolean))),[t,n,a])}function b(e,t){const n=h(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(", ")+'".\n Available sidebar ids are:\n - '+Object.keys(t).join("\n- "));return r[1]}),[e,n])}function v(e,t){const n=h(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("DocNavbarItem: 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- '+c(t.map((e=>e.id))).join("\n- "))}return r}),[e,n])}function y(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,l=i.find((e=>(0,a.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,c=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:c}}},5463:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>u,VC:()=>p});var r=n(7294),a=n(6010),o=n(1514),i=n(9656);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(9524),c=n(9962);function u(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const u=function(e){const{siteConfig:t}=(0,c.Z)(),{title:n,titleDelimiter:r}=t;return null!=e&&e.trim().length?e.trim()+" "+r+" "+n:n}(t),{withBaseUrl:d}=(0,s.C)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,u),t&&r.createElement("meta",{property:"og:title",content:u}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o="plugin-"+n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"");const i="plugin-id-"+n.plugin.id;return r.createElement(f,{className:(0,a.Z)(o,i)},t)}},3768:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>c,Ql:()=>s,i6:()=>l,zX:()=>o});var r=n(7294);const a=n(6136).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){var n,r,a,o;super(),this.name="ReactContextError",this.message="Hook "+(null!=(n=null==(r=this.stack)||null==(a=r.split("\n")[1])||null==(o=a.match(/at (?:\w+\.)?(?\w+)/))?void 0:o.groups.name)?n:"")+" is called outside the <"+e+">. "+(null!=t?t:"")}}function s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},9003:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),a=n(997),o=n(9962);function i(e,t){const n=e=>{var t;return null==(t=!e||e.endsWith("/")?e:e+"/")?void 0:t.toLowerCase()};return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>{var t;return null!=(t=e.routes)?t:[]})))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2957:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>s,RF:()=>d});var r=n(7294),a=n(6136),o=n(1048),i=n(3768);const l=r.createContext(void 0);function s(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 r.createElement(l.Provider,{value:n},t)}function c(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const u=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),a=(0,r.useRef)(u()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=u();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"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 a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>null==e.current?void 0:e.current()}}},246:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>a});n(9962);const r="default";function a(e,t){return"docs-"+e+"-"+t}},2560:(e,t,n)=>{"use strict";n.d(t,{W:()=>l,_:()=>s});const r="localStorage";function a(e){if(void 0===e&&(e=r),"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,o||(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),o=!0),null}var t}let o=!1;const i={get:()=>null,set:()=>{},del:()=>{}};function l(e,t){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}}(e);const n=a(null==t?void 0:t.persistence);return null===n?i:{get:()=>{try{return n.getItem(e)}catch(t){return console.error("Docusaurus storage error, can't get key="+e,t),null}},set:t=>{try{n.setItem(e,t)}catch(r){console.error("Docusaurus storage error, can't set "+e+"="+t,r)}},del:()=>{try{n.removeItem(e)}catch(t){console.error("Docusaurus storage error, can't delete key="+e,t)}}}}function s(e){void 0===e&&(e=r);const t=a(e);if(!t)return[];const n=[];for(let r=0;r{"use strict";n.d(t,{l:()=>o});var r=n(9962),a=n(6775);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.Z)(),{pathname:i}=(0,a.TH)(),l=o===n?e:e.replace("/"+o+"/","/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return""+(a?t:"")+function(e){return e===n?""+l:""+l+e+"/"}(r)+s}}}},3266:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6775),o=n(3768);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},107:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(9962);function a(){return(0,r.Z)().siteConfig.themeConfig}},4136:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:e+"/"}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},3905:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var a=n(4136);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>p,PP:()=>L,Ep:()=>f});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(2177);function s(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,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!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;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,g(),w.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={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},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),g=s(n),h=0;h{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=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,a,o,i,l],u=0;(s=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},984:(e,t,n)=>{"use strict";n.r(t)},6930:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;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 a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}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=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(r.barSelector),u=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{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)*a(Math.random()*t,.1,.95)),t=a(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 a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),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 l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=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,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[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===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;function a(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,o){for(var i,l,s=a(e),c=1;c{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);S+=E.value.length,E=E.next){var x=E.value;if(t.length>e.length)return;if(!(x instanceof a)){var _,C=1;if(v){if(!(_=o(k,S,e,b))||_.index>=e.length)break;var T=_.index,L=_.index+_[0].length,A=S;for(A+=E.value.length;T>=A;)A+=(E=E.next).value.length;if(S=A-=E.value.length,E.value instanceof a)continue;for(var P=E;P!==t.tail&&(Ad.reach&&(d.reach=D);var I=E.prev;if(N&&(I=s(t,I,N),S+=N.length),c(t,I,C),E=s(t,I,new a(f,h?r.tokenize(R,h):R,y,R)),O&&s(t,E,O),C>1){var M={cause:f+","+m,reach:D};i(e,t,n,E.prev,S,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function l(){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 s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function c(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.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"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.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:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,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+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},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|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|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|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 a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.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|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.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},a.languages.c.string],char:a.languages.c.char,comment:a.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:a.languages.c}}}}),a.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 a.languages.c.boolean,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"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,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}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={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|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:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.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}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.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:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.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:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.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:a.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"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.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")),a.languages.js=a.languages.javascript,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}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\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})),o=/"(?:[^"\\\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"(?:"+a+"|"+o+")"}))),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(o),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}(a),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,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;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("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),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:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.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:a.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+/},a.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;n0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&p(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var 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,a=r.inside["interpolation-punctuation"],o=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 l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function c(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function u(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,u={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return u[n]=a,n})).join(""),n,r),f=Object.keys(u);return i=0,function e(t){for(var n=0;n=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=c(u[a]),p=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),p){var g=[p];e(g),m.push.apply(m,g)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var h=r.content;Array.isArray(h)?e(h):e([h])}}}(d),new e.Token(r,d,"language-"+r,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 d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=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}(a),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 o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\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:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.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/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[a],d=n.tokenStack[u],f="string"==typeof c?c:c.content,p=t(r,u),m=f.indexOf(p);if(m>-1){++a;var g=f.substring(0,m),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),v=[];g&&v.push.apply(v,i([g])),v.push(h),b&&v.push.apply(v,i([b])),"string"==typeof c?l.splice.apply(l,[s,1].concat(v)):c.content=v}}else c.content&&i(c.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.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"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.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 a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.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:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.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/}),a.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 a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?: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|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)\b/i,{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,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:"shell",aliasTitles:{shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (Scss)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),a=n(9642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),o.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},6500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var l={},s=e[r];if(s){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in a(t,o),l[t]=!0,n[t])l[i]=!0}t(s.require,c),t(s.optional,c),t(s.modify,c)}n[r]=l,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(s);i=i.map(c),l=(l||[]).map(c);var u=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var f,p=r(s),m=u;a(m);){for(var g in f={},m){var h=s[g];t(h&&h.modify,(function(e){e in d&&(f[e]=!0)}))}for(var b in d)if(!(b in u))for(var v in p(b))if(v in u){f[b]=!0;break}for(var y in m=f)u[y]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,l={},s={};function c(e){if(e in l)return l[e];s[e]=!0;var a,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)a=r(e);else{var f=i(u.map((function(e){var t=c(e);return delete s[e],t})));o?a=o(f,(function(){return r(e)})):r(e)}return l[e]=a}for(var u in n)c(u);var d=[];for(var f in s)d.push(l[f]);return i(d)}(p,u,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=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 l.name="Invariant Violation",l}}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:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n