diff --git a/0.2.1.html b/0.2.1.html index d0a167c8..20cb7f70 100644 --- a/0.2.1.html +++ b/0.2.1.html @@ -4,8 +4,8 @@ What is Jellyfish? | Jellyfish - - + +
@@ -16,7 +16,7 @@ For example, one can stream video from its CCTV camera via RTSP to the server, convert it to WebRTC and send it to some web application. In general, there are no limitations. See Example Scenarios for more information.

Jellyfish comes with:

Supported protocols

Jellyfish supports following protocols:

- - + + \ No newline at end of file diff --git a/0.2.1/cluster.html b/0.2.1/cluster.html index ccfebfa6..30a299c8 100644 --- a/0.2.1/cluster.html +++ b/0.2.1/cluster.html @@ -4,8 +4,8 @@ Cluster | Jellyfish - - + +
@@ -46,7 +46,7 @@ for the actual port node B is accessible on.

Example

  1. Let's assume that node's B name is nodeb@192.168.1.2.
  2. Node A will contact EPMD using 192.168.1.2 IP address and port 4369, and ask for the port number used by a node with the name nodeb.
  3. After that, node A can contact node B using 192.168.1.2 IP address and port returned by EPMD.

A couple of notes about EPMD:

You can read more about Erlang Distribution here.

- - + + \ No newline at end of file diff --git a/0.2.1/deploying/fly_io.html b/0.2.1/deploying/fly_io.html index 5867161a..78c9aa82 100644 --- a/0.2.1/deploying/fly_io.html +++ b/0.2.1/deploying/fly_io.html @@ -4,8 +4,8 @@ Fly.io (experimental) | Jellyfish - - + +
@@ -26,7 +26,7 @@ Sometimes the UDP just works, others it takes ages for it to start flowing. This topic describes the exact issue we had with Fly.io.

In general, it is unclear when the UDP traffic starts to be forwarded, sometimes it happens relatively quickly after deployment, sometimes you need to wait for some time.

Also, the Fly.io documentation isn't clear in regard to opening UDP sockets. Some information was gathered experimentally, or based on Fly.io community questions, such as this one.

- - + + \ No newline at end of file diff --git a/0.2.1/deploying/vps.html b/0.2.1/deploying/vps.html index c8145111..5111b270 100644 --- a/0.2.1/deploying/vps.html +++ b/0.2.1/deploying/vps.html @@ -4,8 +4,8 @@ Cloud VPS with cloud-init | Jellyfish - - + +
@@ -43,7 +43,7 @@ You can find logs from the cloud-init run in /var/log/cloud-init-output.log file. done means that your jellyfish server is ready to be used.

If you'd like to keep an eye on the cloud-init process you can use:

cloud-init status --wait

To see the output when the process is finished (successfully or not).

Testing your instance with the Jellyfish dashboard

To see how (or if) your Jellyfish server is working you can test it by connecting our Jellyfish Dashboard with your server. Detailed instructions on how to use Jellyfish Dashboard can be found here.

- - + + \ No newline at end of file diff --git a/0.2.1/examples.html b/0.2.1/examples.html index 59fd9221..4a23f0d9 100644 --- a/0.2.1/examples.html +++ b/0.2.1/examples.html @@ -4,13 +4,13 @@ Examples | Jellyfish - - + +
Skip to main content
Version: 0.2.1

Examples

Jellyfish usage examples utilising server SDKs can be found in the following locations:

- - + + \ No newline at end of file diff --git a/0.2.1/for_developers/api_reference.html b/0.2.1/for_developers/api_reference.html index f843bebe..3fe2c52f 100644 --- a/0.2.1/for_developers/api_reference.html +++ b/0.2.1/for_developers/api_reference.html @@ -4,8 +4,8 @@ API Reference | Jellyfish - - + +
@@ -16,7 +16,7 @@ will be by adding protos to your git repository as a git submodule. You can do it with this command:

git submodule add https://github.com/jellyfish-dev/protos

You could also consider creating a script that will pull the newest changes from the git submodule and compile .proto files to your chosen programming language. For reference, see the script used in our Elixir SDK.

- - + + \ No newline at end of file diff --git a/0.2.1/for_developers/api_reference/rest_api.html b/0.2.1/for_developers/api_reference/rest_api.html index cf57b8e2..d8a58e6e 100644 --- a/0.2.1/for_developers/api_reference/rest_api.html +++ b/0.2.1/for_developers/api_reference/rest_api.html @@ -4,8 +4,8 @@ Rest API | Jellyfish - - + +
@@ -99,7 +99,7 @@

Response samples

Content type
application/json
{
  • "errors": "Token has expired"
}
- - + + \ No newline at end of file diff --git a/0.2.1/for_developers/design_docs.html b/0.2.1/for_developers/design_docs.html index 19f3537e..3211827a 100644 --- a/0.2.1/for_developers/design_docs.html +++ b/0.2.1/for_developers/design_docs.html @@ -4,15 +4,15 @@ Design Docs | Jellyfish - - + +
Skip to main content
Version: 0.2.1

Design Docs

Crucial parts of Jellyfish architecture are always discussed and written down in the form of design documents.

Each design document describes, in a nutshell, a few possible solutions or approaches to some problem and states which solution was accepted and why.

The list of Jellyfish Design Docs is available here.

- - + + \ No newline at end of file diff --git a/0.2.1/getting_started/architecture.html b/0.2.1/getting_started/architecture.html index a922361f..656c6830 100644 --- a/0.2.1/getting_started/architecture.html +++ b/0.2.1/getting_started/architecture.html @@ -4,8 +4,8 @@ Architecture | Jellyfish - - + +
@@ -23,7 +23,7 @@ BE replies with JF IP address it should connect to. Then, the User uses jellyfish-client-sdk to connect to JF. After the connection has been established, the User can send and receive media.

- - + + \ No newline at end of file diff --git a/0.2.1/getting_started/authentication.html b/0.2.1/getting_started/authentication.html index 9826b495..dbf5803a 100644 --- a/0.2.1/getting_started/authentication.html +++ b/0.2.1/getting_started/authentication.html @@ -4,8 +4,8 @@ Authentication | Jellyfish - - + +
@@ -18,7 +18,7 @@ The token encodes both peer and room IDs. The token exchange is handled by our Client SDKs when connecting. Under the hood, Jellyfish expects the token in the first message after opening the Web Socket connection.

Token encodes peer id and room id.

  1. Run Jellyfish
JF_SERVER_API_TOKEN=JF_SERVER_API_TOKEN mix phx.server
  1. Create a room and add one peer
Business Logic
client = Jellyfish.Client.new("http://address-of-your-server.com", "JF_SERVER_API_TOKEN")
{:ok, room, _jellyfish_address} = Jellyfish.Room.create(client, max_peers: 10)
{:ok, peer, peer_token} = Jellyfish.Room.add_peer(client, room.id, "BobId")
  1. Connect as a peer to Jellyfish
Client
client.connect({ 
token: peerToken,
peerMetadata: { name: "Bob" },
isSimulcastOn: false
})
- - + + \ No newline at end of file diff --git a/0.2.1/getting_started/components/hls.html b/0.2.1/getting_started/components/hls.html index 34845ad2..7f3a763f 100644 --- a/0.2.1/getting_started/components/hls.html +++ b/0.2.1/getting_started/components/hls.html @@ -4,8 +4,8 @@ HLS | Jellyfish - - + +
@@ -15,7 +15,7 @@ under http://<jellyfish-address>/hls/<room_id>/index.m3u8 (or https://, if using TLS).

Example Docker commands

The HLS playlist will be created inside the Docker container. To access it from the host, you need to create a volume, e.g. by adding the option -v $(pwd)/jellyfish_output:/app/jellyfish_output to your Docker command.

Other than that, your Docker commands shouldn't be affected by adding this component.

docker run -p 8080:8080/tcp \
-e JF_SERVER_API_TOKEN=token \
-e JF_HOST=localhost:8080 \
-v $(pwd)/jellyfish_output:/app/jellyfish_output \
ghcr.io/jellyfish-dev/jellyfish:0.2.1
- - + + \ No newline at end of file diff --git a/0.2.1/getting_started/components/rtsp.html b/0.2.1/getting_started/components/rtsp.html index 3afe163a..b4c7cfb3 100644 --- a/0.2.1/getting_started/components/rtsp.html +++ b/0.2.1/getting_started/components/rtsp.html @@ -4,8 +4,8 @@ RTSP | Jellyfish - - + +
@@ -21,7 +21,7 @@ RTSP stream source outside of their network when running Jellyfish using Docker.

If you're on macOS and want to receive RTSP streams from behind NAT, right now the only way is to build Jellyfish natively from source.

Explicit port exposure (macOS compatible)

docker run -p 20000:20000/udp \
-p 8080:8080/tcp \
-e JF_SERVER_API_TOKEN=token \
-e JF_HOST=localhost:8080 \
ghcr.io/jellyfish-dev/jellyfish:0.2.1
caution

Make sure that the exposed UDP port matches the one used by the RTSP component (option rtpPort, default: 20000).

If using multiple RTSP components, more ports will need to be exposed.

Using host network (Linux only)

docker run --network=host \
-e JF_SERVER_API_TOKEN=token \
-e JF_HOST=localhost:8080 \
ghcr.io/jellyfish-dev/jellyfish:0.2.1
- - + + \ No newline at end of file diff --git a/0.2.1/getting_started/installation.html b/0.2.1/getting_started/installation.html index dca0c0d8..89bca70c 100644 --- a/0.2.1/getting_started/installation.html +++ b/0.2.1/getting_started/installation.html @@ -4,8 +4,8 @@ Installation | Jellyfish - - + +
@@ -79,7 +79,7 @@ also uses one more service called EPMD that runs on port 4369. This port has to be explicitly exported when running with Docker. Read more in the Cluster section.

- - + + \ No newline at end of file diff --git a/0.2.1/getting_started/metrics.html b/0.2.1/getting_started/metrics.html index 083daf7d..9f818374 100644 --- a/0.2.1/getting_started/metrics.html +++ b/0.2.1/getting_started/metrics.html @@ -4,15 +4,15 @@ Metrics | Jellyfish - - + +
Skip to main content
Version: 0.2.1

Metrics

Jellyfish exports several metrics in the Prometheus format. By default, they are available on port 9568 at /metrics. See JF_METRICS_IP and JF_METRICS_PORT for configuration options.

NameLabelsDescription
jellyfish_traffic_ingress_total_bytesTotal traffic received
jellyfish_traffic_ingress_throughput_bytes_per_secondCurrent throughput for received traffic
jellyfish_traffic_egress_total_bytesTotal traffic sent
jellyfish_traffic_egress_throughput_bytes_per_secondCurrent throughput for sent traffic
jellyfish_roomsAmount of rooms currently present in Jellyfish
jellyfish_room_peersroom_idAmount of peers currently present in a given room
jellyfish_room_peer_time_total_secondsroom_idTotal peer time accumulated for a given room
vm_memory_total_bytesTotal memory used by Erlang Virtual Machine
vm_total_run_queue_lengths_totalNumber of Erlang processes waiting to be executed
vm_total_run_queue_lengths_cpuNumber of Erlang processes waiting to be executed on CPU schedulers
vm_total_run_queue_lengths_ioNumber of Erlang processes waiting to be executed on IO schedulers
- - + + \ No newline at end of file diff --git a/0.2.1/getting_started/notifications.html b/0.2.1/getting_started/notifications.html index 39af33a2..d3b6038c 100644 --- a/0.2.1/getting_started/notifications.html +++ b/0.2.1/getting_started/notifications.html @@ -4,14 +4,14 @@ Notifications | Jellyfish - - + +
Skip to main content
Version: 0.2.1

Notifications

Jellyfish sends server side notifications whenever some important event occurs, e.g.:

  • a room has been created
  • some peer has connected
  • component has crashed
  • etc.

A full list of available notifications is always present in specific server SDK documentation. Here, we present how you can subscribe for server side notifications using Elixir Server SDK:

server_address = "localhost:5002"
server_api_token = "development"

{:ok, notifier} =
Jellyfish.Notifier.start(server_address: server_address, server_api_token: server_api_token)

:ok = Jellyfish.Notifier.subscribe_server_notifications(notifier)
:ok = Jellyfish.Notifier.subscribe_metrics(notifier)

As a result, you should see the following logs on the server side

07:45:02.684 [info] New incoming server WebSocket connection, accepting
07:45:02.688 [info] Server WS authenticated.
- - + + \ No newline at end of file diff --git a/0.2.1/getting_started/peers/webrtc.html b/0.2.1/getting_started/peers/webrtc.html index cc2618c5..451084e6 100644 --- a/0.2.1/getting_started/peers/webrtc.html +++ b/0.2.1/getting_started/peers/webrtc.html @@ -4,8 +4,8 @@ WebRTC | Jellyfish - - + +
@@ -17,7 +17,7 @@ Useful when not using the --network=host option to limit the UDP ports used only to ones published from a Docker container.
  • JF_WEBRTC_TURN_TCP_PORT - port number of TCP TURN
  • Example Docker commands

    Explicit port exposure (macOS compatible)

    docker run -p 50000-50050:50000-50050/udp \
    -p 8080:8080/tcp \
    -e JF_SERVER_API_TOKEN=token \
    -e JF_HOST=localhost:8080 \
    -e JF_WEBRTC_USED=true \
    -e JF_WEBRTC_TURN_PORT_RANGE=50000-50050 \
    -e JF_WEBRTC_TURN_IP=192.168.0.1 \
    -e JF_WEBRTC_TURN_LISTEN_IP=0.0.0.0 \
    ghcr.io/jellyfish-dev/jellyfish:0.2.1
    caution

    Make sure that the exposed UDP ports match JF_WEBRTC_TURN_PORT_RANGE. The range of the ports shouldn't be too wide as it might cause problems with container startup.

    Using host network (Linux only)

    docker run --network=host \
    -e JF_SERVER_API_TOKEN=token \
    -e JF_HOST=localhost:8080 \
    -e JF_WEBRTC_USED=true \
    -e JF_WEBRTC_TURN_IP=192.168.0.1 \
    -e JF_WEBRTC_TURN_LISTEN_IP=0.0.0.0 \
    ghcr.io/jellyfish-dev/jellyfish:0.2.1
    - - + + \ No newline at end of file diff --git a/0.2.1/getting_started/sdks.html b/0.2.1/getting_started/sdks.html index e7c3d914..d73a5e26 100644 --- a/0.2.1/getting_started/sdks.html +++ b/0.2.1/getting_started/sdks.html @@ -4,13 +4,13 @@ SDKs | Jellyfish - - + +
    Skip to main content
    - - + + \ No newline at end of file diff --git a/0.2.1/introduction/basic_concepts.html b/0.2.1/introduction/basic_concepts.html index e42b55a8..be9f40aa 100644 --- a/0.2.1/introduction/basic_concepts.html +++ b/0.2.1/introduction/basic_concepts.html @@ -4,8 +4,8 @@ Basic Concepts | Jellyfish - - + +
    @@ -28,7 +28,7 @@ server. On the other hand, a peer is something that has to connect to the server. Therefore, peers are allowed to open so-called signaling channels to the server. See also Example Scenarios.

    - - + + \ No newline at end of file diff --git a/0.2.1/introduction/example_scenarios.html b/0.2.1/introduction/example_scenarios.html index 0ca033d1..824584bd 100644 --- a/0.2.1/introduction/example_scenarios.html +++ b/0.2.1/introduction/example_scenarios.html @@ -4,8 +4,8 @@ Example Scenarios | Jellyfish - - + +
    @@ -30,7 +30,7 @@ It's not the camera that initializes the connection to the server. Therefore, the RTSP component is a purely server-side thing - once you add it, it should be able to work on its own.

    Multiple IP cameras system architectureMultiple IP cameras system architecture
    - - + + \ No newline at end of file diff --git a/0.2.1/tutorials/dashboard.html b/0.2.1/tutorials/dashboard.html index 883ae92d..02de88e2 100644 --- a/0.2.1/tutorials/dashboard.html +++ b/0.2.1/tutorials/dashboard.html @@ -4,8 +4,8 @@ Jellyfish Dashboard | Jellyfish - - + +
    @@ -44,7 +44,7 @@ You can observe the data with the dynamically generated charts showing what flows through the Jellyfish.

    Internals

    Summary

    Congrats on finishing the tutorial! You should now be able to use the dashboard to its full potential.

    But this was just the beginning. Jellyfish Client API is a powerful tool that allows you to create your own web or mobile multimedia application. Check out the other tutorials to learn more about the Jellyfish Client API and how to use it in your projects.

    You can also take a look at our fully featured Videoroom Demo example:

    Videoroom DemoVideoroom Demo

    It's written in React Native, but it uses the same Jellyfish Client API as the dashboard, so you can learn a lot from it.

    - - + + \ No newline at end of file diff --git a/0.2.1/tutorials/react-native.html b/0.2.1/tutorials/react-native.html index 71a7ed1d..6e07c7dd 100644 --- a/0.2.1/tutorials/react-native.html +++ b/0.2.1/tutorials/react-native.html @@ -4,8 +4,8 @@ React Native | Jellyfish - - + +
    @@ -100,7 +100,7 @@ stats and more to come. Check out our other tutorials to learn about those features.

    You can also take a look at our fully featured Videoroom Demo example:

    Videoroom Demo

    - - + + \ No newline at end of file diff --git a/0.2.1/tutorials/simple-react-app.html b/0.2.1/tutorials/simple-react-app.html index a2741cd2..679eb47c 100644 --- a/0.2.1/tutorials/simple-react-app.html +++ b/0.2.1/tutorials/simple-react-app.html @@ -4,8 +4,8 @@ Simple React App | Jellyfish - - + +
    @@ -62,7 +62,7 @@ stats and more to come. Check out our other tutorials to learn about those features.

    You can also take a look at our fully featured Videoroom Demo example:

    Videoroom DemoVideoroom Demo

    - - + + \ No newline at end of file diff --git a/404.html b/404.html index f30f4ef5..e07d4def 100644 --- a/404.html +++ b/404.html @@ -4,13 +4,13 @@ Page Not Found | Jellyfish - - + +
    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/f2711dff.35c7d21c.js b/assets/js/f2711dff.35c7d21c.js new file mode 100644 index 00000000..48c284da --- /dev/null +++ b/assets/js/f2711dff.35c7d21c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkjellyfish_docs=self.webpackChunkjellyfish_docs||[]).push([[5521],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>h});var i=t(7294);function l(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);n&&(i=i.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,i)}return t}function r(e){for(var n=1;n=0||(l[t]=e[t]);return l}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var s=i.createContext({}),u=function(e){var n=i.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},p=function(e){var n=u(e.components);return i.createElement(s.Provider,{value:n},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return i.createElement(i.Fragment,{},n)}},m=i.forwardRef((function(e,n){var t=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),d=u(t),m=l,h=d["".concat(s,".").concat(m)]||d[m]||c[m]||a;return t?i.createElement(h,r(r({ref:n},p),{},{components:t})):i.createElement(h,r({ref:n},p))}));function h(e,n){var t=arguments,l=n&&n.mdxType;if("string"==typeof e||l){var a=t.length,r=new Array(a);r[0]=m;var o={};for(var s in n)hasOwnProperty.call(n,s)&&(o[s]=n[s]);o.originalType=e,o[d]="string"==typeof e?e:l,r[1]=o;for(var u=2;u{t.d(n,{Z:()=>r});var i=t(7294),l=t(6010);const a={tabItem:"tabItem_Ymn6"};function r(e){let{children:n,hidden:t,className:r}=e;return i.createElement("div",{role:"tabpanel",className:(0,l.Z)(a.tabItem,r),hidden:t},n)}},4866:(e,n,t)=>{t.d(n,{Z:()=>v});var i=t(7462),l=t(7294),a=t(6010),r=t(2466),o=t(6550),s=t(1980),u=t(7392),p=t(12);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:n,label:t,attributes:i,default:l}}=e;return{value:n,label:t,attributes:i,default:l}}))}function c(e){const{values:n,children:t}=e;return(0,l.useMemo)((()=>{const e=n??d(t);return function(e){const n=(0,u.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function h(e){let{queryString:n=!1,groupId:t}=e;const i=(0,o.k6)(),a=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,s._X)(a),(0,l.useCallback)((e=>{if(!a)return;const n=new URLSearchParams(i.location.search);n.set(a,e),i.replace({...i.location,search:n.toString()})}),[a,i])]}function f(e){const{defaultValue:n,queryString:t=!1,groupId:i}=e,a=c(e),[r,o]=(0,l.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const i=t.find((e=>e.default))??t[0];if(!i)throw new Error("Unexpected error: 0 tabValues");return i.value}({defaultValue:n,tabValues:a}))),[s,u]=h({queryString:t,groupId:i}),[d,f]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,a]=(0,p.Nk)(t);return[i,(0,l.useCallback)((e=>{t&&a.set(e)}),[t,a])]}({groupId:i}),k=(()=>{const e=s??d;return m({value:e,tabValues:a})?e:null})();(0,l.useLayoutEffect)((()=>{k&&o(k)}),[k]);return{selectedValue:r,selectValue:(0,l.useCallback)((e=>{if(!m({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),f(e)}),[u,f,a]),tabValues:a}}var k=t(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:n,block:t,selectedValue:o,selectValue:s,tabValues:u}=e;const p=[],{blockElementScrollPositionUntilNextRender:d}=(0,r.o5)(),c=e=>{const n=e.currentTarget,t=p.indexOf(n),i=u[t].value;i!==o&&(d(n),s(i))},m=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=p.indexOf(e.currentTarget)+1;n=p[t]??p[0];break}case"ArrowLeft":{const t=p.indexOf(e.currentTarget)-1;n=p[t]??p[p.length-1];break}}n?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.Z)("tabs",{"tabs--block":t},n)},u.map((e=>{let{value:n,label:t,attributes:r}=e;return l.createElement("li",(0,i.Z)({role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,key:n,ref:e=>p.push(e),onKeyDown:m,onClick:c},r,{className:(0,a.Z)("tabs__item",b.tabItem,r?.className,{"tabs__item--active":o===n})}),t??n)})))}function y(e){let{lazy:n,children:t,selectedValue:i}=e;const a=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=a.find((e=>e.props.value===i));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},a.map(((e,n)=>(0,l.cloneElement)(e,{key:n,hidden:e.props.value!==i}))))}function g(e){const n=f(e);return l.createElement("div",{className:(0,a.Z)("tabs-container",b.tabList)},l.createElement(N,(0,i.Z)({},e,n)),l.createElement(y,(0,i.Z)({},e,n)))}function v(e){const n=(0,k.Z)();return l.createElement(g,(0,i.Z)({key:String(n)},e))}},332:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>u,toc:()=>d});var i=t(7462),l=(t(7294),t(3905)),a=t(4866),r=t(5162);const o={},s="Installation",u={unversionedId:"getting_started/installation",id:"getting_started/installation",title:"Installation",description:"There are two ways of running Jellyfish:",source:"@site/docs/getting_started/installation.md",sourceDirName:"getting_started",slug:"/getting_started/installation",permalink:"/jellyfish-docs/next/getting_started/installation",draft:!1,editUrl:"https://github.com/jellyfish-dev/jellyfish-docs/docs/getting_started/installation.md",tags:[],version:"current",frontMatter:{},sidebar:"mainSidebar",previous:{title:"Example Scenarios",permalink:"/jellyfish-docs/next/introduction/example_scenarios"},next:{title:"Architecture",permalink:"/jellyfish-docs/next/getting_started/architecture"}},p={},d=[{value:"Building from source",id:"building-from-source",level:2},{value:"Running with Docker",id:"running-with-docker",level:2},{value:"Environment variables",id:"environment-variables",level:2},{value:"Required in production:",id:"required-in-production",level:4},{value:"Optional:",id:"optional",level:4},{value:"Distribution:",id:"distribution",level:4},{value:"Distribution NODES_LIST specific:",id:"distribution-nodes_list-specific",level:6},{value:"Distribution DNS specific:",id:"distribution-dns-specific",level:6}],c={toc:d},m="wrapper";function h(e){let{components:n,...t}=e;return(0,l.kt)(m,(0,i.Z)({},c,t,{components:n,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"installation"},"Installation"),(0,l.kt)("p",null,"There are two ways of running Jellyfish:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"building from source (requires Elixir and native dependencies)"),(0,l.kt)("li",{parentName:"ul"},"using Jellyfish Docker images")),(0,l.kt)("p",null,"At the moment, Jellyfish doesn't provide pre-built binaries."),(0,l.kt)("h2",{id:"building-from-source"},"Building from source"),(0,l.kt)("p",null,"Make sure to have both Elixir and Rust installed. Check the links below for instructions:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://elixir-lang.org/install.html"},"Elixir")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://rustup.rs"},"Rust"))),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"Clone the Jellyfish repo")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"git clone https://github.com/jellyfish-dev/jellyfish.git\n")),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"Install native dependencies")),(0,l.kt)(a.Z,{mdxType:"Tabs"},(0,l.kt)(r.Z,{value:"mac-intel",label:"macOS Intel",default:!0,mdxType:"TabItem"},"These instructions assume you have Homebrew installed. You can get it ",(0,l.kt)("a",{href:"https://brew.sh"},"here"),".",(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},'brew install srtp libnice clang-format ffmpeg opus pkg-config\nexport LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"\nexport CFLAGS="-I/usr/local/opt/openssl@1.1/include/"\nexport CPPFLAGS="-I/usr/local/opt/openssl@1.1/include/"\nexport PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig"\n'))),(0,l.kt)(r.Z,{value:"mac-m1",label:"macOS Apple Silicon",default:!0,mdxType:"TabItem"},"These instructions assume you have Homebrew installed. You can get it ",(0,l.kt)("a",{href:"https://brew.sh"},"here"),".",(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"brew install srtp libnice clang-format ffmpeg opus\nexport C_INCLUDE_PATH=/opt/homebrew/Cellar/libnice/0.1.18/include:/opt/homebrew/Cellar/opus/1.3.1/include:/opt/homebrew/Cellar/openssl@1.1/1.1.1l_1/include\nexport LIBRARY_PATH=/opt/homebrew/Cellar/opus/1.3.1/lib\nexport PKG_CONFIG_PATH=/opt/homebrew/Cellar/openssl@1.1/1.1.1l_1/lib/pkgconfig/\n"))),(0,l.kt)(r.Z,{value:"ubuntu",label:"Ubuntu",default:!0,mdxType:"TabItem"},(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"sudo apt install pkg-config libsrtp2-dev libnice-dev libavcodec-dev libavformat-dev libavutil-dev libopus-dev libfdk-aac-dev\n")))),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"Install elixir dependencies")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"mix deps.get\n")),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"Run the server in development")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"mix phx.server\n")),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"Create a binary")),(0,l.kt)("p",null,"You can also create Jellyfish binary with:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"MIX_ENV=prod mix release\n")),(0,l.kt)("p",null,"Then follow instructions printed in your terminal."),(0,l.kt)("admonition",{type:"info"},(0,l.kt)("p",{parentName:"admonition"},"The difference between running with ",(0,l.kt)("inlineCode",{parentName:"p"},"mix phx.server")," and generating target\nbinary is that the latter is prepared for running in production so e.g.\nit includes some Erlang Virtual Machine tweaks.\nJellyfish Dockerfile always uses ",(0,l.kt)("inlineCode",{parentName:"p"},"mix release")," under the hood.")),(0,l.kt)("h2",{id:"running-with-docker"},"Running with Docker"),(0,l.kt)("p",null,"Docker images are built for production which means that you always\nneed to set a couple of ",(0,l.kt)("a",{parentName:"p",href:"#environment-variables"},"environment variables"),"."),(0,l.kt)("p",null,"An example docker command running bare Jellyfish HTTP service locally:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"docker run -p 8080:8080/tcp -e JF_HOST=localhost:8080 -e JF_SERVER_API_TOKEN=token ghcr.io/jellyfish-dev/jellyfish:0.3.0\n")),(0,l.kt)("p",null,"Note that in real case scenarios, docker commands depend on peers/components you are going to use.\nTherefore, we don't present them here but rather in each peer/component's documentation.\nAs an example see ",(0,l.kt)("a",{parentName:"p",href:"./peers/webrtc#example-docker-commands"},"WebRTC Peer"),"."),(0,l.kt)("p",null,"For the full list of Jellyfish Docker images, ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/jellyfish-dev/jellyfish/pkgs/container/jellyfish"},"see this page"),"."),(0,l.kt)("admonition",{type:"tip"},(0,l.kt)("p",{parentName:"admonition"},"Instead of passing environmental variables manually, you can use the ",(0,l.kt)("inlineCode",{parentName:"p"},"--env-file ./env-file")," flag,\nwhere the ",(0,l.kt)("inlineCode",{parentName:"p"},"env-file")," is a file containing the variables that the image expects,\nsee example file ",(0,l.kt)("inlineCode",{parentName:"p"},".env.sample")," in the Jellyfish repository.")),(0,l.kt)("h2",{id:"environment-variables"},"Environment variables"),(0,l.kt)("p",null,"Environment variables are split into two groups:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"general ones - presented below"),(0,l.kt)("li",{parentName:"ul"},"peer/component-specific - each Peer and Component can expose its own environment variables.\nThey are always listed in a Peer/Component description.\nSee the list of ",(0,l.kt)("a",{parentName:"li",href:"/jellyfish-docs/next/getting_started/peers/webrtc"},"Peers")," and ",(0,l.kt)("a",{parentName:"li",href:"/jellyfish-docs/next/getting_started/components/hls"},"Components"),".")),(0,l.kt)("p",null,"Below there are general, Jellyfish environment variables.\nIf you are running Jellyfish in development, you don't need to\nset any of them."),(0,l.kt)("h4",{id:"required-in-production"},"Required in production:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_SERVER_API_TOKEN")," - token for authorizing HTTP requests.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"development")," for development builds."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_HOST")," - defines how Jellyfish should be seen from the outside.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_IP:JF_PORT"),".",(0,l.kt)("br",null),"\nIt can be in the form of ",(0,l.kt)("inlineCode",{parentName:"li"},"ip:port"),", ",(0,l.kt)("inlineCode",{parentName:"li"},"domain:port")," or simply ",(0,l.kt)("inlineCode",{parentName:"li"},"domain"),".\nUseful when hosting Jellyfish behind proxy.\nIt is returned e.g. when creating a new room.\nWhen running with Docker, ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_IP")," is set to ",(0,l.kt)("inlineCode",{parentName:"li"},"0.0.0.0"),"\nmaking the default value of ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_HOST")," incorrect.\nTherefore, for Docker, you have to set ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_HOST")," manually.\nFor running Docker locally, it can simply be ",(0,l.kt)("inlineCode",{parentName:"li"},"localhost:8080"),".")),(0,l.kt)("h4",{id:"optional"},"Optional:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_IP")," - an ip address to run the HTTP server on.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"127.0.0.1")," when running from source or using ",(0,l.kt)("inlineCode",{parentName:"li"},"mix release"),", or ",(0,l.kt)("inlineCode",{parentName:"li"},"0.0.0.0")," for Docker."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_PORT")," - port to run the HTTP server on.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"5002")," for development builds and ",(0,l.kt)("inlineCode",{parentName:"li"},"8080")," for production builds (",(0,l.kt)("inlineCode",{parentName:"li"},"mix release")," or Docker)."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_SSL_KEY_PATH")," - an absolute path to the SSL key.\nWhen both ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_SSL_KEY_PATH")," and ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_SSL_CERT_PATH")," are set, Jellyfish will\nrun HTTPS server instead of HTTP one.\nAn address where this server listens to is still configured via ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_IP")," and ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_PORT"),"."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_SSL_CERT_PATH")," - an absolute path the the SSL certificate.\nWhen both ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_SSL_KEY_PATH")," and ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_SSL_CERT_PATH")," are set, Jellyfish will\nrun HTTPS server instead of HTTP one.\nAn address where this server listens to is still configured via ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_IP")," and ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_PORT"),"."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_SECRET_KEY_BASE")," - used to sign/encrypt tokens generated for Peers.\nGenerated if not provided."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_CHECK_ORIGIN")," - defines if Jellyfish will check the origin of incoming requests and socket connection. ",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"true"),".",(0,l.kt)("br",null),"\nPossible values are ",(0,l.kt)("inlineCode",{parentName:"li"},"true"),", ",(0,l.kt)("inlineCode",{parentName:"li"},"false")," or a space-separated list of allowed origins (wildcards are allowed). ",(0,l.kt)("br",null),"\nExample: ",(0,l.kt)("inlineCode",{parentName:"li"},'JF_CHECK_ORIGIN="https://example.com //another.com:888 //*.other.com"')),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_RESOURCES_BASE_PATH")," - a base path where Jellyfish multimedia files are stored",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"./jellyfish_resources/"),".",(0,l.kt)("br",null),"\nWhen running via docker, the directory can be mounted as ",(0,l.kt)("inlineCode",{parentName:"li"},"-v $(pwd)/host_directory:/app/jellyfish_resources"),"."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_METRICS_IP")," - an IP address to run metrics endpoint on.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"127.0.0.1")," when running from source or using ",(0,l.kt)("inlineCode",{parentName:"li"},"mix release"),", or ",(0,l.kt)("inlineCode",{parentName:"li"},"0.0.0.0")," for Docker."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_METRICS_PORT")," - a port to run metrics endpoint on.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"9568"),"."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"MIX_ENV")," - defines compilation environment.\nThis variable takes effect only when running from the source.\nDocker images are always built with ",(0,l.kt)("inlineCode",{parentName:"li"},"MIX_ENV=prod"),".\nPossible values are:",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"dev")," - uses default values for environment variables\n(default option when running with ",(0,l.kt)("inlineCode",{parentName:"li"},"mix phx.server"),")"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"prod")," - requires that you provide values for environment variables"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"test")," - used in tests")))),(0,l.kt)("h4",{id:"distribution"},"Distribution:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_ENABLED")," - whether to run Jellyfish in a cluster.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"false"),"."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_STRATEGY_NAME")," - specify which clustering strategy to use.",(0,l.kt)("br",null),"\nPossible values are ",(0,l.kt)("inlineCode",{parentName:"li"},"DNS")," or ",(0,l.kt)("inlineCode",{parentName:"li"},"NODES_LIST"),".\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"NODES_LIST"),"."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_NODE_NAME")," - Node name used in a cluster.\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"jellyfish@(hostname)"),". ",(0,l.kt)("br",null),"\nIt consists of two parts - nodename@hostname.\nThe first part identifies a node on a single machine and can\nbe any string.\nThe second part identifies the host machine jellyfish runs on and has to be resolvable.\nIts format depends on ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_MODE"),".\nIf ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_MODE")," is set to ",(0,l.kt)("inlineCode",{parentName:"li"},"name"),", the ",(0,l.kt)("inlineCode",{parentName:"li"},"hostname")," has to be an IP address or FQDN.\nIf ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_MODE")," is set to ",(0,l.kt)("inlineCode",{parentName:"li"},"sname"),", the ",(0,l.kt)("inlineCode",{parentName:"li"},"hostname")," can be any string.\nIf you run a cluster using ",(0,l.kt)("inlineCode",{parentName:"li"},"DNS")," strategy, every Jellyfish instance must have ",(0,l.kt)("inlineCode",{parentName:"li"},"nodename")," set to the same value.\nIf ",(0,l.kt)("inlineCode",{parentName:"li"},"hostname")," is not an IP address, it will be automatically resolved as DNS strategy requires\nnode names to use IP addresses.\nThis also means that ",(0,l.kt)("inlineCode",{parentName:"li"},"DNS")," strategy has to be run with ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_MODE")," set to ",(0,l.kt)("inlineCode",{parentName:"li"},"name"),".\nSee our ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/jellyfish-dev/jellyfish/blob/main/docker-compose-epmd.yaml"},"docker-compose-epmd.yaml")," or ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/jellyfish-dev/jellyfish/blob/main/docker-compose-dns.yaml"},"docker-compose-dns.yaml"),", which we use in our integration tests or refer to ",(0,l.kt)("a",{parentName:"li",href:"/jellyfish-docs/next/cluster"},"Cluster")," section for examples."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_MODE")," - distribution mode - can be ",(0,l.kt)("inlineCode",{parentName:"li"},"name")," or ",(0,l.kt)("inlineCode",{parentName:"li"},"sname"),".",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"sname"),".",(0,l.kt)("br",null),"\nWhen using ",(0,l.kt)("inlineCode",{parentName:"li"},"name"),", your hostname has to be an IP address or FQDN of a machine Jellyfish runs on.\nWhen using ",(0,l.kt)("inlineCode",{parentName:"li"},"sname"),", your hostname can be any string.\nSee ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_NODE_NAME")," for more information."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_COOKIE")," - used to group Jellyfishes in a cluster.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"jellyfish_cookie"),".",(0,l.kt)("br",null),"\nUse different cookies to create multiple clusters on the same machine.",(0,l.kt)("br",null),(0,l.kt)("strong",{parentName:"li"},"Important"),": cookie does not provide any cryptographic security.\nIts only purpose is to prevent a node from connecting to a cluster with which\nit is not intended to communicate."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_MIN_PORT"),"- minimal port used by Jellyfish when forming a cluster\n(connecting to other Jellyfishes).",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"9000")," when running with Docker.",(0,l.kt)("br",null),"\nOnly available when running with Docker or ",(0,l.kt)("inlineCode",{parentName:"li"},"mix release"),"."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_MAX_PORT"),"- maximal port used by Jellyfish when forming a cluster\n(connecting to other Jellyfishes).",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"9000")," when running with Docker.",(0,l.kt)("br",null),"\nOnly available when running with Docker or ",(0,l.kt)("inlineCode",{parentName:"li"},"mix release"),".")),(0,l.kt)("h6",{id:"distribution-nodes_list-specific"},"Distribution NODES_LIST specific:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_NODES")," - space-separated list of other Jellyfishes to connect to.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},'""'),".",(0,l.kt)("br",null),"\nExample: ",(0,l.kt)("inlineCode",{parentName:"li"},'JF_DIST_NODES="jellyfish1@127.0.0.1 jellyfish2@127.0.0.1"'),".",(0,l.kt)("br",null),"\nThis list can also include ourselves so that you can pass the same value\nto every Jellyfish.\nNote: Jellyfish connection to other Jellyfish is transitive meaning that\nwhen you connect to one Jellyfish you also connect to all other Jellyfishes\nthis one was connected to.")),(0,l.kt)("h6",{id:"distribution-dns-specific"},"Distribution DNS specific:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_QUERY")," - query sent to DNS to discover other Jellyfishes. ",(0,l.kt)("br",null),"\nReturned list of IPs from DNS is used for creating distribution node name in the format ",(0,l.kt)("inlineCode",{parentName:"li"},"@"),". "),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_POLLING_INTERVAL")," - DNS polling interval in ms. ",(0,l.kt)("br",null),"\nDefault value is 5000.")),(0,l.kt)("admonition",{type:"tip"},(0,l.kt)("p",{parentName:"admonition"},"You can use a single port to form a cluster, even if a cluster consists of\nmore than two Jellyfishes. ")),(0,l.kt)("admonition",{type:"caution"},(0,l.kt)("p",{parentName:"admonition"},"Besides ports specified using ",(0,l.kt)("inlineCode",{parentName:"p"},"JF_DIST_MIN_PORT")," and ",(0,l.kt)("inlineCode",{parentName:"p"},"JF_DIST_MAX_PORT"),", Jellyfish\nalso uses one more service called EPMD that runs on port 4369.\nThis port has to be explicitly exported when running with Docker.\nRead more in the ",(0,l.kt)("a",{parentName:"p",href:"/jellyfish-docs/next/cluster"},"Cluster")," section.")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f2711dff.4e32270e.js b/assets/js/f2711dff.4e32270e.js deleted file mode 100644 index a6cd7d77..00000000 --- a/assets/js/f2711dff.4e32270e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkjellyfish_docs=self.webpackChunkjellyfish_docs||[]).push([[5521],{3905:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>h});var i=t(7294);function l(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);n&&(i=i.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,i)}return t}function r(e){for(var n=1;n=0||(l[t]=e[t]);return l}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(l[t]=e[t])}return l}var s=i.createContext({}),u=function(e){var n=i.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):r(r({},n),e)),t},p=function(e){var n=u(e.components);return i.createElement(s.Provider,{value:n},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var n=e.children;return i.createElement(i.Fragment,{},n)}},m=i.forwardRef((function(e,n){var t=e.components,l=e.mdxType,a=e.originalType,s=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),d=u(t),m=l,h=d["".concat(s,".").concat(m)]||d[m]||c[m]||a;return t?i.createElement(h,r(r({ref:n},p),{},{components:t})):i.createElement(h,r({ref:n},p))}));function h(e,n){var t=arguments,l=n&&n.mdxType;if("string"==typeof e||l){var a=t.length,r=new Array(a);r[0]=m;var o={};for(var s in n)hasOwnProperty.call(n,s)&&(o[s]=n[s]);o.originalType=e,o[d]="string"==typeof e?e:l,r[1]=o;for(var u=2;u{t.d(n,{Z:()=>r});var i=t(7294),l=t(6010);const a={tabItem:"tabItem_Ymn6"};function r(e){let{children:n,hidden:t,className:r}=e;return i.createElement("div",{role:"tabpanel",className:(0,l.Z)(a.tabItem,r),hidden:t},n)}},4866:(e,n,t)=>{t.d(n,{Z:()=>v});var i=t(7462),l=t(7294),a=t(6010),r=t(2466),o=t(6550),s=t(1980),u=t(7392),p=t(12);function d(e){return function(e){return l.Children.map(e,(e=>{if(!e||(0,l.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}(e).map((e=>{let{props:{value:n,label:t,attributes:i,default:l}}=e;return{value:n,label:t,attributes:i,default:l}}))}function c(e){const{values:n,children:t}=e;return(0,l.useMemo)((()=>{const e=n??d(t);return function(e){const n=(0,u.l)(e,((e,n)=>e.value===n.value));if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[n,t])}function m(e){let{value:n,tabValues:t}=e;return t.some((e=>e.value===n))}function h(e){let{queryString:n=!1,groupId:t}=e;const i=(0,o.k6)(),a=function(e){let{queryString:n=!1,groupId:t}=e;if("string"==typeof n)return n;if(!1===n)return null;if(!0===n&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:n,groupId:t});return[(0,s._X)(a),(0,l.useCallback)((e=>{if(!a)return;const n=new URLSearchParams(i.location.search);n.set(a,e),i.replace({...i.location,search:n.toString()})}),[a,i])]}function f(e){const{defaultValue:n,queryString:t=!1,groupId:i}=e,a=c(e),[r,o]=(0,l.useState)((()=>function(e){let{defaultValue:n,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(n){if(!m({value:n,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${n}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return n}const i=t.find((e=>e.default))??t[0];if(!i)throw new Error("Unexpected error: 0 tabValues");return i.value}({defaultValue:n,tabValues:a}))),[s,u]=h({queryString:t,groupId:i}),[d,f]=function(e){let{groupId:n}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(n),[i,a]=(0,p.Nk)(t);return[i,(0,l.useCallback)((e=>{t&&a.set(e)}),[t,a])]}({groupId:i}),k=(()=>{const e=s??d;return m({value:e,tabValues:a})?e:null})();(0,l.useLayoutEffect)((()=>{k&&o(k)}),[k]);return{selectedValue:r,selectValue:(0,l.useCallback)((e=>{if(!m({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);o(e),u(e),f(e)}),[u,f,a]),tabValues:a}}var k=t(2389);const b={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};function N(e){let{className:n,block:t,selectedValue:o,selectValue:s,tabValues:u}=e;const p=[],{blockElementScrollPositionUntilNextRender:d}=(0,r.o5)(),c=e=>{const n=e.currentTarget,t=p.indexOf(n),i=u[t].value;i!==o&&(d(n),s(i))},m=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=p.indexOf(e.currentTarget)+1;n=p[t]??p[0];break}case"ArrowLeft":{const t=p.indexOf(e.currentTarget)-1;n=p[t]??p[p.length-1];break}}n?.focus()};return l.createElement("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.Z)("tabs",{"tabs--block":t},n)},u.map((e=>{let{value:n,label:t,attributes:r}=e;return l.createElement("li",(0,i.Z)({role:"tab",tabIndex:o===n?0:-1,"aria-selected":o===n,key:n,ref:e=>p.push(e),onKeyDown:m,onClick:c},r,{className:(0,a.Z)("tabs__item",b.tabItem,r?.className,{"tabs__item--active":o===n})}),t??n)})))}function y(e){let{lazy:n,children:t,selectedValue:i}=e;const a=(Array.isArray(t)?t:[t]).filter(Boolean);if(n){const e=a.find((e=>e.props.value===i));return e?(0,l.cloneElement)(e,{className:"margin-top--md"}):null}return l.createElement("div",{className:"margin-top--md"},a.map(((e,n)=>(0,l.cloneElement)(e,{key:n,hidden:e.props.value!==i}))))}function g(e){const n=f(e);return l.createElement("div",{className:(0,a.Z)("tabs-container",b.tabList)},l.createElement(N,(0,i.Z)({},e,n)),l.createElement(y,(0,i.Z)({},e,n)))}function v(e){const n=(0,k.Z)();return l.createElement(g,(0,i.Z)({key:String(n)},e))}},332:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>s,default:()=>h,frontMatter:()=>o,metadata:()=>u,toc:()=>d});var i=t(7462),l=(t(7294),t(3905)),a=t(4866),r=t(5162);const o={},s="Installation",u={unversionedId:"getting_started/installation",id:"getting_started/installation",title:"Installation",description:"There are two ways of running Jellyfish:",source:"@site/docs/getting_started/installation.md",sourceDirName:"getting_started",slug:"/getting_started/installation",permalink:"/jellyfish-docs/next/getting_started/installation",draft:!1,editUrl:"https://github.com/jellyfish-dev/jellyfish-docs/docs/getting_started/installation.md",tags:[],version:"current",frontMatter:{},sidebar:"mainSidebar",previous:{title:"Example Scenarios",permalink:"/jellyfish-docs/next/introduction/example_scenarios"},next:{title:"Architecture",permalink:"/jellyfish-docs/next/getting_started/architecture"}},p={},d=[{value:"Building from source",id:"building-from-source",level:2},{value:"Running with Docker",id:"running-with-docker",level:2},{value:"Environment variables",id:"environment-variables",level:2},{value:"Required in production:",id:"required-in-production",level:4},{value:"Optional:",id:"optional",level:4},{value:"Distribution:",id:"distribution",level:4},{value:"Distribution NODES_LIST specific:",id:"distribution-nodes_list-specific",level:6},{value:"Distribution DNS specific:",id:"distribution-dns-specific",level:6}],c={toc:d},m="wrapper";function h(e){let{components:n,...t}=e;return(0,l.kt)(m,(0,i.Z)({},c,t,{components:n,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"installation"},"Installation"),(0,l.kt)("p",null,"There are two ways of running Jellyfish:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"building from source (requires Elixir and native dependencies)"),(0,l.kt)("li",{parentName:"ul"},"using Jellyfish Docker images")),(0,l.kt)("p",null,"At the moment, Jellyfish doesn't provide pre-built binaries."),(0,l.kt)("h2",{id:"building-from-source"},"Building from source"),(0,l.kt)("p",null,"Make sure to have both Elixir and Rust installed. Check the links below for instructions:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://elixir-lang.org/install.html"},"Elixir")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://rustup.rs"},"Rust"))),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"Clone the Jellyfish repo")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"git clone https://github.com/jellyfish-dev/jellyfish.git\n")),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"Install native dependencies")),(0,l.kt)(a.Z,{mdxType:"Tabs"},(0,l.kt)(r.Z,{value:"mac-intel",label:"macOS Intel",default:!0,mdxType:"TabItem"},"These instructions assume you have Homebrew installed. You can get it ",(0,l.kt)("a",{href:"https://brew.sh"},"here"),".",(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},'brew install srtp libnice clang-format ffmpeg opus pkg-config\nexport LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"\nexport CFLAGS="-I/usr/local/opt/openssl@1.1/include/"\nexport CPPFLAGS="-I/usr/local/opt/openssl@1.1/include/"\nexport PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig"\n'))),(0,l.kt)(r.Z,{value:"mac-m1",label:"macOS Apple Silicon",default:!0,mdxType:"TabItem"},"These instructions assume you have Homebrew installed. You can get it ",(0,l.kt)("a",{href:"https://brew.sh"},"here"),".",(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"brew install srtp libnice clang-format ffmpeg opus\nexport C_INCLUDE_PATH=/opt/homebrew/Cellar/libnice/0.1.18/include:/opt/homebrew/Cellar/opus/1.3.1/include:/opt/homebrew/Cellar/openssl@1.1/1.1.1l_1/include\nexport LIBRARY_PATH=/opt/homebrew/Cellar/opus/1.3.1/lib\nexport PKG_CONFIG_PATH=/opt/homebrew/Cellar/openssl@1.1/1.1.1l_1/lib/pkgconfig/\n"))),(0,l.kt)(r.Z,{value:"ubuntu",label:"Ubuntu",default:!0,mdxType:"TabItem"},(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"sudo apt install pkg-config libsrtp2-dev libnice-dev libavcodec-dev libavformat-dev libavutil-dev libopus-dev libfdk-aac-dev\n")))),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"Install elixir dependencies")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"mix deps.get\n")),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"Run the server in development")),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"mix phx.server\n")),(0,l.kt)("p",null,(0,l.kt)("strong",{parentName:"p"},"Create a binary")),(0,l.kt)("p",null,"You can also create Jellyfish binary with:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre"},"MIX_ENV=prod mix release\n")),(0,l.kt)("p",null,"Then follow instructions printed in your terminal."),(0,l.kt)("admonition",{type:"info"},(0,l.kt)("p",{parentName:"admonition"},"The difference between running with ",(0,l.kt)("inlineCode",{parentName:"p"},"mix phx.server")," and generating target\nbinary is that the latter is prepared for running in production so e.g.\nit includes some Erlang Virtual Machine tweaks.\nJellyfish Dockerfile always uses ",(0,l.kt)("inlineCode",{parentName:"p"},"mix release")," under the hood.")),(0,l.kt)("h2",{id:"running-with-docker"},"Running with Docker"),(0,l.kt)("p",null,"Docker images are built for production which means that you always\nneed to set a couple of ",(0,l.kt)("a",{parentName:"p",href:"#environment-variables"},"environment variables"),"."),(0,l.kt)("p",null,"An example docker command running bare Jellyfish HTTP service locally:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-bash"},"docker run -p 8080:8080/tcp -e JF_HOST=localhost:8080 JF_SERVER_API_TOKEN=token ghcr.io/jellyfish-dev/jellyfish:0.3.0\n")),(0,l.kt)("p",null,"Note that in real case scenarios, docker commands depend on peers/components you are going to use.\nTherefore, we don't present them here but rather in each peer/component's documentation.\nAs an example see ",(0,l.kt)("a",{parentName:"p",href:"./peers/webrtc#example-docker-commands"},"WebRTC Peer"),"."),(0,l.kt)("p",null,"For the full list of Jellyfish Docker images, ",(0,l.kt)("a",{parentName:"p",href:"https://github.com/jellyfish-dev/jellyfish/pkgs/container/jellyfish"},"see this page"),"."),(0,l.kt)("admonition",{type:"tip"},(0,l.kt)("p",{parentName:"admonition"},"Instead of passing environmental variables manually, you can use the ",(0,l.kt)("inlineCode",{parentName:"p"},"--env-file ./env-file")," flag,\nwhere the ",(0,l.kt)("inlineCode",{parentName:"p"},"env-file")," is a file containing the variables that the image expects,\nsee example file ",(0,l.kt)("inlineCode",{parentName:"p"},".env.sample")," in the Jellyfish repository.")),(0,l.kt)("h2",{id:"environment-variables"},"Environment variables"),(0,l.kt)("p",null,"Environment variables are split into two groups:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"general ones - presented below"),(0,l.kt)("li",{parentName:"ul"},"peer/component-specific - each Peer and Component can expose its own environment variables.\nThey are always listed in a Peer/Component description.\nSee the list of ",(0,l.kt)("a",{parentName:"li",href:"/jellyfish-docs/next/getting_started/peers/webrtc"},"Peers")," and ",(0,l.kt)("a",{parentName:"li",href:"/jellyfish-docs/next/getting_started/components/hls"},"Components"),".")),(0,l.kt)("p",null,"Below there are general, Jellyfish environment variables.\nIf you are running Jellyfish in development, you don't need to\nset any of them."),(0,l.kt)("h4",{id:"required-in-production"},"Required in production:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_SERVER_API_TOKEN")," - token for authorizing HTTP requests.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"development")," for development builds."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_HOST")," - defines how Jellyfish should be seen from the outside.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_IP:JF_PORT"),".",(0,l.kt)("br",null),"\nIt can be in the form of ",(0,l.kt)("inlineCode",{parentName:"li"},"ip:port"),", ",(0,l.kt)("inlineCode",{parentName:"li"},"domain:port")," or simply ",(0,l.kt)("inlineCode",{parentName:"li"},"domain"),".\nUseful when hosting Jellyfish behind proxy.\nIt is returned e.g. when creating a new room.\nWhen running with Docker, ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_IP")," is set to ",(0,l.kt)("inlineCode",{parentName:"li"},"0.0.0.0"),"\nmaking the default value of ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_HOST")," incorrect.\nTherefore, for Docker, you have to set ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_HOST")," manually.\nFor running Docker locally, it can simply be ",(0,l.kt)("inlineCode",{parentName:"li"},"localhost:8080"),".")),(0,l.kt)("h4",{id:"optional"},"Optional:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_IP")," - an ip address to run the HTTP server on.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"127.0.0.1")," when running from source or using ",(0,l.kt)("inlineCode",{parentName:"li"},"mix release"),", or ",(0,l.kt)("inlineCode",{parentName:"li"},"0.0.0.0")," for Docker."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_PORT")," - port to run the HTTP server on.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"5002")," for development builds and ",(0,l.kt)("inlineCode",{parentName:"li"},"8080")," for production builds (",(0,l.kt)("inlineCode",{parentName:"li"},"mix release")," or Docker)."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_SSL_KEY_PATH")," - an absolute path to the SSL key.\nWhen both ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_SSL_KEY_PATH")," and ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_SSL_CERT_PATH")," are set, Jellyfish will\nrun HTTPS server instead of HTTP one.\nAn address where this server listens to is still configured via ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_IP")," and ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_PORT"),"."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_SSL_CERT_PATH")," - an absolute path the the SSL certificate.\nWhen both ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_SSL_KEY_PATH")," and ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_SSL_CERT_PATH")," are set, Jellyfish will\nrun HTTPS server instead of HTTP one.\nAn address where this server listens to is still configured via ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_IP")," and ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_PORT"),"."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_SECRET_KEY_BASE")," - used to sign/encrypt tokens generated for Peers.\nGenerated if not provided."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_CHECK_ORIGIN")," - defines if Jellyfish will check the origin of incoming requests and socket connection. ",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"true"),".",(0,l.kt)("br",null),"\nPossible values are ",(0,l.kt)("inlineCode",{parentName:"li"},"true"),", ",(0,l.kt)("inlineCode",{parentName:"li"},"false")," or a space-separated list of allowed origins (wildcards are allowed). ",(0,l.kt)("br",null),"\nExample: ",(0,l.kt)("inlineCode",{parentName:"li"},'JF_CHECK_ORIGIN="https://example.com //another.com:888 //*.other.com"')),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_RESOURCES_BASE_PATH")," - a base path where Jellyfish multimedia files are stored",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"./jellyfish_resources/"),".",(0,l.kt)("br",null),"\nWhen running via docker, the directory can be mounted as ",(0,l.kt)("inlineCode",{parentName:"li"},"-v $(pwd)/host_directory:/app/jellyfish_resources"),"."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_METRICS_IP")," - an IP address to run metrics endpoint on.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"127.0.0.1")," when running from source or using ",(0,l.kt)("inlineCode",{parentName:"li"},"mix release"),", or ",(0,l.kt)("inlineCode",{parentName:"li"},"0.0.0.0")," for Docker."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_METRICS_PORT")," - a port to run metrics endpoint on.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"9568"),"."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"MIX_ENV")," - defines compilation environment.\nThis variable takes effect only when running from the source.\nDocker images are always built with ",(0,l.kt)("inlineCode",{parentName:"li"},"MIX_ENV=prod"),".\nPossible values are:",(0,l.kt)("ul",{parentName:"li"},(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"dev")," - uses default values for environment variables\n(default option when running with ",(0,l.kt)("inlineCode",{parentName:"li"},"mix phx.server"),")"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"prod")," - requires that you provide values for environment variables"),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"test")," - used in tests")))),(0,l.kt)("h4",{id:"distribution"},"Distribution:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_ENABLED")," - whether to run Jellyfish in a cluster.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"false"),"."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_STRATEGY_NAME")," - specify which clustering strategy to use.",(0,l.kt)("br",null),"\nPossible values are ",(0,l.kt)("inlineCode",{parentName:"li"},"DNS")," or ",(0,l.kt)("inlineCode",{parentName:"li"},"NODES_LIST"),".\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"NODES_LIST"),"."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_NODE_NAME")," - Node name used in a cluster.\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"jellyfish@(hostname)"),". ",(0,l.kt)("br",null),"\nIt consists of two parts - nodename@hostname.\nThe first part identifies a node on a single machine and can\nbe any string.\nThe second part identifies the host machine jellyfish runs on and has to be resolvable.\nIts format depends on ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_MODE"),".\nIf ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_MODE")," is set to ",(0,l.kt)("inlineCode",{parentName:"li"},"name"),", the ",(0,l.kt)("inlineCode",{parentName:"li"},"hostname")," has to be an IP address or FQDN.\nIf ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_MODE")," is set to ",(0,l.kt)("inlineCode",{parentName:"li"},"sname"),", the ",(0,l.kt)("inlineCode",{parentName:"li"},"hostname")," can be any string.\nIf you run a cluster using ",(0,l.kt)("inlineCode",{parentName:"li"},"DNS")," strategy, every Jellyfish instance must have ",(0,l.kt)("inlineCode",{parentName:"li"},"nodename")," set to the same value.\nIf ",(0,l.kt)("inlineCode",{parentName:"li"},"hostname")," is not an IP address, it will be automatically resolved as DNS strategy requires\nnode names to use IP addresses.\nThis also means that ",(0,l.kt)("inlineCode",{parentName:"li"},"DNS")," strategy has to be run with ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_MODE")," set to ",(0,l.kt)("inlineCode",{parentName:"li"},"name"),".\nSee our ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/jellyfish-dev/jellyfish/blob/main/docker-compose-epmd.yaml"},"docker-compose-epmd.yaml")," or ",(0,l.kt)("a",{parentName:"li",href:"https://github.com/jellyfish-dev/jellyfish/blob/main/docker-compose-dns.yaml"},"docker-compose-dns.yaml"),", which we use in our integration tests or refer to ",(0,l.kt)("a",{parentName:"li",href:"/jellyfish-docs/next/cluster"},"Cluster")," section for examples."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_MODE")," - distribution mode - can be ",(0,l.kt)("inlineCode",{parentName:"li"},"name")," or ",(0,l.kt)("inlineCode",{parentName:"li"},"sname"),".",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"sname"),".",(0,l.kt)("br",null),"\nWhen using ",(0,l.kt)("inlineCode",{parentName:"li"},"name"),", your hostname has to be an IP address or FQDN of a machine Jellyfish runs on.\nWhen using ",(0,l.kt)("inlineCode",{parentName:"li"},"sname"),", your hostname can be any string.\nSee ",(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_NODE_NAME")," for more information."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_COOKIE")," - used to group Jellyfishes in a cluster.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"jellyfish_cookie"),".",(0,l.kt)("br",null),"\nUse different cookies to create multiple clusters on the same machine.",(0,l.kt)("br",null),(0,l.kt)("strong",{parentName:"li"},"Important"),": cookie does not provide any cryptographic security.\nIts only purpose is to prevent a node from connecting to a cluster with which\nit is not intended to communicate."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_MIN_PORT"),"- minimal port used by Jellyfish when forming a cluster\n(connecting to other Jellyfishes).",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"9000")," when running with Docker.",(0,l.kt)("br",null),"\nOnly available when running with Docker or ",(0,l.kt)("inlineCode",{parentName:"li"},"mix release"),"."),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_MAX_PORT"),"- maximal port used by Jellyfish when forming a cluster\n(connecting to other Jellyfishes).",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},"9000")," when running with Docker.",(0,l.kt)("br",null),"\nOnly available when running with Docker or ",(0,l.kt)("inlineCode",{parentName:"li"},"mix release"),".")),(0,l.kt)("h6",{id:"distribution-nodes_list-specific"},"Distribution NODES_LIST specific:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_NODES")," - space-separated list of other Jellyfishes to connect to.",(0,l.kt)("br",null),"\nDefaults to ",(0,l.kt)("inlineCode",{parentName:"li"},'""'),".",(0,l.kt)("br",null),"\nExample: ",(0,l.kt)("inlineCode",{parentName:"li"},'JF_DIST_NODES="jellyfish1@127.0.0.1 jellyfish2@127.0.0.1"'),".",(0,l.kt)("br",null),"\nThis list can also include ourselves so that you can pass the same value\nto every Jellyfish.\nNote: Jellyfish connection to other Jellyfish is transitive meaning that\nwhen you connect to one Jellyfish you also connect to all other Jellyfishes\nthis one was connected to.")),(0,l.kt)("h6",{id:"distribution-dns-specific"},"Distribution DNS specific:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_QUERY")," - query sent to DNS to discover other Jellyfishes. ",(0,l.kt)("br",null),"\nReturned list of IPs from DNS is used for creating distribution node name in the format ",(0,l.kt)("inlineCode",{parentName:"li"},"@"),". "),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("inlineCode",{parentName:"li"},"JF_DIST_POLLING_INTERVAL")," - DNS polling interval in ms. ",(0,l.kt)("br",null),"\nDefault value is 5000.")),(0,l.kt)("admonition",{type:"tip"},(0,l.kt)("p",{parentName:"admonition"},"You can use a single port to form a cluster, even if a cluster consists of\nmore than two Jellyfishes. ")),(0,l.kt)("admonition",{type:"caution"},(0,l.kt)("p",{parentName:"admonition"},"Besides ports specified using ",(0,l.kt)("inlineCode",{parentName:"p"},"JF_DIST_MIN_PORT")," and ",(0,l.kt)("inlineCode",{parentName:"p"},"JF_DIST_MAX_PORT"),", Jellyfish\nalso uses one more service called EPMD that runs on port 4369.\nThis port has to be explicitly exported when running with Docker.\nRead more in the ",(0,l.kt)("a",{parentName:"p",href:"/jellyfish-docs/next/cluster"},"Cluster")," section.")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.4a16b5e4.js b/assets/js/main.eae728b0.js similarity index 94% rename from assets/js/main.4a16b5e4.js rename to assets/js/main.eae728b0.js index fc896141..9e870dde 100644 --- a/assets/js/main.4a16b5e4.js +++ b/assets/js/main.eae728b0.js @@ -1,2 +1,2 @@ -/*! For license information please see main.4a16b5e4.js.LICENSE.txt */ -(self.webpackChunkjellyfish_docs=self.webpackChunkjellyfish_docs||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),s=n(6887);const l={"00efe26d":[()=>n.e(7582).then(n.bind(n,7075)),"@site/versioned_docs/version-0.3.0/getting_started/peers/webrtc.md",7075],"06d81fef":[()=>n.e(1269).then(n.bind(n,9773)),"@site/docs/introduction/what_is_jellyfish.md",9773],"07e658c8":[()=>n.e(6731).then(n.bind(n,498)),"@site/docs/benchmarks/webrtc.md",498],"09d5ad39":[()=>n.e(3030).then(n.bind(n,4381)),"@site/docs/examples.md",4381],"0bb15743":[()=>n.e(8903).then(n.bind(n,543)),"@site/versioned_docs/version-0.3.0/getting_started/components/rtsp.md",543],"0ca6cd30":[()=>Promise.all([n.e(532),n.e(8794)]).then(n.bind(n,6529)),"@site/docs/tutorials/dashboard.mdx",6529],"10febcc7":[()=>n.e(9677).then(n.bind(n,8490)),"@site/versioned_docs/version-0.2.1/introduction/example_scenarios.md",8490],17896441:[()=>Promise.all([n.e(532),n.e(7918)]).then(n.bind(n,4700)),"@theme/DocItem",4700],"1ae5f91e":[()=>n.e(3036).then(n.bind(n,8591)),"@site/versioned_docs/version-0.3.0/benchmarks/webrtc.md",8591],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1d74c428":[()=>n.e(4563).then(n.bind(n,5579)),"@site/versioned_docs/version-0.3.0/benchmarks/hls.md",5579],"1f702618":[()=>n.e(3925).then(n.bind(n,627)),"@site/docs/getting_started/metrics.md",627],"2112e5bd":[()=>n.e(5898).then(n.t.bind(n,9677,19)),"~docs/default/version-0-2-1-metadata-prop-000.json",9677],"21ed7c22":[()=>n.e(521).then(n.bind(n,7170)),"@site/versioned_docs/version-0.2.1/for_developers/design_docs.md",7170],"27ccd4a7":[()=>n.e(8244).then(n.bind(n,7408)),"@site/versioned_docs/version-0.3.0/getting_started/metrics.md",7408],"27edd659":[()=>Promise.all([n.e(532),n.e(6009)]).then(n.bind(n,8201)),"@site/versioned_docs/version-0.2.1/getting_started/authentication.md",8201],"31ce0643":[()=>n.e(544).then(n.bind(n,4007)),"@site/docs/getting_started/sdks.md",4007],"33da16d7":[()=>n.e(9655).then(n.t.bind(n,8400,19)),"/home/runner/work/jellyfish-docs/jellyfish-docs/.docusaurus/docusaurus-plugin-redoc/jellyfish-rest-api/redocApiSpecV1.2-jellyfish-rest-api.json",8400],"35845c3a":[()=>Promise.all([n.e(532),n.e(4705)]).then(n.bind(n,760)),"@site/versioned_docs/version-0.3.0/tutorials/react-native.mdx",760],"36708fee":[()=>Promise.all([n.e(532),n.e(8327)]).then(n.bind(n,932)),"@site/versioned_docs/version-0.2.1/getting_started/installation.md",932],"39530b49":[()=>n.e(6783).then(n.bind(n,8487)),"@site/versioned_docs/version-0.3.0/for_developers/design_docs.md",8487],"3a057c9d":[()=>n.e(6140).then(n.bind(n,2911)),"@site/versioned_docs/version-0.2.1/deploying/vps.md",2911],"3b1f92db":[()=>n.e(6273).then(n.bind(n,8915)),"@site/docs/benchmarks/hls.md",8915],"3d2de946":[()=>n.e(7449).then(n.bind(n,6027)),"@site/docs/for_developers/metrics_design.md",6027],"4093c5c2":[()=>n.e(3904).then(n.bind(n,2349)),"@site/docs/for_developers/design_docs.md",2349],"43c242c4":[()=>n.e(9189).then(n.bind(n,8620)),"@site/versioned_docs/version-0.2.1/getting_started/sdks.md",8620],"46afa356":[()=>n.e(5906).then(n.bind(n,9976)),"@site/versioned_docs/version-0.3.0/release_notes.md",9976],"4a332b92":[()=>n.e(2517).then(n.bind(n,2588)),"@site/docs/getting_started/architecture.md",2588],"4c8c074b":[()=>Promise.all([n.e(532),n.e(9209)]).then(n.bind(n,3970)),"@site/versioned_docs/version-0.2.1/tutorials/react-native.mdx",3970],"4cf40d90":[()=>n.e(6974).then(n.bind(n,2624)),"@site/docs/getting_started/components/file.md",2624],"533aebff":[()=>Promise.all([n.e(532),n.e(7041)]).then(n.bind(n,8461)),"@site/docs/getting_started/components/hls.md",8461],"55d4ba5e":[()=>Promise.all([n.e(532),n.e(693)]).then(n.bind(n,7370)),"@site/versioned_docs/version-0.3.0/getting_started/authentication.md",7370],"5a21b1fb":[()=>n.e(1404).then(n.bind(n,16)),"@site/versioned_docs/version-0.2.1/getting_started/notifications.md",16],"5ac0f6fc":[()=>n.e(9019).then(n.bind(n,757)),"@site/versioned_docs/version-0.3.0/getting_started/components/file.md",757],"5d43be05":[()=>n.e(3821).then(n.bind(n,2305)),"@site/docs/introduction/basic_concepts.md",2305],"5d85105e":[()=>Promise.all([n.e(532),n.e(1336),n.e(771),n.e(3334)]).then(n.bind(n,2742)),"@site/docs/for_developers/api_reference/rest_api.md",2742],"5daaa58f":[()=>n.e(3205).then(n.bind(n,7120)),"@site/versioned_docs/version-0.2.1/getting_started/architecture.md",7120],"5f012ce0":[()=>n.e(2945).then(n.t.bind(n,7805,19)),"~docs/default/version-0-3-0-metadata-prop-150.json",7805],"600cd2d3":[()=>n.e(2707).then(n.t.bind(n,3769,19)),"/home/runner/work/jellyfish-docs/jellyfish-docs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"60a6062a":[()=>n.e(9877).then(n.bind(n,8205)),"@site/versioned_docs/version-0.3.0/deploying/fly_io.md",8205],"62feff6b":[()=>n.e(3717).then(n.bind(n,1959)),"@site/versioned_docs/version-0.3.0/getting_started/sdks.md",1959],"63002c07":[()=>n.e(2030).then(n.bind(n,9497)),"@site/versioned_docs/version-0.3.0/getting_started/architecture.md",9497],"69ed952a":[()=>Promise.all([n.e(532),n.e(3356)]).then(n.bind(n,7144)),"@site/docs/tutorials/react-native.mdx",7144],"73522d53":[()=>n.e(1380).then(n.bind(n,8688)),"@site/versioned_docs/version-0.2.1/introduction/what_is_jellyfish.md",8688],"7355fc42":[()=>n.e(2398).then(n.bind(n,8473)),"@site/versioned_docs/version-0.3.0/benchmarks.md",8473],"73d55eec":[()=>n.e(3582).then(n.bind(n,8913)),"@site/versioned_docs/version-0.2.1/getting_started/peers/webrtc.md",8913],"74b3eea0":[()=>Promise.all([n.e(532),n.e(5948)]).then(n.bind(n,7147)),"@site/versioned_docs/version-0.3.0/tutorials/dashboard.mdx",7147],"75da9f0f":[()=>n.e(3364).then(n.bind(n,7332)),"@site/versioned_docs/version-0.2.1/getting_started/metrics.md",7332],"768642a8":[()=>n.e(3667).then(n.bind(n,2898)),"@site/versioned_docs/version-0.3.0/for_developers/metrics_design.md",2898],"78c80559":[()=>n.e(730).then(n.bind(n,8502)),"@site/docs/getting_started/components/rtsp.md",8502],"794d58d2":[()=>n.e(315).then(n.bind(n,9149)),"@site/versioned_docs/version-0.3.0/for_developers/api_reference.md",9149],"7989af0e":[()=>Promise.all([n.e(532),n.e(4269)]).then(n.bind(n,255)),"@site/versioned_docs/version-0.3.0/getting_started/installation.md",255],"79a00ea7":[()=>n.e(9654).then(n.bind(n,6113)),"@site/versioned_docs/version-0.3.0/examples.md",6113],"7dab705f":[()=>Promise.all([n.e(532),n.e(6411)]).then(n.bind(n,9952)),"@site/docs/getting_started/authentication.md",9952],"861638b8":[()=>n.e(3070).then(n.bind(n,2482)),"@site/versioned_docs/version-0.2.1/deploying/fly_io.md",2482],"887a5d8d":[()=>n.e(765).then(n.bind(n,3382)),"@site/versioned_docs/version-0.3.0/introduction/basic_concepts.md",3382],"88f389e2":[()=>Promise.all([n.e(532),n.e(9498)]).then(n.bind(n,5337)),"@site/versioned_docs/version-0.3.0/getting_started/notifications.md",5337],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"94d315a1":[()=>n.e(870).then(n.bind(n,5474)),"@site/versioned_docs/version-0.2.1/getting_started/components/hls.md",5474],"95d85754":[()=>n.e(7951).then(n.bind(n,1915)),"@site/versioned_docs/version-0.2.1/getting_started/components/rtsp.md",1915],"9a2cec18":[()=>n.e(8618).then(n.bind(n,319)),"@site/docs/release_notes.md",319],"9bbc544f":[()=>n.e(8870).then(n.bind(n,421)),"@site/versioned_docs/version-0.3.0/cluster.md",421],"9cdf073a":[()=>n.e(9312).then(n.bind(n,7729)),"@site/versioned_docs/version-0.3.0/introduction/example_scenarios.md",7729],"9d08b8f2":[()=>n.e(5110).then(n.bind(n,7762)),"@site/versioned_docs/version-0.3.0/introduction/what_is_jellyfish.md",7762],a1054fe7:[()=>n.e(1466).then(n.bind(n,2450)),"@site/docs/getting_started/peers/webrtc.md",2450],a2748788:[()=>Promise.all([n.e(532),n.e(1336),n.e(771),n.e(4949)]).then(n.bind(n,9474)),"@site/versioned_docs/version-0.2.1/for_developers/api_reference/rest_api.md",9474],ae302c60:[()=>n.e(4302).then(n.bind(n,6818)),"@site/docs/for_developers/api_reference.md",6818],b3305401:[()=>n.e(6680).then(n.bind(n,5013)),"@site/versioned_docs/version-0.2.1/introduction/basic_concepts.md",5013],b50b123e:[()=>Promise.all([n.e(532),n.e(5970)]).then(n.bind(n,9059)),"@site/docs/tutorials/simple-react-app.mdx",9059],b5d665f7:[()=>n.e(1383).then(n.bind(n,9002)),"@site/versioned_docs/version-0.2.1/examples.md",9002],b67ba642:[()=>Promise.all([n.e(532),n.e(7382)]).then(n.bind(n,1982)),"@site/versioned_docs/version-0.3.0/getting_started/components/hls.md",1982],bd4d3e77:[()=>n.e(1048).then(n.bind(n,1038)),"@site/docs/deploying/fly_io.md",1038],caf39a59:[()=>n.e(6982).then(n.bind(n,8035)),"@site/docs/benchmarks.md",8035],cf5003b1:[()=>Promise.all([n.e(532),n.e(9313)]).then(n.bind(n,9595)),"@site/docs/getting_started/notifications.md",9595],cf9e2847:[()=>n.e(6695).then(n.bind(n,8563)),"@site/versioned_docs/version-0.3.0/deploying/vps.md",8563],dd033c5b:[()=>n.e(2440).then(n.bind(n,6789)),"@site/versioned_docs/version-0.2.1/cluster.md",6789],ddb258f2:[()=>n.e(2997).then(n.bind(n,8494)),"@site/docs/deploying/vps.md",8494],de993eb4:[()=>n.e(3625).then(n.bind(n,8001)),"@site/docs/introduction/example_scenarios.md",8001],debcebe1:[()=>Promise.all([n.e(532),n.e(1893)]).then(n.bind(n,1084)),"@site/versioned_docs/version-0.3.0/tutorials/simple-react-app.mdx",1084],e364a627:[()=>Promise.all([n.e(532),n.e(4246)]).then(n.bind(n,594)),"@site/versioned_docs/version-0.2.1/tutorials/simple-react-app.mdx",594],e84b993c:[()=>n.e(5481).then(n.bind(n,731)),"@site/versioned_docs/version-0.2.1/for_developers/api_reference.md",731],e8d07e67:[()=>Promise.all([n.e(532),n.e(1336),n.e(771),n.e(9386)]).then(n.bind(n,1555)),"@site/versioned_docs/version-0.3.0/for_developers/api_reference/rest_api.md",1555],f0ad3fbb:[()=>Promise.all([n.e(532),n.e(1336),n.e(771),n.e(8612)]).then(n.bind(n,8254)),"@theme/ApiDoc",8254],f20ac086:[()=>Promise.all([n.e(532),n.e(2549)]).then(n.bind(n,7428)),"@site/versioned_docs/version-0.2.1/tutorials/dashboard.mdx",7428],f2711dff:[()=>Promise.all([n.e(532),n.e(5521)]).then(n.bind(n,332)),"@site/docs/getting_started/installation.md",332],f9b08eaa:[()=>n.e(5655).then(n.bind(n,3751)),"@site/docs/cluster.md",3751],fa5b4139:[()=>n.e(3527).then(n.t.bind(n,7889,19)),"/home/runner/work/jellyfish-docs/jellyfish-docs/.docusaurus/docusaurus-plugin-redoc/jellyfish-rest-api/redocApiLayoutV1-jellyfish-rest-api.json",7889],fdcc75fd:[()=>n.e(9251).then(n.t.bind(n,966,19)),"/home/runner/work/jellyfish-docs/jellyfish-docs/.docusaurus/docusaurus-plugin-redoc/jellyfish-rest-api/plugin-route-context-module-100.json",966]};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(9670),d=n(226);function p(e,t){if("*"===e)return i()({loading:c,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=s[`${e}-${t}`],p={},f=[],m=[],h=(0,u.Z)(o);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=l[n];r&&(p[t]=r[0],f.push(r[1]),m.push(r[2]))})),i().Map({loading:c,loader:p,modules:f,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 s=n.split(".");s.slice(0,-1).forEach((e=>{o=o[e]})),o[s[s.length-1]]=a}));const s=i.__comp;delete i.__comp;const l=i.__context;return delete i.__context,r.createElement(d.z,{value:l},r.createElement(s,(0,a.Z)({},i,n)))}})}const f=[{path:"/jellyfish-docs/examples/using-single-yaml",component:p("/jellyfish-docs/examples/using-single-yaml","021"),exact:!0},{path:"/jellyfish-docs/0.2.1",component:p("/jellyfish-docs/0.2.1","762"),routes:[{path:"/jellyfish-docs/0.2.1",component:p("/jellyfish-docs/0.2.1","9b1"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/cluster",component:p("/jellyfish-docs/0.2.1/cluster","950"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/deploying/fly_io",component:p("/jellyfish-docs/0.2.1/deploying/fly_io","fe4"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/deploying/vps",component:p("/jellyfish-docs/0.2.1/deploying/vps","908"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/examples",component:p("/jellyfish-docs/0.2.1/examples","223"),exact:!0},{path:"/jellyfish-docs/0.2.1/for_developers/api_reference",component:p("/jellyfish-docs/0.2.1/for_developers/api_reference","27e"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/for_developers/api_reference/rest_api",component:p("/jellyfish-docs/0.2.1/for_developers/api_reference/rest_api","200"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/for_developers/design_docs",component:p("/jellyfish-docs/0.2.1/for_developers/design_docs","944"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/getting_started/architecture",component:p("/jellyfish-docs/0.2.1/getting_started/architecture","338"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/getting_started/authentication",component:p("/jellyfish-docs/0.2.1/getting_started/authentication","3a6"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/getting_started/components/hls",component:p("/jellyfish-docs/0.2.1/getting_started/components/hls","b8f"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/getting_started/components/rtsp",component:p("/jellyfish-docs/0.2.1/getting_started/components/rtsp","823"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/getting_started/installation",component:p("/jellyfish-docs/0.2.1/getting_started/installation","1c6"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/getting_started/metrics",component:p("/jellyfish-docs/0.2.1/getting_started/metrics","f75"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/getting_started/notifications",component:p("/jellyfish-docs/0.2.1/getting_started/notifications","666"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/getting_started/peers/webrtc",component:p("/jellyfish-docs/0.2.1/getting_started/peers/webrtc","438"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/getting_started/sdks",component:p("/jellyfish-docs/0.2.1/getting_started/sdks","a4f"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/introduction/basic_concepts",component:p("/jellyfish-docs/0.2.1/introduction/basic_concepts","a00"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/introduction/example_scenarios",component:p("/jellyfish-docs/0.2.1/introduction/example_scenarios","460"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/tutorials/dashboard",component:p("/jellyfish-docs/0.2.1/tutorials/dashboard","748"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/tutorials/react-native",component:p("/jellyfish-docs/0.2.1/tutorials/react-native","c46"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/0.2.1/tutorials/simple-react-app",component:p("/jellyfish-docs/0.2.1/tutorials/simple-react-app","55b"),exact:!0,sidebar:"mainSidebar"}]},{path:"/jellyfish-docs/next",component:p("/jellyfish-docs/next","2c5"),routes:[{path:"/jellyfish-docs/next",component:p("/jellyfish-docs/next","149"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/benchmarks",component:p("/jellyfish-docs/next/benchmarks","15e"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/benchmarks/hls",component:p("/jellyfish-docs/next/benchmarks/hls","fdb"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/benchmarks/webrtc",component:p("/jellyfish-docs/next/benchmarks/webrtc","6ca"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/cluster",component:p("/jellyfish-docs/next/cluster","096"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/deploying/fly_io",component:p("/jellyfish-docs/next/deploying/fly_io","e1f"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/deploying/vps",component:p("/jellyfish-docs/next/deploying/vps","2b0"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/examples",component:p("/jellyfish-docs/next/examples","200"),exact:!0},{path:"/jellyfish-docs/next/for_developers/api_reference",component:p("/jellyfish-docs/next/for_developers/api_reference","a57"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/for_developers/api_reference/rest_api",component:p("/jellyfish-docs/next/for_developers/api_reference/rest_api","6bc"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/for_developers/design_docs",component:p("/jellyfish-docs/next/for_developers/design_docs","871"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/for_developers/metrics_design",component:p("/jellyfish-docs/next/for_developers/metrics_design","af1"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/getting_started/architecture",component:p("/jellyfish-docs/next/getting_started/architecture","113"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/getting_started/authentication",component:p("/jellyfish-docs/next/getting_started/authentication","a5e"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/getting_started/components/file",component:p("/jellyfish-docs/next/getting_started/components/file","4b8"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/getting_started/components/hls",component:p("/jellyfish-docs/next/getting_started/components/hls","4e2"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/getting_started/components/rtsp",component:p("/jellyfish-docs/next/getting_started/components/rtsp","a7f"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/getting_started/installation",component:p("/jellyfish-docs/next/getting_started/installation","40d"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/getting_started/metrics",component:p("/jellyfish-docs/next/getting_started/metrics","608"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/getting_started/notifications",component:p("/jellyfish-docs/next/getting_started/notifications","d82"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/getting_started/peers/webrtc",component:p("/jellyfish-docs/next/getting_started/peers/webrtc","60a"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/getting_started/sdks",component:p("/jellyfish-docs/next/getting_started/sdks","160"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/introduction/basic_concepts",component:p("/jellyfish-docs/next/introduction/basic_concepts","f09"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/introduction/example_scenarios",component:p("/jellyfish-docs/next/introduction/example_scenarios","16b"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/release_notes",component:p("/jellyfish-docs/next/release_notes","831"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/tutorials/dashboard",component:p("/jellyfish-docs/next/tutorials/dashboard","b5f"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/tutorials/react-native",component:p("/jellyfish-docs/next/tutorials/react-native","949"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/next/tutorials/simple-react-app",component:p("/jellyfish-docs/next/tutorials/simple-react-app","2c8"),exact:!0,sidebar:"mainSidebar"}]},{path:"/jellyfish-docs/",component:p("/jellyfish-docs/","78d"),routes:[{path:"/jellyfish-docs/",component:p("/jellyfish-docs/","727"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/benchmarks",component:p("/jellyfish-docs/benchmarks","3df"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/benchmarks/hls",component:p("/jellyfish-docs/benchmarks/hls","bda"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/benchmarks/webrtc",component:p("/jellyfish-docs/benchmarks/webrtc","2c2"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/cluster",component:p("/jellyfish-docs/cluster","eda"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/deploying/fly_io",component:p("/jellyfish-docs/deploying/fly_io","ea6"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/deploying/vps",component:p("/jellyfish-docs/deploying/vps","b58"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/examples",component:p("/jellyfish-docs/examples","8e7"),exact:!0},{path:"/jellyfish-docs/for_developers/api_reference",component:p("/jellyfish-docs/for_developers/api_reference","bf5"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/for_developers/api_reference/rest_api",component:p("/jellyfish-docs/for_developers/api_reference/rest_api","a82"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/for_developers/design_docs",component:p("/jellyfish-docs/for_developers/design_docs","545"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/for_developers/metrics_design",component:p("/jellyfish-docs/for_developers/metrics_design","ff8"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/getting_started/architecture",component:p("/jellyfish-docs/getting_started/architecture","e0a"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/getting_started/authentication",component:p("/jellyfish-docs/getting_started/authentication","46a"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/getting_started/components/file",component:p("/jellyfish-docs/getting_started/components/file","626"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/getting_started/components/hls",component:p("/jellyfish-docs/getting_started/components/hls","979"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/getting_started/components/rtsp",component:p("/jellyfish-docs/getting_started/components/rtsp","e12"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/getting_started/installation",component:p("/jellyfish-docs/getting_started/installation","60a"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/getting_started/metrics",component:p("/jellyfish-docs/getting_started/metrics","79a"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/getting_started/notifications",component:p("/jellyfish-docs/getting_started/notifications","43e"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/getting_started/peers/webrtc",component:p("/jellyfish-docs/getting_started/peers/webrtc","47b"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/getting_started/sdks",component:p("/jellyfish-docs/getting_started/sdks","2de"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/introduction/basic_concepts",component:p("/jellyfish-docs/introduction/basic_concepts","9ca"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/introduction/example_scenarios",component:p("/jellyfish-docs/introduction/example_scenarios","8bf"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/release_notes",component:p("/jellyfish-docs/release_notes","bfb"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/tutorials/dashboard",component:p("/jellyfish-docs/tutorials/dashboard","0e2"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/tutorials/react-native",component:p("/jellyfish-docs/tutorials/react-native","414"),exact:!0,sidebar:"mainSidebar"},{path:"/jellyfish-docs/tutorials/simple-react-app",component:p("/jellyfish-docs/tutorials/simple-react-app","946"),exact:!0,sidebar:"mainSidebar"}]},{path:"*",component:p("*")}]},8934:(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)}},7221:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),s=n(412);const l=[n(2497),n(3310),n(8320),n(2295),n(1304),n(4750)];var c=n(723),u=n(6550),d=n(8790);function p(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var f=n(7462),m=n(5742),h=n(2263),g=n(4996),b=n(6668),y=n(1944),v=n(4711),w=n(9727),_=n(3320),E=n(8780),k=n(197);function S(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,h.Z)(),n=(0,v.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,h.Z)(),a=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.Z)(),{pathname:r}=(0,u.TH)();return e+(0,E.applyTrailingSlash)((0,g.Z)(r),{trailingSlash:n,baseUrl: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 C(){const{i18n:{currentLocale:e}}=(0,h.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(y.d,{image:n}),r.createElement(x,null),r.createElement(S,null),r.createElement(k.Z,{tag:_.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,f.Z)({key:t},e))))))}const T=new Map;function j(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(c.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var P=n(8934),A=n(8940);function L(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const R=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:a}),L("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(c.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class N extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.default.canUseDOM?L("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=L("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(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 I=N,D="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",F="__docusaurus-base-url-issue-banner-suggestion-container",B="__DOCUSAURUS_INSERT_BASEURL_BANNER";function $(e){return`\nwindow['${B}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${B}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${D}');\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[B]=!1}),[]),r.createElement(r.Fragment,null,!s.default.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,$(e))),r.createElement("div",{id:D}))}function z(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.Z)(),{pathname:n}=(0,u.TH)();return t&&n===e?r.createElement(U,null):null}function H(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,h.Z)(),i=(0,g.Z)(e),{htmlLang:s,direction:l}=o[a];return r.createElement(m.Z,null,r.createElement("html",{lang:s,dir:l}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:i}))}var Z=n(4763),W=n(2389);function q(){const e=(0,W.Z)();return r.createElement(m.Z,null,r.createElement("html",{"data-has-hydrated":e}))}function V(){const e=(0,d.H)(c.Z),t=(0,u.TH)();return r.createElement(Z.Z,null,r.createElement(A.M,null,r.createElement(P.t,null,r.createElement(p,null,r.createElement(H,null),r.createElement(C,null),r.createElement(z,null),r.createElement(I,{location:j(t)},e)),r.createElement(q,null))))}var G=n(6887);const Y=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var K=n(9670);const X=new Set,Q=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!Q.has(e)&&!X.has(e))(e))return!1;X.add(e);const t=(0,d.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(G).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,K.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Y(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!Q.has(e))(e)&&(Q.add(e),O(e))},te=Object.freeze(ee);if(s.default.canUseDOM){window.docusaurus=te;const e=a.hydrate;O(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(V,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>u,M:()=>d});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-redoc":{"jellyfish-rest-api":{"url":"https://raw.githubusercontent.com/jellyfish-dev/jellyfish/main/openapi.yaml","themeId":"theme-redoc","isSpecFile":false,"spec":{"components":{"responses":{},"schemas":{"PeerStatus":{"description":"Informs about the peer status","enum":["connected","disconnected"],"example":"disconnected","title":"PeerStatus","type":"string","x-struct":"Elixir.JellyfishWeb.ApiSpec.Peer.Status"},"RoomDetailsResponse":{"description":"Response containing room details","properties":{"data":{"$ref":"#/components/schemas/Room"}},"required":["data"],"title":"RoomDetailsResponse","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.RoomDetailsResponse"},"ComponentOptionsRTSP":{"description":"Options specific to the RTSP component","properties":{"keepAliveInterval":{"default":15000,"description":"Interval (in ms) in which keep-alive RTSP messages will be sent to the remote stream source","minimum":0,"type":"integer"},"pierceNat":{"default":true,"description":"Whether to attempt to create client-side NAT binding by sending an empty datagram from client to source, after the completion of RTSP setup","type":"boolean"},"reconnectDelay":{"default":15000,"description":"Delay (in ms) between successive reconnect attempts","minimum":0,"type":"integer"},"rtpPort":{"default":20000,"description":"Local port RTP stream will be received at","maximum":65535,"minimum":1,"type":"integer"},"sourceUri":{"description":"URI of RTSP source stream","example":"rtsp://localhost:554/stream","type":"string"}},"required":["sourceUri"],"title":"ComponentOptionsRTSP","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Component.RTSP.Options"},"ComponentPropertiesHLS":{"description":"Properties specific to the HLS component","properties":{"lowLatency":{"description":"Whether the component uses LL-HLS","type":"boolean"},"persistent":{"description":"Whether the video is stored after end of stream","type":"boolean"},"playable":{"description":"Whether the generated HLS playlist is playable","type":"boolean"},"subscribeMode":{"description":"Whether the HLS component should subscribe to tracks automatically or manually","enum":["auto","manual"],"type":"string"},"targetWindowDuration":{"description":"Duration of stream available for viewer","nullable":true,"type":"integer"}},"required":["playable","lowLatency","persistent","targetWindowDuration","subscribeMode"],"title":"ComponentPropertiesHLS","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Component.HLS.Properties"},"Room":{"description":"Description of the room state","properties":{"components":{"description":"List of all components","items":{"$ref":"#/components/schemas/Component"},"type":"array"},"config":{"$ref":"#/components/schemas/RoomConfig"},"id":{"description":"Room ID","example":"room-1","type":"string"},"peers":{"description":"List of all peers","items":{"$ref":"#/components/schemas/Peer"},"type":"array"}},"required":["id","config","components","peers"],"title":"Room","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Room"},"Component":{"description":"Describes component","discriminator":{"mapping":{"file":"#/components/schemas/ComponentFile","hls":"#/components/schemas/ComponentHLS","rtsp":"#/components/schemas/ComponentRTSP"},"propertyName":"type"},"oneOf":[{"$ref":"#/components/schemas/ComponentHLS"},{"$ref":"#/components/schemas/ComponentRTSP"},{"$ref":"#/components/schemas/ComponentFile"}],"title":"Component","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Component"},"PeerOptionsWebRTC":{"description":"Options specific to the WebRTC peer","properties":{"enableSimulcast":{"default":true,"description":"Enables the peer to use simulcast","type":"boolean"}},"title":"PeerOptionsWebRTC","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Peer.WebRTC"},"ComponentHLS":{"description":"Describes the HLS component","properties":{"id":{"description":"Assigned component ID","example":"component-1","type":"string"},"properties":{"$ref":"#/components/schemas/ComponentPropertiesHLS"},"type":{"description":"Component type","example":"hls","type":"string"}},"required":["id","type","properties"],"title":"ComponentHLS","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Component.HLS"},"HlsSkip":{"description":"Set to \\"YES\\" if delta manifest should be requested","example":"YES","nullable":true,"title":"HlsSkip","type":"string","x-struct":"Elixir.JellyfishWeb.ApiSpec.HLS.Params.HlsSkip"},"ComponentPropertiesFile":{"description":"Properties specific to the File component","properties":{"filePath":{"description":"Relative path to track file. Must be either OPUS encapsulated in Ogg or raw h264","type":"string"}},"required":["filePath"],"title":"ComponentPropertiesFile","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Component.File.Properties"},"ComponentFile":{"description":"Describes the File component","properties":{"id":{"description":"Assigned component ID","example":"component-1","type":"string"},"properties":{"$ref":"#/components/schemas/ComponentPropertiesFile"},"type":{"description":"Component type","example":"file","type":"string"}},"required":["id","type"],"title":"ComponentFile","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Component.File"},"SubscriptionConfig":{"description":"Subscription config","properties":{"origins":{"description":"List of peers and components ids whose tracks the HLS endpoint will subscribe to","items":{"type":"string"},"type":"array"}},"title":"SubscriptionConfig","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Subscription.Origins"},"HlsMsn":{"description":"Segment sequence number","example":10,"minimum":0,"nullable":true,"title":"HlsMsn","type":"integer","x-struct":"Elixir.JellyfishWeb.ApiSpec.HLS.Params.HlsMsn"},"ComponentRTSP":{"description":"Describes the RTSP component","properties":{"id":{"description":"Assigned component ID","example":"component-1","type":"string"},"properties":{"$ref":"#/components/schemas/ComponentPropertiesRTSP"},"type":{"description":"Component type","example":"hls","type":"string"}},"required":["id","type","properties"],"title":"ComponentRTSP","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Component.RTSP"},"HlsPart":{"description":"Partial segment sequence number","example":10,"minimum":0,"nullable":true,"title":"HlsPart","type":"integer","x-struct":"Elixir.JellyfishWeb.ApiSpec.HLS.Params.HlsPart"},"ComponentDetailsResponse":{"description":"Response containing component details","properties":{"data":{"$ref":"#/components/schemas/Component"}},"required":["data"],"title":"ComponentDetailsResponse","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.ComponentDetailsResponse"},"ComponentOptionsHLS":{"description":"Options specific to the HLS component","properties":{"lowLatency":{"default":false,"description":"Whether the component should use LL-HLS","type":"boolean"},"persistent":{"default":false,"description":"Whether the video is stored after end of stream","type":"boolean"},"s3":{"description":"Credentials to AWS S3 bucket.","nullable":true,"oneOf":[{"$ref":"#/components/schemas/S3Credentials"}],"type":"object"},"subscribeMode":{"default":"auto","description":"Whether the HLS component should subscribe to tracks automatically or manually.","enum":["auto","manual"],"type":"string"},"targetWindowDuration":{"description":"Duration of stream available for viewer","nullable":true,"type":"integer"}},"title":"ComponentOptionsHLS","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Component.HLS.Options"},"S3Credentials":{"description":"An AWS S3 credential that will be used to send HLS stream. The stream will only be uploaded if credentials are provided","properties":{"accessKeyId":{"description":"An AWS access key identifier, linked to your AWS account.","type":"string"},"bucket":{"description":"The name of the S3 bucket where your data will be stored.","type":"string"},"region":{"description":"The AWS region where your bucket is located.","type":"string"},"secretAccessKey":{"description":"The secret key that is linked to the Access Key ID.","type":"string"}},"required":["accessKeyId","secretAccessKey","region","bucket"],"title":"S3Credentials","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Component.HLS.S3"},"RecordingListResponse":{"description":"Response containing list of all recording","properties":{"data":{"items":{"type":"string"},"type":"array"}},"required":["data"],"title":"RecordingListResponse","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.RecordingListResponse"},"ComponentOptions":{"description":"Component-specific options","oneOf":[{"$ref":"#/components/schemas/ComponentOptionsHLS"},{"$ref":"#/components/schemas/ComponentOptionsRTSP"},{"$ref":"#/components/schemas/ComponentOptionsFile"}],"title":"ComponentOptions","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Component.Options"},"ComponentPropertiesRTSP":{"description":"Properties specific to the RTSP component","properties":{"keepAliveInterval":{"description":"Interval (in ms) in which keep-alive RTSP messages will be sent to the remote stream source","type":"integer"},"pierceNat":{"description":"Whether to attempt to create client-side NAT binding by sending an empty datagram from client to source, after the completion of RTSP setup","type":"boolean"},"reconnectDelay":{"description":"Delay (in ms) between successive reconnect attempts","type":"integer"},"rtpPort":{"description":"Local port RTP stream will be received at","type":"integer"},"sourceUri":{"description":"URI of RTSP source stream","type":"string"}},"required":["sourceUri","rtpPort","reconnectDelay","keepAliveInterval","pierceNat"],"title":"ComponentPropertiesRTSP","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Component.RTSP.Properties"},"PeerOptions":{"description":"Peer-specific options","oneOf":[{"$ref":"#/components/schemas/PeerOptionsWebRTC"}],"title":"PeerOptions","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Peer.Options"},"Peer":{"description":"Describes peer status","properties":{"id":{"description":"Assigned peer id","example":"peer-1","type":"string"},"status":{"$ref":"#/components/schemas/PeerStatus"},"type":{"$ref":"#/components/schemas/PeerType"}},"required":["id","type","status"],"title":"Peer","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Peer"},"ComponentType":{"description":"Component type","example":"hls","title":"ComponentType","type":"string","x-struct":"Elixir.JellyfishWeb.ApiSpec.Component.Type"},"AuthToken":{"description":"Token for authorizing websocket connection","example":"5cdac726-57a3-4ecb-b1d5-72a3d62ec242","title":"AuthToken","type":"string","x-struct":"Elixir.JellyfishWeb.ApiSpec.Peer.Token"},"RoomsListingResponse":{"description":"Response containing list of all rooms","properties":{"data":{"items":{"$ref":"#/components/schemas/Room"},"type":"array"}},"required":["data"],"title":"RoomsListingResponse","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.RoomsListingResponse"},"PeerDetailsResponse":{"description":"Response containing peer details and their token","properties":{"data":{"properties":{"peer":{"$ref":"#/components/schemas/Peer"},"token":{"$ref":"#/components/schemas/AuthToken"}},"required":["peer","token"],"type":"object"}},"required":["data"],"title":"PeerDetailsResponse","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.PeerDetailsResponse"},"HlsResponse":{"description":"Requested file","title":"HlsResponse","type":"string","x-struct":"Elixir.JellyfishWeb.ApiSpec.HLS.Response"},"PeerType":{"description":"Peer type","example":"webrtc","title":"PeerType","type":"string","x-struct":"Elixir.JellyfishWeb.ApiSpec.Peer.Type"},"RoomCreateDetailsResponse":{"description":"Response containing room details","properties":{"data":{"properties":{"jellyfish_address":{"description":"Jellyfish instance address where the room was created. This might be different than the address of Jellyfish where the request was sent only when running a cluster of Jellyfishes.","example":"jellyfish1:5003","type":"string"},"room":{"$ref":"#/components/schemas/Room"}},"required":["room","jellyfish_address"],"type":"object"}},"required":["data"],"title":"RoomCreateDetailsResponse","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.RoomCreateDetailsResponse"},"ComponentOptionsFile":{"description":"Options specific to the File component","properties":{"filePath":{"description":"Path to track file. Must be either OPUS encapsulated in Ogg or raw h264","example":"/root/video.h264","type":"string"}},"required":["filePath"],"title":"ComponentOptionsFile","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Component.File.Options"},"Error":{"description":"Error message","properties":{"errors":{"description":"Error details","example":"Token has expired","type":"string"}},"required":["errors"],"title":"Error","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Error"},"RoomConfig":{"description":"Room configuration","properties":{"maxPeers":{"description":"Maximum amount of peers allowed into the room","example":10,"minimum":1,"nullable":true,"type":"integer"},"roomId":{"description":"Custom id used for identifying room within Jellyfish. Must be unique across all rooms. If not provided, random UUID is generated.","nullable":true,"type":"string"},"videoCodec":{"description":"Enforces video codec for each peer in the room","enum":["h264","vp8"],"nullable":true,"type":"string"},"webhookUrl":{"description":"URL where Jellyfish notifications will be sent","example":"https://backend.address.com/jellyfish-notifications-endpoint","nullable":true,"type":"string"}},"title":"RoomConfig","type":"object","x-struct":"Elixir.JellyfishWeb.ApiSpec.Room.Config"}},"securitySchemes":{"authorization":{"scheme":"bearer","type":"http"}}},"info":{"license":{"name":"Apache 2.0","url":"https://www.apache.org/licenses/LICENSE-2.0"},"title":"Jellyfish Media Server","version":"0.2.0"},"openapi":"3.0.0","paths":{"/hls/{room_id}/subscribe":{"post":{"callbacks":{},"operationId":"subscribe_hls_to","parameters":[{"description":"Room ID","in":"path","name":"room_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionConfig"}}},"description":"Subscribe configuration","required":false},"responses":{"201":{"description":"Tracks succesfully added."},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request structure"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Room doesn\'t exist"}},"summary":"Subscribe the HLS component to the tracks of peers or components","tags":["hls"]}},"/hls/{room_id}/{filename}":{"get":{"callbacks":{},"operationId":"getHlsContent","parameters":[{"description":"Room id","in":"path","name":"room_id","required":true,"schema":{"type":"string"}},{"description":"Name of the file","in":"path","name":"filename","required":true,"schema":{"type":"string"}},{"description":"Byte range of partial segment","in":"header","name":"range","required":false,"schema":{"type":"string"}},{"description":"Segment sequence number","in":"query","name":"_HLS_msn","required":false,"schema":{"$ref":"#/components/schemas/HlsMsn"}},{"description":"Partial segment sequence number","in":"query","name":"_HLS_part","required":false,"schema":{"$ref":"#/components/schemas/HlsPart"}},{"description":"Is delta manifest requested","in":"query","name":"_HLS_skip","required":false,"schema":{"$ref":"#/components/schemas/HlsSkip"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HlsResponse"}}},"description":"File was found"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid filename"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"File not found"}},"summary":"Retrieve HLS Content","tags":["hls"]}},"/recording":{"get":{"callbacks":{},"operationId":"get_recordings","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordingListResponse"}}},"description":"Success"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unable to obtain recordings"}},"summary":"Lists all available recordings","tags":["recording"]}},"/recording/{recording_id}":{"delete":{"callbacks":{},"operationId":"delete_recording","parameters":[{"description":"Recording id","in":"path","name":"recording_id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Successfully deleted recording"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid recording"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Recording doesn\'t exist"}},"summary":"Deletes the recording","tags":["recording"]}},"/recording/{recording_id}/{filename}":{"get":{"callbacks":{},"operationId":"getRecordingContent","parameters":[{"description":"Recording id","in":"path","name":"recording_id","required":true,"schema":{"type":"string"}},{"description":"Name of the file","in":"path","name":"filename","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HlsResponse"}}},"description":"File was found"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"File not found"}},"summary":"Retrieve Recording (HLS) Content","tags":["recording"]}},"/room":{"get":{"callbacks":{},"operationId":"get_all_rooms","parameters":[],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomsListingResponse"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"}},"summary":"Show information about all rooms","tags":["room"]},"post":{"callbacks":{},"operationId":"create_room","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomConfig"}}},"description":"Room configuration","required":false},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomCreateDetailsResponse"}}},"description":"Room successfully created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request structure"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"}},"summary":"Creates a room","tags":["room"]}},"/room/{room_id}":{"delete":{"callbacks":{},"operationId":"delete_room","parameters":[{"description":"Room id","in":"path","name":"room_id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Successfully deleted room"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Room doesn\'t exist"}},"summary":"Delete the room","tags":["room"]},"get":{"callbacks":{},"operationId":"get_room","parameters":[{"description":"Room ID","in":"path","name":"room_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoomDetailsResponse"}}},"description":"Success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Room doesn\'t exist"}},"summary":"Shows information about the room","tags":["room"]}},"/room/{room_id}/component":{"post":{"callbacks":{},"operationId":"add_component","parameters":[{"description":"Room ID","in":"path","name":"room_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"options":{"$ref":"#/components/schemas/ComponentOptions"},"type":{"$ref":"#/components/schemas/ComponentType"}},"required":["type"],"type":"object"}}},"description":"Component config","required":false},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentDetailsResponse"}}},"description":"Successfully added component"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Room doesn\'t exist"}},"summary":"Creates the component and adds it to the room","tags":["room"]}},"/room/{room_id}/component/{id}":{"delete":{"callbacks":{},"operationId":"delete_component","parameters":[{"description":"Room ID","in":"path","name":"room_id","required":true,"schema":{"type":"string"}},{"description":"Component ID","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Successfully deleted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Either component or the room doesn\'t exist"}},"summary":"Delete the component from the room","tags":["room"]}},"/room/{room_id}/peer":{"post":{"callbacks":{},"operationId":"add_peer","parameters":[{"description":"Room id","in":"path","name":"room_id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"options":{"$ref":"#/components/schemas/PeerOptions"},"type":{"$ref":"#/components/schemas/PeerType"}},"required":["type","options"],"type":"object"}}},"description":"Peer specification","required":false},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PeerDetailsResponse"}}},"description":"Peer successfully created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request body structure"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Room doesn\'t exist"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Peer limit has been reached"}},"summary":"Create peer","tags":["room"]}},"/room/{room_id}/peer/{id}":{"delete":{"callbacks":{},"operationId":"delete_peer","parameters":[{"description":"Room ID","in":"path","name":"room_id","required":true,"schema":{"type":"string"}},{"description":"Peer id","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Peer successfully deleted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Room ID or Peer ID references a resource that doesn\'t exist"}},"summary":"Delete peer","tags":["room"]}}},"security":[{"authorization":[]}],"servers":[],"tags":[]}}},"docusaurus-lunr-search":{"default":{"fileNames":{"searchDoc":"search-doc-1705062559465.json","lunrIndex":"lunr-index-1705062559465.json"}}},"docusaurus-theme-redoc":{"theme-redoc":{"lightTheme":{"typography":{"fontFamily":"var(--ifm-font-family-base)","fontSize":"var(--ifm-font-size-base)","lineHeight":"var(--ifm-line-height-base)","fontWeightLight":"var(--ifm-font-weight-light)","fontWeightRegular":"var(--ifm-font-weight-base)","fontWeightBold":"var(--ifm-font-weight-bold)","headings":{"fontFamily":"var(--ifm-heading-font-family)","fontWeight":"var(--ifm-heading-font-weight)","lineHeight":"var(--ifm-heading-line-height)"},"code":{"fontFamily":"var(--ifm-font-family-monospace)","lineHeight":"var(--ifm-pre-line-height)"}},"sidebar":{"width":"300px","backgroundColor":"#ffffff"},"rightPanel":{"backgroundColor":"#303846"},"colors":{"primary":{"main":"#3F57A6"}},"theme":{"prism":{"additionalLanguages":["scala"]}}},"darkTheme":{"typography":{"fontFamily":"var(--ifm-font-family-base)","fontSize":"var(--ifm-font-size-base)","lineHeight":"var(--ifm-line-height-base)","fontWeightLight":"var(--ifm-font-weight-light)","fontWeightRegular":"var(--ifm-font-weight-base)","fontWeightBold":"var(--ifm-font-weight-bold)","headings":{"fontFamily":"var(--ifm-heading-font-family)","fontWeight":"var(--ifm-heading-font-weight)","lineHeight":"var(--ifm-heading-line-height)"},"code":{"fontFamily":"var(--ifm-font-family-monospace)","lineHeight":"var(--ifm-pre-line-height)"}},"sidebar":{"width":"300px","backgroundColor":"rgb(24, 25, 26)","textColor":"#f5f6f7","arrow":{"color":"#f5f6f7"}},"colors":{"text":{"primary":"#f5f6f7","secondary":"rgba(255, 255, 255, 1)"},"gray":{"50":"#FAFAFA","100":"#F5F5F5"},"border":{"dark":"#ffffff","light":"rgba(0,0,0, 0.1)"},"primary":{"main":"#3F57A6"}},"schema":{"nestedBackground":"rgb(24, 25, 26)","typeNameColor":"rgba(255, 255, 255, 1)","typeTitleColor":"rgba(255, 255, 255, 1)"},"theme":{"prism":{"additionalLanguages":["scala"]}}},"options":{"scrollYOffset":"nav.navbar","expandSingleSchemaField":true,"menuToggle":true,"suppressWarnings":true}}},"docusaurus-plugin-content-docs":{"default":{"path":"/jellyfish-docs/","versions":[{"name":"current","label":"Next","isLast":false,"path":"/jellyfish-docs/next","mainDocId":"introduction/what_is_jellyfish","docs":[{"id":"benchmarks","path":"/jellyfish-docs/next/benchmarks","sidebar":"mainSidebar"},{"id":"benchmarks/hls","path":"/jellyfish-docs/next/benchmarks/hls","sidebar":"mainSidebar"},{"id":"benchmarks/webrtc","path":"/jellyfish-docs/next/benchmarks/webrtc","sidebar":"mainSidebar"},{"id":"cluster","path":"/jellyfish-docs/next/cluster","sidebar":"mainSidebar"},{"id":"deploying/fly_io","path":"/jellyfish-docs/next/deploying/fly_io","sidebar":"mainSidebar"},{"id":"deploying/vps","path":"/jellyfish-docs/next/deploying/vps","sidebar":"mainSidebar"},{"id":"examples","path":"/jellyfish-docs/next/examples"},{"id":"for_developers/api_reference","path":"/jellyfish-docs/next/for_developers/api_reference","sidebar":"mainSidebar"},{"id":"for_developers/api_reference/rest_api","path":"/jellyfish-docs/next/for_developers/api_reference/rest_api","sidebar":"mainSidebar"},{"id":"for_developers/design_docs","path":"/jellyfish-docs/next/for_developers/design_docs","sidebar":"mainSidebar"},{"id":"for_developers/metrics_design","path":"/jellyfish-docs/next/for_developers/metrics_design","sidebar":"mainSidebar"},{"id":"getting_started/architecture","path":"/jellyfish-docs/next/getting_started/architecture","sidebar":"mainSidebar"},{"id":"getting_started/authentication","path":"/jellyfish-docs/next/getting_started/authentication","sidebar":"mainSidebar"},{"id":"getting_started/components/file","path":"/jellyfish-docs/next/getting_started/components/file","sidebar":"mainSidebar"},{"id":"getting_started/components/hls","path":"/jellyfish-docs/next/getting_started/components/hls","sidebar":"mainSidebar"},{"id":"getting_started/components/rtsp","path":"/jellyfish-docs/next/getting_started/components/rtsp","sidebar":"mainSidebar"},{"id":"getting_started/installation","path":"/jellyfish-docs/next/getting_started/installation","sidebar":"mainSidebar"},{"id":"getting_started/metrics","path":"/jellyfish-docs/next/getting_started/metrics","sidebar":"mainSidebar"},{"id":"getting_started/notifications","path":"/jellyfish-docs/next/getting_started/notifications","sidebar":"mainSidebar"},{"id":"getting_started/peers/webrtc","path":"/jellyfish-docs/next/getting_started/peers/webrtc","sidebar":"mainSidebar"},{"id":"getting_started/sdks","path":"/jellyfish-docs/next/getting_started/sdks","sidebar":"mainSidebar"},{"id":"introduction/basic_concepts","path":"/jellyfish-docs/next/introduction/basic_concepts","sidebar":"mainSidebar"},{"id":"introduction/example_scenarios","path":"/jellyfish-docs/next/introduction/example_scenarios","sidebar":"mainSidebar"},{"id":"introduction/what_is_jellyfish","path":"/jellyfish-docs/next/","sidebar":"mainSidebar"},{"id":"release_notes","path":"/jellyfish-docs/next/release_notes","sidebar":"mainSidebar"},{"id":"tutorials/dashboard","path":"/jellyfish-docs/next/tutorials/dashboard","sidebar":"mainSidebar"},{"id":"tutorials/react-native","path":"/jellyfish-docs/next/tutorials/react-native","sidebar":"mainSidebar"},{"id":"tutorials/simple-react-app","path":"/jellyfish-docs/next/tutorials/simple-react-app","sidebar":"mainSidebar"}],"draftIds":[],"sidebars":{"mainSidebar":{"link":{"path":"/jellyfish-docs/next/","label":"introduction/what_is_jellyfish"}}}},{"name":"0.3.0","label":"0.3.0","isLast":true,"path":"/jellyfish-docs/","mainDocId":"introduction/what_is_jellyfish","docs":[{"id":"benchmarks","path":"/jellyfish-docs/benchmarks","sidebar":"mainSidebar"},{"id":"benchmarks/hls","path":"/jellyfish-docs/benchmarks/hls","sidebar":"mainSidebar"},{"id":"benchmarks/webrtc","path":"/jellyfish-docs/benchmarks/webrtc","sidebar":"mainSidebar"},{"id":"cluster","path":"/jellyfish-docs/cluster","sidebar":"mainSidebar"},{"id":"deploying/fly_io","path":"/jellyfish-docs/deploying/fly_io","sidebar":"mainSidebar"},{"id":"deploying/vps","path":"/jellyfish-docs/deploying/vps","sidebar":"mainSidebar"},{"id":"examples","path":"/jellyfish-docs/examples"},{"id":"for_developers/api_reference","path":"/jellyfish-docs/for_developers/api_reference","sidebar":"mainSidebar"},{"id":"for_developers/api_reference/rest_api","path":"/jellyfish-docs/for_developers/api_reference/rest_api","sidebar":"mainSidebar"},{"id":"for_developers/design_docs","path":"/jellyfish-docs/for_developers/design_docs","sidebar":"mainSidebar"},{"id":"for_developers/metrics_design","path":"/jellyfish-docs/for_developers/metrics_design","sidebar":"mainSidebar"},{"id":"getting_started/architecture","path":"/jellyfish-docs/getting_started/architecture","sidebar":"mainSidebar"},{"id":"getting_started/authentication","path":"/jellyfish-docs/getting_started/authentication","sidebar":"mainSidebar"},{"id":"getting_started/components/file","path":"/jellyfish-docs/getting_started/components/file","sidebar":"mainSidebar"},{"id":"getting_started/components/hls","path":"/jellyfish-docs/getting_started/components/hls","sidebar":"mainSidebar"},{"id":"getting_started/components/rtsp","path":"/jellyfish-docs/getting_started/components/rtsp","sidebar":"mainSidebar"},{"id":"getting_started/installation","path":"/jellyfish-docs/getting_started/installation","sidebar":"mainSidebar"},{"id":"getting_started/metrics","path":"/jellyfish-docs/getting_started/metrics","sidebar":"mainSidebar"},{"id":"getting_started/notifications","path":"/jellyfish-docs/getting_started/notifications","sidebar":"mainSidebar"},{"id":"getting_started/peers/webrtc","path":"/jellyfish-docs/getting_started/peers/webrtc","sidebar":"mainSidebar"},{"id":"getting_started/sdks","path":"/jellyfish-docs/getting_started/sdks","sidebar":"mainSidebar"},{"id":"introduction/basic_concepts","path":"/jellyfish-docs/introduction/basic_concepts","sidebar":"mainSidebar"},{"id":"introduction/example_scenarios","path":"/jellyfish-docs/introduction/example_scenarios","sidebar":"mainSidebar"},{"id":"introduction/what_is_jellyfish","path":"/jellyfish-docs/","sidebar":"mainSidebar"},{"id":"release_notes","path":"/jellyfish-docs/release_notes","sidebar":"mainSidebar"},{"id":"tutorials/dashboard","path":"/jellyfish-docs/tutorials/dashboard","sidebar":"mainSidebar"},{"id":"tutorials/react-native","path":"/jellyfish-docs/tutorials/react-native","sidebar":"mainSidebar"},{"id":"tutorials/simple-react-app","path":"/jellyfish-docs/tutorials/simple-react-app","sidebar":"mainSidebar"}],"draftIds":[],"sidebars":{"mainSidebar":{"link":{"path":"/jellyfish-docs/","label":"introduction/what_is_jellyfish"}}}},{"name":"0.2.1","label":"0.2.1","isLast":false,"path":"/jellyfish-docs/0.2.1","mainDocId":"introduction/what_is_jellyfish","docs":[{"id":"cluster","path":"/jellyfish-docs/0.2.1/cluster","sidebar":"mainSidebar"},{"id":"deploying/fly_io","path":"/jellyfish-docs/0.2.1/deploying/fly_io","sidebar":"mainSidebar"},{"id":"deploying/vps","path":"/jellyfish-docs/0.2.1/deploying/vps","sidebar":"mainSidebar"},{"id":"examples","path":"/jellyfish-docs/0.2.1/examples"},{"id":"for_developers/api_reference","path":"/jellyfish-docs/0.2.1/for_developers/api_reference","sidebar":"mainSidebar"},{"id":"for_developers/api_reference/rest_api","path":"/jellyfish-docs/0.2.1/for_developers/api_reference/rest_api","sidebar":"mainSidebar"},{"id":"for_developers/design_docs","path":"/jellyfish-docs/0.2.1/for_developers/design_docs","sidebar":"mainSidebar"},{"id":"getting_started/architecture","path":"/jellyfish-docs/0.2.1/getting_started/architecture","sidebar":"mainSidebar"},{"id":"getting_started/authentication","path":"/jellyfish-docs/0.2.1/getting_started/authentication","sidebar":"mainSidebar"},{"id":"getting_started/components/hls","path":"/jellyfish-docs/0.2.1/getting_started/components/hls","sidebar":"mainSidebar"},{"id":"getting_started/components/rtsp","path":"/jellyfish-docs/0.2.1/getting_started/components/rtsp","sidebar":"mainSidebar"},{"id":"getting_started/installation","path":"/jellyfish-docs/0.2.1/getting_started/installation","sidebar":"mainSidebar"},{"id":"getting_started/metrics","path":"/jellyfish-docs/0.2.1/getting_started/metrics","sidebar":"mainSidebar"},{"id":"getting_started/notifications","path":"/jellyfish-docs/0.2.1/getting_started/notifications","sidebar":"mainSidebar"},{"id":"getting_started/peers/webrtc","path":"/jellyfish-docs/0.2.1/getting_started/peers/webrtc","sidebar":"mainSidebar"},{"id":"getting_started/sdks","path":"/jellyfish-docs/0.2.1/getting_started/sdks","sidebar":"mainSidebar"},{"id":"introduction/basic_concepts","path":"/jellyfish-docs/0.2.1/introduction/basic_concepts","sidebar":"mainSidebar"},{"id":"introduction/example_scenarios","path":"/jellyfish-docs/0.2.1/introduction/example_scenarios","sidebar":"mainSidebar"},{"id":"introduction/what_is_jellyfish","path":"/jellyfish-docs/0.2.1/","sidebar":"mainSidebar"},{"id":"tutorials/dashboard","path":"/jellyfish-docs/0.2.1/tutorials/dashboard","sidebar":"mainSidebar"},{"id":"tutorials/react-native","path":"/jellyfish-docs/0.2.1/tutorials/react-native","sidebar":"mainSidebar"},{"id":"tutorials/simple-react-app","path":"/jellyfish-docs/0.2.1/tutorials/simple-react-app","sidebar":"mainSidebar"}],"draftIds":[],"sidebars":{"mainSidebar":{"link":{"path":"/jellyfish-docs/0.2.1/","label":"introduction/what_is_jellyfish"}}}}],"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 s=n(7529);const l=JSON.parse('{"docusaurusVersion":"2.4.3","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.3"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.3"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.3"},"docusaurus-plugin-redoc":{"type":"package","name":"docusaurus-plugin-redoc","version":"1.6.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.3"},"docusaurus-theme-redoc":{"type":"package","name":"docusaurus-theme-redoc","version":"1.6.3"},"docusaurus-lunr-search":{"type":"package","name":"docusaurus-lunr-search","version":"2.3.2"}}}'),c={siteConfig:a.Z,siteMetadata:l,globalData:o,i18n:i,codeTranslations:s},u=r.createContext(c);function d(e){let{children:t}=e;return r.createElement(u.Provider,{value:c},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(412),o=n(5742),i=n(8780),s=n(5096);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},r.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),r.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),r.createElement(c,{error:t}))}function c(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function u(e){let{error:t,tryAgain:n}=e;return r.createElement(p,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(s.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const d=e=>r.createElement(u,e);class p extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.default.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??d)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>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}},5742:(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)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7462),a=n(7294),o=n(3727),i=n(8780),s=n(2263),l=n(3919),c=n(412);const u=a.createContext({collectLink:()=>{}});var d=n(4996);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:m,isActive:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:{trailingSlash:v,baseUrl:w}}=(0,s.Z)(),{withBaseUrl:_}=(0,d.C)(),E=(0,a.useContext)(u),k=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>k.current));const S=p||f;const x=(0,l.Z)(S),C=S?.replace("pathname://","");let T=void 0!==C?(j=C,b&&(e=>e.startsWith("/"))(j)?_(j):j):void 0;var j;T&&x&&(T=(0,i.applyTrailingSlash)(T,{trailingSlash:v,baseUrl:w}));const P=(0,a.useRef)(!1),A=n?o.OL:o.rU,L=c.default.canUseIntersectionObserver,R=(0,a.useRef)(),O=()=>{P.current||null==T||(window.docusaurus.preload(T),P.current=!0)};(0,a.useEffect)((()=>(!L&&x&&null!=T&&window.docusaurus.prefetch(T),()=>{L&&R.current&&R.current.disconnect()})),[R,T,L,x]);const N=T?.startsWith("#")??!1,I=!T||!x||N;return I||g||E.collectLink(T),I?a.createElement("a",(0,r.Z)({ref:k,href:T},S&&!x&&{target:"_blank",rel:"noopener noreferrer"},y)):a.createElement(A,(0,r.Z)({},y,{onMouseEnter:O,onTouchStart:O,innerRef:e=>{k.current=e,L&&e&&x&&(R.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(R.current.unobserve(e),R.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),R.current.observe(e))},to:T},n&&{isActive:h,activeClassName:m}))}const f=a.forwardRef(p)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l,I:()=>s});var r=n(7294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(7529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function s(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function l(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 s=i({message:t,id:n});return r.createElement(r.Fragment,null,a(s,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(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})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>s});var r=n(7294),a=n(2263),o=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},8084:(e,t,n)=>{"use strict";n.d(t,{OD:()=>o,eZ:()=>i});var r=n(2263),a=n(9935);function o(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}function i(e,t,n){void 0===t&&(t=a.m),void 0===n&&(n={});const r=o(e),i=r?.[t];if(!i&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return i}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const s=a?`${a}.${o}`:o;r(i)?e(i,s):t[s]=i}))}(e),t}},226:(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,...n?.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},4104:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>f,gA:()=>u,_r:()=>l,Jo:()=>m,zh:()=>c,yW:()=>p,gB:()=>d});var r=n(6550),a=n(8084);const o=e=>e.versions.find((e=>e.isLast));function i(e,t){const n=function(e,t){const n=o(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=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 s={},l=()=>(0,a.OD)("docusaurus-plugin-content-docs")??s,c=e=>(0,a.eZ)("docusaurus-plugin-content-docs",e,{failfast:!0});function u(e){void 0===e&&(e={});const t=l(),{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 d(e){return c(e).versions}function p(e){const t=c(e);return o(t)}function f(e){const t=c(e),{pathname:n}=(0,r.TH)();return i(t,n)}function m(e){const t=c(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=o(e);return{latestDocSuggestion:i(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(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()}}},3310:(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(821)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a={iconExternalLink:"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.iconExternalLink},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"}))}},5096:(e,t,n)=>{"use strict";n.d(t,{Z:()=>mt});var r=n(7294),a=n(6010),o=n(4763),i=n(1944),s=n(7462),l=n(6550),c=n(5999),u=n(5936);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,l.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,u.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const m=(0,c.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:a}=f();return r.createElement("div",{ref:n,role:"region","aria-label":m},r.createElement("a",(0,s.Z)({},e,{href:`#${d}`,onClick:a}),t))}var g=n(5281),b=n(9727);const y={skipToContent:"skipToContent_fXgn"};function v(){return r.createElement(h,{className:y.skipToContent})}var w=n(6668),_=n(9689);function E(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...l}=e;return r.createElement("svg",(0,s.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 k={closeButton:"closeButton_CVFx"};function S(e){return r.createElement("button",(0,s.Z)({type:"button","aria-label":(0,c.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,a.Z)("clean-btn close",k.closeButton,e.className)}),r.createElement(E,{width:14,height:14,strokeWidth:3.1}))}const x={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,s.Z)({},e,{className:(0,a.Z)(x.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function j(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,_.nT)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:T.announcementBar,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:T.announcementBarPlaceholder}),r.createElement(C,{className:T.announcementBarContent}),i&&r.createElement(S,{onClick:n,className:T.announcementBarClose}))}var P=n(3163),A=n(2466);var L=n(902),R=n(3102);const O=r.createContext(null);function N(e){let{children:t}=e;const n=function(){const e=(0,P.e)(),t=(0,R.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,L.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(O.Provider,{value:n},t)}function I(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function D(){const e=(0,r.useContext)(O);if(!e)throw new L.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,R.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:I(o)})),[a,o,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=D();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 F=n(2949),B=n(2389);function $(e){return r.createElement("svg",(0,s.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 U(e){return r.createElement("svg",(0,s.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 z={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function H(e){let{className:t,buttonClassName:n,value:o,onChange:i}=e;const s=(0,B.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"===o?(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)(z.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",z.toggleButton,!s&&z.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===o?"light":"dark"),disabled:!s,title:l,"aria-label":l,"aria-live":"polite"},r.createElement($,{className:(0,a.Z)(z.toggleIcon,z.lightToggleIcon)}),r.createElement(U,{className:(0,a.Z)(z.toggleIcon,z.darkToggleIcon)})))}const Z=r.memo(H),W={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function q(e){let{className:t}=e;const n=(0,w.L)().navbar.style,a=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:i}=(0,F.I)();return a?null:r.createElement(Z,{className:t,buttonClassName:"dark"===n?W.darkNavbarColorModeToggle:void 0,value:o,onChange:i})}var V=n(1327);function G(){return r.createElement(V.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,P.e)();return r.createElement("button",{type:"button","aria-label":(0,c.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(E,{color:"var(--ifm-color-emphasis-600)"}))}function K(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(G,null),r.createElement(q,{className:"margin-right--md"}),r.createElement(Y,null))}var X=n(9960),Q=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:l,isDropdownLink:c,prependBaseUrlToHref:u,...d}=e;const p=(0,Q.Z)(a),f=(0,Q.Z)(t),m=(0,Q.Z)(o,{forcePrependBaseUrl:!0}),h=i&&o&&!(0,J.Z)(o),g=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,i,h&&r.createElement(te.Z,c&&{width:12,height:12}))};return o?r.createElement(X.Z,(0,s.Z)({href:u?m:o},d,g)):r.createElement(X.Z,(0,s.Z)({to:p,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(f)},d,g))}function re(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(ne,(0,s.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 ae(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,s.Z)({className:(0,a.Z)("menu__link",t)},o)))}function oe(e){let{mobile:t=!1,position:n,...a}=e;const o=t?ae:re;return r.createElement(o,(0,s.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(6043),se=n(8596),le=n(2263);function ce(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ue(e){let{items:t,position:n,className:o,onClick:i,...l}=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.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[c]),r.createElement("div",{ref:c,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u})},r.createElement(ne,(0,s.Z)({"aria-haspopup":"true","aria-expanded":u,role:"button",href:l.to?void 0:"#",className:(0,a.Z)("navbar__link",o)},l,{onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))}}),l.children??l.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(Te,(0,s.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:o,onClick:i,...c}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,l.TH)();return t.replace(e,"/")}(),d=ce(t,u),{collapsed:p,toggleCollapsed:f,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[u,d,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":p})},r.createElement(ne,(0,s.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},c,{onClick:e=>{e.preventDefault(),f()}}),c.children??c.label),r.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p},t.map(((e,t)=>r.createElement(Te,(0,s.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function pe(e){let{mobile:t=!1,...n}=e;const a=t?de:ue;return r.createElement(a,n)}var fe=n(4711);function me(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,s.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 he="iconLanguage_nlXk";var ge=n(4184),be=n.n(ge),ye=n(8084);const ve=e=>{const t=(0,r.useRef)(!1),a=(0,r.useRef)(null),[o,i]=(0,r.useState)(!1),s=(0,l.k6)(),{siteConfig:c={}}=(0,le.Z)(),u=(0,B.Z)(),{baseUrl:d}=c,p=(0,ye.eZ)("docusaurus-lunr-search"),f=()=>{t.current||(Promise.all([fetch(`${d}${p.fileNames.searchDoc}`).then((e=>e.json())),fetch(`${d}${p.fileNames.lunrIndex}`).then((e=>e.json())),Promise.all([n.e(1336),n.e(23),n.e(3339)]).then(n.bind(n,894)),Promise.all([n.e(532),n.e(3343)]).then(n.bind(n,3343))]).then((e=>{let[t,n,{default:r}]=e;0!==t.length&&(((e,t,n)=>{new n({searchDocs:e,searchIndex:t,baseUrl:d,inputSelector:"#search_input_react",handleSelected:(e,t,n)=>{const r=n.url||"/";document.createElement("a").href=r,s.push(r)}})})(t,n,r),i(!0))})),t.current=!0)},m=(0,r.useCallback)((t=>{a.current.contains(t.target)||a.current.focus(),e.handleSearchBarToggle&&e.handleSearchBarToggle(!e.isSearchBarExpanded)}),[e.isSearchBarExpanded]);return u&&f(),r.createElement("div",{className:"navbar__search",key:"search-box"},r.createElement("span",{"aria-label":"expand searchbar",role:"button",className:be()("search-icon",{"search-icon-hidden":e.isSearchBarExpanded}),onClick:m,onKeyDown:m,tabIndex:0}),r.createElement("input",{id:"search_input_react",type:"search",placeholder:o?"Search":"Loading...","aria-label":"Search",className:be()("navbar__search-input",{"search-bar-expanded":e.isSearchBarExpanded},{"search-bar":!e.isSearchBarExpanded}),onClick:f,onMouseOver:f,onFocus:m,onBlur:m,ref:a,disabled:!o}))},we={searchBox:"searchBox_ZlJk"};function _e(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,we.searchBox)},t)}var Ee=n(4104),ke=n(3438);var Se=n(373);const xe=e=>e.docs.find((t=>t.id===e.mainDocId));const Ce={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,le.Z)(),p=(0,fe.l)(),{search:f,hash:m}=(0,l.TH)(),h=[...n,...u.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${m}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],g=t?(0,c.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return r.createElement(pe,(0,s.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(me,{className:he}),g),items:h}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(_e,{className:n},r.createElement(ve,null))},dropdown:pe,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const s=i?"li":"div";return r.createElement(s,{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,Ee.Iw)(a),l=(0,ke.vY)(t,a);return null===l?null:r.createElement(oe,(0,s.Z)({exact:!0},o,{isActive:()=>i?.path===l.path||!!i?.sidebar&&i.sidebar===l.sidebar,label:n??l.id,to:l.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Ee.Iw)(a),l=(0,ke.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(oe,(0,s.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??l.label,to:l.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,ke.lO)(a)[0],l=t??i.label,c=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(oe,(0,s.Z)({},o,{label:l,to:c}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...u}=e;const{search:d,hash:p}=(0,l.TH)(),f=(0,Ee.Iw)(n),m=(0,Ee.gB)(n),{savePreferredVersionName:h}=(0,Se.J)(n),g=[...o,...m.map((e=>{const t=f.alternateDocVersions[e.name]??xe(e);return{label:e.label,to:`${t.path}${d}${p}`,isActive:()=>e===f.activeVersion,onClick:()=>h(e.name)}})),...i],b=(0,ke.lO)(n)[0],y=t&&g.length>1?(0,c.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,v=t&&g.length>1?void 0:xe(b).path;return g.length<=1?r.createElement(oe,(0,s.Z)({},u,{mobile:t,label:y,to:v,isActive:a?()=>!1:void 0})):r.createElement(pe,(0,s.Z)({},u,{mobile:t,label:y,to:v,items:g,isActive:a?()=>!1:void 0}))}};function Te(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Ce[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function je(){const e=(0,P.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(Te,(0,s.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Pe(e){return r.createElement("button",(0,s.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 Ae(){const e=0===(0,w.L)().navbar.items.length,t=D();return r.createElement(r.Fragment,null,!e&&r.createElement(Pe,{onClick:()=>t.hide()}),t.content)}function Le(){const e=(0,P.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(M,{header:r.createElement(K,null),primaryMenu:r.createElement(je,null),secondaryMenu:r.createElement(Ae,null)}):null}const Re={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Oe(e){return r.createElement("div",(0,s.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Ne(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,P.e)(),{navbarRef:s,isNavbarVisible:l}=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,A.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:s,"aria-label":(0,c.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Re.navbarHideable,!l&&Re.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Oe,{onClick:i.toggle}),r.createElement(Le,null))}var Ie=n(8780);const De={errorBoundaryError:"errorBoundaryError_a6uf"};function Me(e){return r.createElement("button",(0,s.Z)({type:"button"},e),r.createElement(c.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function Fe(e){let{error:t}=e;const n=(0,Ie.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:De.errorBoundaryError},n)}class Be extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const $e="right";function Ue(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,s.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 ze(){const{toggle:e,shown:t}=(0,P.e)();return r.createElement("button",{onClick:e,"aria-label":(0,c.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},r.createElement(Ue,null))}const He={colorModeToggle:"colorModeToggle_DEke"};function Ze(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(Be,{key:t,onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t})},r.createElement(Te,e)))))}function We(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 qe(){const e=(0,P.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??$e)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(We,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(ze,null),r.createElement(G,null),r.createElement(Ze,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(Ze,{items:a}),r.createElement(q,{className:He.colorModeToggle}),!o&&r.createElement(_e,null,r.createElement(ve,null)))})}function Ve(){return r.createElement(Ne,null,r.createElement(qe,null))}function Ge(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...l}=t,c=(0,Q.Z)(n),u=(0,Q.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(X.Z,(0,s.Z)({className:"footer__link-item"},a?{href:i?u:a}:{to:c},l),o,a&&!(0,J.Z)(a)&&r.createElement(te.Z,null))}function Ye(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(Ge,{item:t}))}function Ke(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(Ye,{key:t,item:e})))))}function Xe(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(Ke,{key:t,column:e}))))}function Qe(){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(Ge,{item:t})}function et(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(Qe,null))))))}function tt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(Xe,{columns:t}):r.createElement(et,{links:t})}var nt=n(941);const rt={footerLogoLink:"footerLogoLink_BH7S"};function at(e){let{logo:t}=e;const{withBaseUrl:n}=(0,Q.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(nt.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function ot(e){let{logo:t}=e;return t.href?r.createElement(X.Z,{href:t.href,className:rt.footerLogoLink,target:t.target},r.createElement(at,{logo:t})):r.createElement(at,{logo:t})}function it(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function st(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 lt(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(st,{style:o,links:n&&n.length>0&&r.createElement(tt,{links:n}),logo:a&&r.createElement(ot,{logo:a}),copyright:t&&r.createElement(it,{copyright:t})})}const ct=r.memo(lt),ut=(0,L.Qc)([F.S,_.pl,A.OC,Se.L5,i.VC,function(e){let{children:t}=e;return r.createElement(R.n2,null,r.createElement(P.M,null,r.createElement(N,null,t)))}]);function dt(e){let{children:t}=e;return r.createElement(ut,null,t)}function pt(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("div",{className:"margin-vert--lg"},r.createElement(Me,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(Fe,{error:t})))))}const ft={mainWrapper:"mainWrapper_z2l0"};function mt(e){const{children:t,noFooter:n,wrapperClassName:s,title:l,description:c}=e;return(0,b.t)(),r.createElement(dt,null,r.createElement(i.d,{title:l,description:c}),r.createElement(v,null),r.createElement(j,null),r.createElement(Ve,null),r.createElement("div",{id:d,className:(0,a.Z)(g.k.wrapper.main,ft.mainWrapper,s)},r.createElement(o.Z,{fallback:e=>r.createElement(pt,e)},t)),!n&&r.createElement(ct,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(9960),i=n(4996),s=n(2263),l=n(6668),c=n(941);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)},s=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},s):s}function d(e){const{siteConfig:{title:t}}=(0,s.Z)(),{navbar:{title:n,logo:c}}=(0,l.L)(),{imageClassName:d,titleClassName:p,...f}=e,m=(0,i.Z)(c?.href||"/"),h=n?"":t,g=c?.alt??h;return a.createElement(o.Z,(0,r.Z)({to:m},f,c?.target&&{target:c.target}),c&&a.createElement(u,{logo:c,alt:g,imageClassName:d}),null!=n&&a.createElement("b",{className:p},n))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(5742);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}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7462),a=n(7294),o=n(6010),i=n(2389),s=n(2949);const l={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function c(e){const t=(0,i.Z)(),{colorMode:n}=(0,s.I)(),{sources:c,className:u,alt:d,...p}=e,f=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,f.map((e=>a.createElement("img",(0,r.Z)({key:e,src:c[e],alt:d,className:(0,o.Z)(l.themedImage,l[`themedImage--${e}`],u)},p)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>l,z:()=>g});var r=n(7462),a=n(7294),o=n(412),i=n(1442);const s="ease-in-out";function l(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const c={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?c:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=e.scrollHeight,n=r?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??s}`,height:`${t}px`}}function l(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return d(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=c.height,e.style.overflow=c.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function f(e){if(!o.default.canUseDOM)return e?c:u}function m(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:s,disableSSRStyle:l}=e;const c=(0,a.useRef)(null);return p({collapsibleRef:c,collapsed:n,animation:o}),a.createElement(t,{ref:c,style:l?void 0:f(n),onTransitionEnd:e=>{"height"===e.propertyName&&(d(c.current,n),i?.(n))},className:s},r)}function h(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[s,l]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&l(t)}),[o,t]),o?a.createElement(m,(0,r.Z)({},n,{collapsed:s})):null}function g(e){let{lazy:t,...n}=e;const r=t?h:m;return a.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>f});var r=n(7294),a=n(2389),o=n(12),i=n(902),s=n(6668);const l=(0,o.WA)("docusaurus.announcement.dismiss"),c=(0,o.WA)("docusaurus.announcement.id"),u=()=>"true"===l.get(),d=e=>l.set(String(e)),p=r.createContext(null);function f(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.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(p.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(p);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>g,S:()=>h});var r=n(7294),a=n(412),o=n(902),i=n(12),s=n(6668);const l=r.createContext(void 0),c="theme",u=(0,i.WA)(c),d={light:"light",dark:"dark"},p=e=>e===d.dark?d.dark:d.light,f=e=>a.default.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e),m=e=>{u.set(p(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[a,o]=(0,r.useState)(f(e));(0,r.useEffect)((()=>{t&&u.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&m(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:e),u.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=u.get();null!==t&&i(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===d.dark},setLightTheme(){i(d.light)},setDarkTheme(){i(d.dark)}})),[a,i])}();return r.createElement(l.Provider,{value:n},t)}function g(){const e=(0,r.useContext)(l);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>y,L5:()=>g});var r=n(7294),a=n(4104),o=n(9935),i=n(6668),s=n(3438),l=n(902),c=n(12);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,c.WA)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.WA)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.WA)(u(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const f=r.createContext(null);function m(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,s]=(0,r.useState)((()=>p(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=m();return r.createElement(f.Provider,{value:n},t)}function g(e){let{children:t}=e;return s.cE?r.createElement(h,null,t):r.createElement(r.Fragment,null,t)}function b(){const e=(0,r.useContext)(f);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=b(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>l,b:()=>s});var r=n(7294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function s(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 l(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>d,e:()=>p});var r=n(7294),a=n(3102),o=n(7524),i=n(1980),s=n(6668),l=n(902);const c=r.createContext(void 0);function u(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,s.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[l,c]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(l)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:l})),[e,n,u,l])}function d(e){let{children:t}=e;const n=u();return r.createElement(c.Provider,{value:n},t)}function p(){const e=r.useContext(c);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>s,Zo:()=>l,n2:()=>i});var r=n(7294),a=n(902);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 s(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function l(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,s]=i,l=(0,a.Ql)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},9727:(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)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>c});var r=n(7294),a=n(412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(){return a.default.canUseDOM?window.innerWidth>i?o.desktop:o.mobile:o.ssr}const l=!1;function c(){const[e,t]=(0,r.useState)((()=>l?"ssr":s()));return(0,r.useEffect)((()=>{function e(){t(s())}const n=l?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},5281:(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:{}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},3438:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>p,_F:()=>h,cE:()=>d,hI:()=>_,lO:()=>y,oz:()=>v,s1:()=>b,vY:()=>w});var r=n(7294),a=n(6550),o=n(8790),i=n(4104),s=n(373),l=n(1116),c=n(7392),u=n(8596);const d=!!i._r;function p(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=p(t);if(e)return e}}}const f=(e,t)=>void 0!==e&&(0,u.Mg)(e,t),m=(e,t)=>e.some((e=>h(e,t)));function h(e,t){return"link"===e.type?f(e.href,t):"category"===e.type&&(f(e.href,t)||m(e.items,t))}function g(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,u.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,u.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function b(){const e=(0,l.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?g({sidebarItems:e.items,pathname:t}):null}function y(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,s.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>(0,c.j)([t,n,a].filter(Boolean))),[t,n,a])}function v(e,t){const n=y(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function w(e,t){const n=y(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,c.j)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,s=i.find((e=>(0,a.LX)(r.pathname,e)));if(!s)return null;const l=s.sidebar,c=l?n.docsSidebars[l]:void 0;return{docElement:(0,o.H)(i),sidebarName:l,sidebarItems:c}}},1980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>s,_X:()=>l});var r=n(7294),a=n(6550),o=n(1688),i=n(902);function s(e){!function(e){const t=(0,a.k6)(),n=(0,i.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function l(e){return function(e){const t=(0,a.k6)();return(0,o.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},7392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function a(e){return Array.from(new Set(e))}n.d(t,{j:()=>a,l:()=>r})},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>p,d:()=>u,VC:()=>f});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function s(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(4996),c=n(2263);function u(e){let{title:t,description:n,keywords:a,image:i,children:s}=e;const u=function(e){const{siteConfig:t}=(0,c.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,l.C)(),p=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}),p&&r.createElement("meta",{property:"og:image",content:p}),p&&r.createElement("meta",{name:"twitter:image",content:p}),s)}const d=r.createContext(void 0);function p(e){let{className:t,children:n}=e;const i=r.useContext(d),s=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:s},r.createElement(o.Z,null,r.createElement("html",{className:s})),n)}function f(e){let{children:t}=e;const n=s(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(p,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>c,Ql:()=>l,i6:()=>s,zX:()=>o});var r=n(7294);const a=n(412).default.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 s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function l(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))}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){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=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>l,RF:()=>d,o5:()=>p});var r=n(7294),a=n(412),o=n(2389),i=n(902);const s=r.createContext(void 0);function l(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(s.Provider,{value:n},t)}function c(){const e=(0,r.useContext)(s);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const u=()=>a.default.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 p(){const e=c(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),a=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,r.useLayoutEffect)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:a}}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:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>a});n(2263);const r="default";function a(e,t){return`docs-${e}-${t}`}},12:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>d,WA:()=>u});var r=n(7294),a=n(1688);const o="localStorage";function i(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function s(e){if(void 0===e&&(e=o),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(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),l=!0),null}var t}let l=!1;const c={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(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,listen:t}}(e);const n=s(t?.persistence);return null===n?c:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),i({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),i({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}function d(e,t){const n=(0,r.useRef)((()=>null===e?c:u(e,t))).current(),o=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,a.useSyncExternalStore)(o,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(2263),a=n(6550),o=n(8780);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.Z)(),{pathname:l}=(0,a.TH)(),c=(0,o.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),u=s===i?e:e.replace(`/${s}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6550),o=n(902);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])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},8802:(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)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780: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.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},4750: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});r(n(412)).default.canUseDOM&&(window.Prism=window.Prism||{},window.Prism.manual=!0)},4184:(e,t)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function a(){for(var e=[],t=0;t{"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:()=>f,PP:()=>j,Ep:()=>p});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;p--){var f=i[p];"."===f?o(i,p):".."===f?(o(i,p),d++):d&&(o(i,p),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 s=n(8776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(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 f(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(s){throw s instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}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=f(e,t,h(),w.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(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},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||a}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=f(n);a&&a!==m&&e(t,a,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),h=l(n),g=0;g{"use strict";e.exports=function(e,t,n,r,a,o,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,a,o,i,s],u=0;(l=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},1304:(e,t,n)=>{"use strict";n.r(t)},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(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,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){l(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),s=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&f(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&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,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:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(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;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,a){for(var o,i,s=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),l=1;l{var r=n(5826);e.exports=f,e.exports.parse=o,e.exports.compile=function(e,t){return s(o(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=p;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,s="",u=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],p=n[1],f=n.index;if(s+=e.slice(i,f),i=f+d.length,p)s+=p[1];else{var m=e[i],h=n[2],g=n[3],b=n[4],y=n[5],v=n[6],w=n[7];s&&(r.push(s),s="");var _=null!=h&&null!=m&&m!==h,E="+"===v||"*"===v,k="?"===v||"*"===v,S=n[2]||u,x=b||y;r.push({name:g||o++,prefix:h||"",delimiter:S,optional:k,repeat:E,partial:_,asterisk:!!w,pattern:x?c(x):w?".*":"[^"+l(S)+"]+?"})}}return i{"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);k+=E.value.length,E=E.next){var S=E.value;if(t.length>e.length)return;if(!(S instanceof a)){var x,C=1;if(y){if(!(x=o(_,k,e,b))||x.index>=e.length)break;var T=x.index,j=x.index+x[0].length,P=k;for(P+=E.value.length;T>=P;)P+=(E=E.next).value.length;if(k=P-=E.value.length,E.value instanceof a)continue;for(var A=E;A!==t.tail&&(Pd.reach&&(d.reach=N);var I=E.prev;if(R&&(I=l(t,I,R),k+=R.length),c(t,I,C),E=l(t,I,new a(p,g?r.tokenize(L,g):L,v,L)),O&&l(t,E,O),C>1){var D={cause:p+","+m,reach:N};i(e,t,n,E.prev,k,D),d&&D.reach>d.reach&&(d.reach=D.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,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:'"'},l=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 s=p(/^\{$/,/^\}$/);if(-1===s)continue;for(var l=n;l=0&&f(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 s(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function l(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,l(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=l(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=s(i++,r)););return u[n]=a,n})).join(""),n,r),p=Object.keys(u);return i=0,function e(t){for(var n=0;n=p.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=p[i],o="string"==typeof r?r:r.content,s=o.indexOf(a);if(-1!==s){++i;var l=o.substring(0,s),d=c(u[a]),f=o.substring(s+a.length),m=[];if(l&&m.push(l),m.push(d),f){var h=[f];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(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 p(e){return"string"==typeof e?e:Array.isArray(e)?e.map(p).join(""):p(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(""):""},s=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 l=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(l=i(t[r-1])+l,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",l,null,l)}a.content&&"string"!=typeof a.content&&s(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||s(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,s=i.length;-1!==n.code.indexOf(a=t(r,s));)++s;return i[s]=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(s){for(var l=0;l=o.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[a],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),m=p.indexOf(f);if(m>-1){++a;var h=p.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(m+f.length),y=[];h&&y.push.apply(y,i([h])),y.push(g),b&&y.push.apply(y,i([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return s}(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},8805:()=>{Prism.languages.elixir={doc:{pattern:/@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,inside:{attribute:/^@\w+/,string:/['"][\s\S]+/}},comment:{pattern:/#.*/,greedy:!0},regex:{pattern:/~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,greedy:!0},string:[{pattern:/~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,greedy:!0,inside:{}},{pattern:/("""|''')[\s\S]*?\1/,greedy:!0,inside:{}},{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{}}],atom:{pattern:/(^|[^:]):\w+/,lookbehind:!0,alias:"symbol"},module:{pattern:/\b[A-Z]\w*\b/,alias:"class-name"},"attr-name":/\b\w+\??:(?!:)/,argument:{pattern:/(^|[^&])&\d+/,lookbehind:!0,alias:"variable"},attribute:{pattern:/@\w+/,alias:"variable"},function:/\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,number:/\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,keyword:/\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,boolean:/\b(?:false|nil|true)\b/,operator:[/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,{pattern:/([^<])<(?!<)/,lookbehind:!0},{pattern:/([^>])>(?!>)/,lookbehind:!0}],punctuation:/<<|>>|[.,%\[\]{}()]/},Prism.languages.elixir.string.forEach((function(e){e.inside={interpolation:{pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"punctuation"},rest:Prism.languages.elixir}}}}))},821:(e,t,n)=>{var r={"./prism-elixir":8805};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=821},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 s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes: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