From 6bd87c835ceb7a822da57531e48dcd59a1c6092f Mon Sep 17 00:00:00 2001 From: github-actions-bot Date: Sun, 4 Feb 2024 20:43:41 +0000 Subject: [PATCH] Built and published by Moonwave --- 404.html | 10 ++-- CHANGELOG/index.html | 12 ++-- api/KnitClient/index.html | 52 ++++++++++------ api/KnitServer/index.html | 60 ++++++++++++------- api/index.html | 8 +-- ...a5254.80236dae.js => 1baa5254.c43d1c7d.js} | 2 +- assets/js/5506604c.12f1d03e.js | 1 - assets/js/5506604c.bc8b7bcf.js | 1 + assets/js/8deedfb8.477fa23f.js | 1 + assets/js/8deedfb8.f2f387bf.js | 1 - ...f44fb.0419ac19.js => ad6f44fb.8b9faf41.js} | 2 +- assets/js/ba6452ef.0439b3f9.js | 1 - assets/js/ba6452ef.0993c500.js | 1 + assets/js/d692d782.368e726d.js | 1 - assets/js/d692d782.524015f4.js | 1 + ...e18d7.210a448f.js => da7e18d7.918d6a36.js} | 2 +- .../js/{main.68faddb6.js => main.adf1fc9e.js} | 4 +- ...CENSE.txt => main.adf1fc9e.js.LICENSE.txt} | 0 ...n.9602c061.js => runtime~main.bff7bd60.js} | 2 +- docs/controllers/index.html | 10 ++-- docs/examples/index.html | 10 ++-- docs/executionmodel/index.html | 10 ++-- docs/gettingstarted/index.html | 12 ++-- docs/intro/index.html | 10 ++-- docs/middleware/index.html | 10 ++-- docs/services/index.html | 10 ++-- docs/util/index.html | 10 ++-- docs/vscodesnippets/index.html | 10 ++-- index.html | 10 ++-- lunr-index-1703427410909.json | 1 - lunr-index-1707079391640.json | 1 + lunr-index.json | 2 +- search-doc-1703427410909.json | 1 - search-doc-1707079391640.json | 1 + search-doc.json | 2 +- 35 files changed, 154 insertions(+), 118 deletions(-) rename assets/js/{1baa5254.80236dae.js => 1baa5254.c43d1c7d.js} (87%) delete mode 100644 assets/js/5506604c.12f1d03e.js create mode 100644 assets/js/5506604c.bc8b7bcf.js create mode 100644 assets/js/8deedfb8.477fa23f.js delete mode 100644 assets/js/8deedfb8.f2f387bf.js rename assets/js/{ad6f44fb.0419ac19.js => ad6f44fb.8b9faf41.js} (82%) delete mode 100644 assets/js/ba6452ef.0439b3f9.js create mode 100644 assets/js/ba6452ef.0993c500.js delete mode 100644 assets/js/d692d782.368e726d.js create mode 100644 assets/js/d692d782.524015f4.js rename assets/js/{da7e18d7.210a448f.js => da7e18d7.918d6a36.js} (99%) rename assets/js/{main.68faddb6.js => main.adf1fc9e.js} (99%) rename assets/js/{main.68faddb6.js.LICENSE.txt => main.adf1fc9e.js.LICENSE.txt} (100%) rename assets/js/{runtime~main.9602c061.js => runtime~main.bff7bd60.js} (91%) delete mode 100644 lunr-index-1703427410909.json create mode 100644 lunr-index-1707079391640.json delete mode 100644 search-doc-1703427410909.json create mode 100644 search-doc-1707079391640.json diff --git a/404.html b/404.html index 63ad983d..83079f15 100644 --- a/404.html +++ b/404.html @@ -4,13 +4,13 @@ Page Not Found | Knit - - + +
-
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.

- - +
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/CHANGELOG/index.html b/CHANGELOG/index.html index 4397e5b2..d8b9804c 100644 --- a/CHANGELOG/index.html +++ b/CHANGELOG/index.html @@ -3,14 +3,14 @@ -Knit - - +Knit + +
-
Skip to main content

1.6.0

  • Add support for UnreliableRemoteEvents (using Knit.CreateUnreliableSignal() on server)
  • Update dependencies

1.5.3

  • Fix incorrect RunService call

1.5.2

  • Update dependencies
  • Prevent KnitServer from destroying itself in edit mode

1.5.1

  • Bugfix for main Knit init file

1.5.0

  • Code styling
  • Utilize newer Luau features
  • Migrate to Aftman
  • General repository cleanup
  • Update dependencies

1.4.7

  • Update dependencies for bundled version of Knit

1.4.6

  • Update Comm dependency with new methods
  • Update TableUtil (in bundled version) to use table.clone internally where appropriate

1.4.5

  • Update dependencies
  • Use Promise v4

1.4.4

  • Add memory categories per service and controller to help track memory usage
  • Update dependencies

1.4.3

  • Update Component dependency
  • Update Input dependency
  • Update Signal dependency
  • Update Timer dependency
  • Update Trove dependency

1.4.2

  • Update dependencies to latest

1.4.1

  • Update the Comm module to patch a middleware bug only affecting middleware that tries to change number of arguments (i.e. injecting custom arguments will now be fixed)
  • Documentation improvements

1.4.0

  • Add ability to set independent middleware per service, but on the server and the client
  • Added tutorial video links
  • Add short-circuit evaluation to GetService and GetController functions for better performance when the service/controller exists
  • Change Comm module to use service name as namespace instead of nested __comm__ folder
  • Documentation improvements
  • Breaking changes to middleware assignment (now within one Middleware table instead of two for inbound/outbound)

1.3.0

  • Add support for RemoteProperties via Comm library

1.2.1

  • Add updated dependencies to the wally_bundle.toml dependency list

1.2.0

  • Added options to include middleware

1.1.0-rc.2

  • Removed Services and Controllers properties to force use of GetService and GetController functions
  • Add KnitOptions argument for KnitClient to toggle whether service methods simply yield or return promises (promises by default)
  • Various documentation improvements

1.1.0-rc.1

  • Migrated all core modules to Wally
  • Revamped documentation

0.0.22-alpha

  • Fix TableUtil.Sample algorithm to properly implement a partial Fisher-Yates shuffle
  • Fix TableUtil.Reduce to handle the init parameter properly
  • Update Janitor to v1.13.6
  • Small documentation adjustments

0.0.21-alpha

  • Fix issue with having multiple required components
  • Adds Sample and Zip to TableUtil
  • Improvements to Timer module

0.0.20-alpha

  • Fixes bug with Timer class
  • Updates Janitor
  • Removes unnecessary parentheses
  • Adds some more Luau types

0.0.19-alpha

  • New Signal implementation
  • Remove Thread module in favor of new task.spawn and task.defer functions
  • Add Janitor / Remove Maid
  • Add Timer module

0.0.18-alpha

Components

  • Added optional RequiredComponents table for components
  • Added Observe method for components
  • Fixed Added and Removed events not being cleaned up when component class destroyed
  • Fixed lifecycle RunService method bindings not being cleaned up properly for future reuse

Documentation

Stability

  • Upgraded CI/CD pipeline to use latest packages

0.0.17-alpha

  • Hotfix for TableUtil Sync, Assign, Extend, and Shuffle functions to do shallow copies instead of deep copies
  • Fix release GitHub action to properly use "Knit" as the top-level directory name within the zipped file
  • Fix documentation to properly use user preference theme (light/dark)

0.0.16-alpha

[BR] = Breaking Change

  • Project directory restructure
  • Can now include Knit as a Git submodule and reference the default rojo project to sync in (see below)
  • Added unit tests for Knit-specific utility modules
  • Added simple integration tests
  • TableUtil fixes, additions, and improvements:
    • [BR] All functions (except FastRemove and FastRemoveFirstValue) no longer mutate table
    • Fix Filter bug introduced in v0.0.15-alpha
    • Fix behavior of Extend to extend arrays and not dictionaries (use Assign to extend a dictionary)
    • Add optional RNG override parameter for Shuffle
    • Add Flat, FlatMap, Keys, Find, Every, and Some functions
    • Add documentation page for TableUtil
  • Simplify Knit.OnStart() internally to use Promise.FromEvent
  • Update Rojo version used by CI/CD pipeline
  • Fix broken links in documentation pages

0.0.15-alpha

  • Memory leak fixed with Streamable when instance was immediately available
  • Knit.GetService(serviceName) added to server-side Knit
  • Minor improvements to TableUtil
  • Util documentation split across multiple pages

0.0.14-alpha

  • Fix Signal leak when firing with no connections
  • Change ._instance to .Instance in Component
  • Components will use attributes to store unique ID instead of StringValue
  • Add Signal.Proxy constructor to wrap built-in RBXScriptSignals
  • Add Maid:GivePromise method
  • Allow dictionary tables in StreamableUtil.Compound observers list

Note breaking changes from above:

  • When upgrading, make sure to change ._instance field accessors to .Instance for components
  • ServerID StringValue for components has been switched to use attributes: instance:GetAttribute("ComponentServerId")

0.0.13-alpha

  • Component:WaitFor has been rewritten to utilize built-in promise features better, which also eliminated an existing event connection leak.
  • Streamable and StreamableUtil modules added to easily manage parts that may stream in & out during runtime when using StreamingEnabled.
  • Documentation improvements.

0.0.12-alpha

  • Added new 'Add' functions to automatically load all modules in a folder. This is useful for quickly loading a bunch of service or controller modules:
    • KnitServer.AddServices(folder: Instance)
    • KnitServer.AddServicesDeep(folder: Instance)
    • KnitClient.AddControllers(folder: Instance)
    • KnitClient.AddControllersDeep(folder: Instance)
  • Split up remotes to server/client versions:
    • RemoteEvent -> RemoteSignal and ClientRemoteSignal
    • RemoteProperty -> RemoteProperty and ClientRemoteProperty
  • Knit module isn't required to live in ReplicatedStorage now
  • Added EnumList class which wraps Symbols to create pseudo-enums
  • Added style guide in documentation

0.0.11-alpha

  • Documentation fixes and additions
  • Better table support for RemoteProperty class
  • Fixes and additions to Option class
  • Optional behavior argument for Thread.DelayRepeat
    • Note: If using var-args list for DelayRepeat, this is a breaking change. DelayRepeat's third argument must be the behavior (Thread.DelayRepeatBehavior.Delayed or Thread.DelayRepeatBehavior.Immediate).
  • Added Symbol class

0.0.10-alpha

  • Switch default branch from master to main
  • Component:WaitFor first arg can now be a name or instance
  • Init for individual components is called after a heartbeat, which helps allow components to get other components without race conditions when Component.Auto is used.

0.0.9-alpha

  • Fixed issue where remote objects were parented before services completed initialization. This created a possible race condition between services initializing and clients loading Knit.

0.0.8-alpha

  • Added Option class for creating optionals.
  • Added serialization/deserialization automatic flow for RemoteEvents and RemoteFunctions.
  • Upgraded Promise to v3.0.1.

0.0.7-alpha

  • Added a few tests (very few so far)
  • Added PascalCase methods to Promise module
  • Components will only trigger for instances that are descendants of Players or Workspace by default
  • GitHub workflow to auto-publish the Knit module to Roblox.

0.0.6-alpha

  • Add more functionality to Component module

0.0.5-alpha

  • Added Component class, which allows developers to bind component classes to in-game instances using the CollectionService tags
  • Renamed Event to Signal

0.0.4-alpha

  • Ability to use tables within RemoteProperty object
  • RemoteProperty now has property:Replicate() method server-side that must be called when a table value is changed (see doc)

0.0.3-alpha

  • Add more documentation
  • Inject Player field into KnitClient

0.0.2-alpha

  • Add Knit.OnStart() to capture when Knit starts
  • Add RemoteEvent and RemoteProperty
  • Add documentation

0.0.1-alpha

  • Initial release
- - +
Skip to main content

1.7.0

  • Adds Knit.GetServices() function server-side
  • Adds Knit.GetControllers() function client-side
  • Freezes services/controllers tables so that they can be safely returned in the functions listed above.
  • Update GitHub workflow dependencies

1.6.0

  • Add support for UnreliableRemoteEvents (using Knit.CreateUnreliableSignal() on server)
  • Update dependencies

1.5.3

  • Fix incorrect RunService call

1.5.2

  • Update dependencies
  • Prevent KnitServer from destroying itself in edit mode

1.5.1

  • Bugfix for main Knit init file

1.5.0

  • Code styling
  • Utilize newer Luau features
  • Migrate to Aftman
  • General repository cleanup
  • Update dependencies

1.4.7

  • Update dependencies for bundled version of Knit

1.4.6

  • Update Comm dependency with new methods
  • Update TableUtil (in bundled version) to use table.clone internally where appropriate

1.4.5

  • Update dependencies
  • Use Promise v4

1.4.4

  • Add memory categories per service and controller to help track memory usage
  • Update dependencies

1.4.3

  • Update Component dependency
  • Update Input dependency
  • Update Signal dependency
  • Update Timer dependency
  • Update Trove dependency

1.4.2

  • Update dependencies to latest

1.4.1

  • Update the Comm module to patch a middleware bug only affecting middleware that tries to change number of arguments (i.e. injecting custom arguments will now be fixed)
  • Documentation improvements

1.4.0

  • Add ability to set independent middleware per service, but on the server and the client
  • Added tutorial video links
  • Add short-circuit evaluation to GetService and GetController functions for better performance when the service/controller exists
  • Change Comm module to use service name as namespace instead of nested __comm__ folder
  • Documentation improvements
  • Breaking changes to middleware assignment (now within one Middleware table instead of two for inbound/outbound)

1.3.0

  • Add support for RemoteProperties via Comm library

1.2.1

  • Add updated dependencies to the wally_bundle.toml dependency list

1.2.0

  • Added options to include middleware

1.1.0-rc.2

  • Removed Services and Controllers properties to force use of GetService and GetController functions
  • Add KnitOptions argument for KnitClient to toggle whether service methods simply yield or return promises (promises by default)
  • Various documentation improvements

1.1.0-rc.1

  • Migrated all core modules to Wally
  • Revamped documentation

0.0.22-alpha

  • Fix TableUtil.Sample algorithm to properly implement a partial Fisher-Yates shuffle
  • Fix TableUtil.Reduce to handle the init parameter properly
  • Update Janitor to v1.13.6
  • Small documentation adjustments

0.0.21-alpha

  • Fix issue with having multiple required components
  • Adds Sample and Zip to TableUtil
  • Improvements to Timer module

0.0.20-alpha

  • Fixes bug with Timer class
  • Updates Janitor
  • Removes unnecessary parentheses
  • Adds some more Luau types

0.0.19-alpha

  • New Signal implementation
  • Remove Thread module in favor of new task.spawn and task.defer functions
  • Add Janitor / Remove Maid
  • Add Timer module

0.0.18-alpha

Components

  • Added optional RequiredComponents table for components
  • Added Observe method for components
  • Fixed Added and Removed events not being cleaned up when component class destroyed
  • Fixed lifecycle RunService method bindings not being cleaned up properly for future reuse

Documentation

Stability

  • Upgraded CI/CD pipeline to use latest packages

0.0.17-alpha

  • Hotfix for TableUtil Sync, Assign, Extend, and Shuffle functions to do shallow copies instead of deep copies
  • Fix release GitHub action to properly use "Knit" as the top-level directory name within the zipped file
  • Fix documentation to properly use user preference theme (light/dark)

0.0.16-alpha

[BR] = Breaking Change

  • Project directory restructure
  • Can now include Knit as a Git submodule and reference the default rojo project to sync in (see below)
  • Added unit tests for Knit-specific utility modules
  • Added simple integration tests
  • TableUtil fixes, additions, and improvements:
    • [BR] All functions (except FastRemove and FastRemoveFirstValue) no longer mutate table
    • Fix Filter bug introduced in v0.0.15-alpha
    • Fix behavior of Extend to extend arrays and not dictionaries (use Assign to extend a dictionary)
    • Add optional RNG override parameter for Shuffle
    • Add Flat, FlatMap, Keys, Find, Every, and Some functions
    • Add documentation page for TableUtil
  • Simplify Knit.OnStart() internally to use Promise.FromEvent
  • Update Rojo version used by CI/CD pipeline
  • Fix broken links in documentation pages

0.0.15-alpha

  • Memory leak fixed with Streamable when instance was immediately available
  • Knit.GetService(serviceName) added to server-side Knit
  • Minor improvements to TableUtil
  • Util documentation split across multiple pages

0.0.14-alpha

  • Fix Signal leak when firing with no connections
  • Change ._instance to .Instance in Component
  • Components will use attributes to store unique ID instead of StringValue
  • Add Signal.Proxy constructor to wrap built-in RBXScriptSignals
  • Add Maid:GivePromise method
  • Allow dictionary tables in StreamableUtil.Compound observers list

Note breaking changes from above:

  • When upgrading, make sure to change ._instance field accessors to .Instance for components
  • ServerID StringValue for components has been switched to use attributes: instance:GetAttribute("ComponentServerId")

0.0.13-alpha

  • Component:WaitFor has been rewritten to utilize built-in promise features better, which also eliminated an existing event connection leak.
  • Streamable and StreamableUtil modules added to easily manage parts that may stream in & out during runtime when using StreamingEnabled.
  • Documentation improvements.

0.0.12-alpha

  • Added new 'Add' functions to automatically load all modules in a folder. This is useful for quickly loading a bunch of service or controller modules:
    • KnitServer.AddServices(folder: Instance)
    • KnitServer.AddServicesDeep(folder: Instance)
    • KnitClient.AddControllers(folder: Instance)
    • KnitClient.AddControllersDeep(folder: Instance)
  • Split up remotes to server/client versions:
    • RemoteEvent -> RemoteSignal and ClientRemoteSignal
    • RemoteProperty -> RemoteProperty and ClientRemoteProperty
  • Knit module isn't required to live in ReplicatedStorage now
  • Added EnumList class which wraps Symbols to create pseudo-enums
  • Added style guide in documentation

0.0.11-alpha

  • Documentation fixes and additions
  • Better table support for RemoteProperty class
  • Fixes and additions to Option class
  • Optional behavior argument for Thread.DelayRepeat
    • Note: If using var-args list for DelayRepeat, this is a breaking change. DelayRepeat's third argument must be the behavior (Thread.DelayRepeatBehavior.Delayed or Thread.DelayRepeatBehavior.Immediate).
  • Added Symbol class

0.0.10-alpha

  • Switch default branch from master to main
  • Component:WaitFor first arg can now be a name or instance
  • Init for individual components is called after a heartbeat, which helps allow components to get other components without race conditions when Component.Auto is used.

0.0.9-alpha

  • Fixed issue where remote objects were parented before services completed initialization. This created a possible race condition between services initializing and clients loading Knit.

0.0.8-alpha

  • Added Option class for creating optionals.
  • Added serialization/deserialization automatic flow for RemoteEvents and RemoteFunctions.
  • Upgraded Promise to v3.0.1.

0.0.7-alpha

  • Added a few tests (very few so far)
  • Added PascalCase methods to Promise module
  • Components will only trigger for instances that are descendants of Players or Workspace by default
  • GitHub workflow to auto-publish the Knit module to Roblox.

0.0.6-alpha

  • Add more functionality to Component module

0.0.5-alpha

  • Added Component class, which allows developers to bind component classes to in-game instances using the CollectionService tags
  • Renamed Event to Signal

0.0.4-alpha

  • Ability to use tables within RemoteProperty object
  • RemoteProperty now has property:Replicate() method server-side that must be called when a table value is changed (see doc)

0.0.3-alpha

  • Add more documentation
  • Inject Player field into KnitClient

0.0.2-alpha

  • Add Knit.OnStart() to capture when Knit starts
  • Add RemoteEvent and RemoteProperty
  • Add documentation

0.0.1-alpha

  • Initial release
+ + \ No newline at end of file diff --git a/api/KnitClient/index.html b/api/KnitClient/index.html index 78b76980..c44e42e5 100644 --- a/api/KnitClient/index.html +++ b/api/KnitClient/index.html @@ -4,8 +4,8 @@ KnitClient | Knit - - + +
@@ -57,16 +57,16 @@
print("MyController initialized") end -

AddControllers

</>
KnitClient.AddControllers(parentInstance) → {Controller}
+

AddControllers

</>
KnitClient.AddControllers(parentInstance) → {Controller}

Requires all the modules that are children of the given parent. This is an easy way to quickly load all controllers that might be in a folder.

Knit.AddControllers(somewhere.Controllers)
 
-

AddControllersDeep

</>
KnitClient.AddControllersDeep(parentInstance) → {Controller}
+

AddControllersDeep

</>
KnitClient.AddControllersDeep(parentInstance) → {Controller}

Requires all the modules that are descendants of the given parent.

-

GetService

</>
KnitClient.GetService(serviceNamestring) → Service

Types

interface Service {
[any]any
}
+

GetService

</>
KnitClient.GetService(serviceNamestring) → Service

Types

interface Service {
[any]any
}

Returns a Service object which is a reflection of the remote objects within the Client table of the given service. Throws an error if the @@ -126,12 +126,14 @@

-

GetController

</>
KnitClient.GetController(controllerNamestring) → Controller
+

GetController

</>
KnitClient.GetController(controllerNamestring) → Controller

Gets the controller by name. Throws an error if the controller is not found.

-

Start

</>
KnitClient.Start(optionsKnitOptions?) → Promise
+

GetControllers

</>
KnitClient.GetControllers() → {[string]Controller}
+

Gets a table of all controllers.

+

Start

</>
KnitClient.Start(optionsKnitOptions?) → Promise

Starts Knit. Should only be called once per client.

Knit.Start():andThen(function()
 	print("Knit started!")
@@ -145,7 +147,7 @@ 
print("Knit started!") end):catch(warn)
-

OnStart

</>
KnitClient.OnStart() → Promise
+

OnStart

</>
KnitClient.OnStart() → Promise

Returns a promise that is resolved once Knit has started. This is useful for any code that needs to tie into Knit controllers but is not the script @@ -198,7 +200,7 @@

- - +}
+ + \ No newline at end of file diff --git a/api/KnitServer/index.html b/api/KnitServer/index.html index a9256651..54433631 100644 --- a/api/KnitServer/index.html +++ b/api/KnitServer/index.html @@ -30,8 +30,8 @@ print("Knit started") end):catch(warn) ```"> - - + +
@@ -108,18 +108,20 @@
print("MyService initialize") end -

AddServices

</>
KnitServer.AddServices(parentInstance) → {Service}
+

AddServices

</>
KnitServer.AddServices(parentInstance) → {Service}

Requires all the modules that are children of the given parent. This is an easy way to quickly load all services that might be in a folder.

Knit.AddServices(somewhere.Services)
 
-

AddServicesDeep

</>
KnitServer.AddServicesDeep(parentInstance) → {Service}
+

AddServicesDeep

</>
KnitServer.AddServicesDeep(parentInstance) → {Service}

Requires all the modules that are descendants of the given parent.

-

GetService

</>
KnitServer.GetService(serviceNamestring) → Service
+

GetService

</>
KnitServer.GetService(serviceNamestring) → Service

Gets the service by name. Throws an error if the service is not found.

-

CreateSignal

</>
KnitServer.CreateSignal() → SIGNAL_MARKER
+

GetServices

</>
KnitServer.GetServices() → {[string]Service}
+

Gets a table of all services.

+

CreateSignal

</>
KnitServer.CreateSignal() → SIGNAL_MARKER

Returns a marker that will transform the current key into a RemoteSignal once the service is created. Should only @@ -143,7 +145,7 @@

.Client.MySignal:Connect(function(player, ...) end) end -

CreateUnreliableSignal

</>
KnitServer.CreateUnreliableSignal() → UNRELIABLE_SIGNAL_MARKER
+

CreateUnreliableSignal

</>
KnitServer.CreateUnreliableSignal() → UNRELIABLE_SIGNAL_MARKER

Returns a marker that will transform the current key into an unreliable RemoteSignal once the service is created. Should @@ -172,7 +174,7 @@

-

CreateProperty

</>
KnitServer.CreateProperty(initialValueany) → PROPERTY_MARKER
+

CreateProperty

</>
KnitServer.CreateProperty(initialValueany) → PROPERTY_MARKER

Returns a marker that will transform the current key into a RemoteProperty once the service is created. Should only @@ -201,7 +203,7 @@

.Client.MyProperty:Set("HelloWorldAgain") end -

Start

</>
KnitServer.Start(optionsKnitOptions?) → Promise
+

Start

</>
KnitServer.Start(optionsKnitOptions?) → Promise

Starts Knit. Should only be called once.

Optionally, KnitOptions can be passed in order to set @@ -238,7 +240,7 @@

print("Knit started!") end):catch(warn) -

OnStart

</>
KnitServer.OnStart() → Promise
+

OnStart

</>
KnitServer.OnStart() → Promise

Returns a promise that is resolved once Knit has started. This is useful for any code that needs to tie into Knit services but is not the script @@ -291,7 +293,7 @@

- - +}
+ + \ No newline at end of file diff --git a/api/index.html b/api/index.html index 9d8022da..c2c14378 100644 --- a/api/index.html +++ b/api/index.html @@ -4,13 +4,13 @@ Knit - - + +
- - + + \ No newline at end of file diff --git a/assets/js/1baa5254.80236dae.js b/assets/js/1baa5254.c43d1c7d.js similarity index 87% rename from assets/js/1baa5254.80236dae.js rename to assets/js/1baa5254.c43d1c7d.js index f1fcb3cf..d9150f9a 100644 --- a/assets/js/1baa5254.80236dae.js +++ b/assets/js/1baa5254.c43d1c7d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[25],{40088:e=>{e.exports=JSON.parse('[{"value":"Types","id":"types","level":2},{"value":"KnitOptions","id":"KnitOptions","level":3},{"value":"Middleware","id":"Middleware","level":3},{"value":"ServerMiddleware","id":"ServerMiddleware","level":3},{"value":"ServerMiddlewareFn","id":"ServerMiddlewareFn","level":3},{"value":"Service","id":"Service","level":3},{"value":"ServiceClient","id":"ServiceClient","level":3},{"value":"ServiceDef","id":"ServiceDef","level":3},{"value":"Properties","id":"properties","level":2},{"value":"Util","id":"Util","level":3},{"value":"Functions","id":"functions","level":2},{"value":".AddServices","id":"AddServices","level":3},{"value":".AddServicesDeep","id":"AddServicesDeep","level":3},{"value":".CreateProperty","id":"CreateProperty","level":3},{"value":".CreateService","id":"CreateService","level":3},{"value":".CreateSignal","id":"CreateSignal","level":3},{"value":".CreateUnreliableSignal","id":"CreateUnreliableSignal","level":3},{"value":".GetService","id":"GetService","level":3},{"value":".OnStart","id":"OnStart","level":3},{"value":".Start","id":"Start","level":3}]')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[25],{40088:e=>{e.exports=JSON.parse('[{"value":"Types","id":"types","level":2},{"value":"KnitOptions","id":"KnitOptions","level":3},{"value":"Middleware","id":"Middleware","level":3},{"value":"ServerMiddleware","id":"ServerMiddleware","level":3},{"value":"ServerMiddlewareFn","id":"ServerMiddlewareFn","level":3},{"value":"Service","id":"Service","level":3},{"value":"ServiceClient","id":"ServiceClient","level":3},{"value":"ServiceDef","id":"ServiceDef","level":3},{"value":"Properties","id":"properties","level":2},{"value":"Util","id":"Util","level":3},{"value":"Functions","id":"functions","level":2},{"value":".AddServices","id":"AddServices","level":3},{"value":".AddServicesDeep","id":"AddServicesDeep","level":3},{"value":".CreateProperty","id":"CreateProperty","level":3},{"value":".CreateService","id":"CreateService","level":3},{"value":".CreateSignal","id":"CreateSignal","level":3},{"value":".CreateUnreliableSignal","id":"CreateUnreliableSignal","level":3},{"value":".GetService","id":"GetService","level":3},{"value":".GetServices","id":"GetServices","level":3},{"value":".OnStart","id":"OnStart","level":3},{"value":".Start","id":"Start","level":3}]')}}]); \ No newline at end of file diff --git a/assets/js/5506604c.12f1d03e.js b/assets/js/5506604c.12f1d03e.js deleted file mode 100644 index 5ad5a000..00000000 --- a/assets/js/5506604c.12f1d03e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[662],{63193:e=>{e.exports=JSON.parse('{"functions":[{"name":"CreateService","desc":"Constructs a new service.\\n\\n:::caution\\nServices must be created _before_ calling `Knit.Start()`.\\n:::\\n```lua\\n-- Create a service\\nlocal MyService = Knit.CreateService {\\n\\tName = \\"MyService\\",\\n\\tClient = {},\\n}\\n\\n-- Expose a ToAllCaps remote function to the clients\\nfunction MyService.Client:ToAllCaps(player, msg)\\n\\treturn msg:upper()\\nend\\n\\n-- Knit will call KnitStart after all services have been initialized\\nfunction MyService:KnitStart()\\n\\tprint(\\"MyService started\\")\\nend\\n\\n-- Knit will call KnitInit when Knit is first started\\nfunction MyService:KnitInit()\\n\\tprint(\\"MyService initialize\\")\\nend\\n```","params":[{"name":"serviceDef","desc":"","lua_type":"ServiceDef"}],"returns":[{"desc":"","lua_type":"Service\\n"}],"function_type":"static","source":{"line":183,"path":"src/KnitServer.lua"}},{"name":"AddServices","desc":"Requires all the modules that are children of the given parent. This is an easy\\nway to quickly load all services that might be in a folder.\\n```lua\\nKnit.AddServices(somewhere.Services)\\n```","params":[{"name":"parent","desc":"","lua_type":"Instance"}],"returns":[{"desc":"","lua_type":"{ Service }\\n"}],"function_type":"static","source":{"line":208,"path":"src/KnitServer.lua"}},{"name":"AddServicesDeep","desc":"Requires all the modules that are descendants of the given parent.","params":[{"name":"parent","desc":"","lua_type":"Instance"}],"returns":[{"desc":"","lua_type":"{ Service }\\n"}],"function_type":"static","source":{"line":222,"path":"src/KnitServer.lua"}},{"name":"GetService","desc":"Gets the service by name. Throws an error if the service is not found.","params":[{"name":"serviceName","desc":"","lua_type":"string"}],"returns":[{"desc":"","lua_type":"Service\\n"}],"function_type":"static","source":{"line":236,"path":"src/KnitServer.lua"}},{"name":"CreateSignal","desc":"Returns a marker that will transform the current key into\\na RemoteSignal once the service is created. Should only\\nbe called within the Client table of a service.\\n\\nSee [RemoteSignal](https://sleitnick.github.io/RbxUtil/api/RemoteSignal)\\ndocumentation for more info.\\n```lua\\nlocal MyService = Knit.CreateService {\\n\\tName = \\"MyService\\",\\n\\tClient = {\\n\\t\\t-- Create the signal marker, which will turn into a\\n\\t\\t-- RemoteSignal when Knit.Start() is called:\\n\\t\\tMySignal = Knit.CreateSignal(),\\n\\t},\\n}\\n\\nfunction MyService:KnitInit()\\n\\t-- Connect to the signal:\\n\\tself.Client.MySignal:Connect(function(player, ...) end)\\nend\\n```","params":[],"returns":[{"desc":"","lua_type":"SIGNAL_MARKER"}],"function_type":"static","source":{"line":266,"path":"src/KnitServer.lua"}},{"name":"CreateUnreliableSignal","desc":"Returns a marker that will transform the current key into\\nan unreliable RemoteSignal once the service is created. Should\\nonly be called within the Client table of a service.\\n\\nSee [RemoteSignal](https://sleitnick.github.io/RbxUtil/api/RemoteSignal)\\ndocumentation for more info.\\n\\n:::info Unreliable Events\\nInternally, this uses UnreliableRemoteEvents, which allows for\\nnetwork communication that is unreliable and unordered. This is\\nuseful for events that are not crucial for gameplay, since the\\ndelivery of the events may occur out of order or not at all.\\n\\nSee the documentation for [UnreliableRemoteEvents](https://create.roblox.com/docs/reference/engine/classes/UnreliableRemoteEvent)\\nfor more info.","params":[],"returns":[{"desc":"","lua_type":"UNRELIABLE_SIGNAL_MARKER"}],"function_type":"static","source":{"line":289,"path":"src/KnitServer.lua"}},{"name":"CreateProperty","desc":"Returns a marker that will transform the current key into\\na RemoteProperty once the service is created. Should only\\nbe called within the Client table of a service. An initial\\nvalue can be passed along as well.\\n\\nRemoteProperties are great for replicating data to all of\\nthe clients. Different data can also be set per client.\\n\\nSee [RemoteProperty](https://sleitnick.github.io/RbxUtil/api/RemoteProperty)\\ndocumentation for more info.\\n\\n```lua\\nlocal MyService = Knit.CreateService {\\n\\tName = \\"MyService\\",\\n\\tClient = {\\n\\t\\t-- Create the property marker, which will turn into a\\n\\t\\t-- RemoteProperty when Knit.Start() is called:\\n\\t\\tMyProperty = Knit.CreateProperty(\\"HelloWorld\\"),\\n\\t},\\n}\\n\\nfunction MyService:KnitInit()\\n\\t-- Change the value of the property:\\n\\tself.Client.MyProperty:Set(\\"HelloWorldAgain\\")\\nend\\n```","params":[{"name":"initialValue","desc":"","lua_type":"any"}],"returns":[{"desc":"","lua_type":"PROPERTY_MARKER"}],"function_type":"static","source":{"line":322,"path":"src/KnitServer.lua"}},{"name":"Start","desc":"Starts Knit. Should only be called once.\\n\\nOptionally, `KnitOptions` can be passed in order to set\\nKnit\'s custom configurations.\\n\\n:::caution\\nBe sure that all services have been created _before_\\ncalling `Start`. Services cannot be added later.\\n:::\\n\\n```lua\\nKnit.Start():andThen(function()\\n\\tprint(\\"Knit started!\\")\\nend):catch(warn)\\n```\\n\\nExample of Knit started with options:\\n```lua\\nKnit.Start({\\n\\tMiddleware = {\\n\\t\\tInbound = {\\n\\t\\t\\tfunction(player, args)\\n\\t\\t\\t\\tprint(\\"Player is giving following args to server:\\", args)\\n\\t\\t\\t\\treturn true\\n\\t\\t\\tend\\n\\t\\t},\\n\\t},\\n}):andThen(function()\\n\\tprint(\\"Knit started!\\")\\nend):catch(warn)\\n```","params":[{"name":"options","desc":"","lua_type":"KnitOptions?"}],"returns":[{"desc":"","lua_type":"Promise"}],"function_type":"static","source":{"line":360,"path":"src/KnitServer.lua"}},{"name":"OnStart","desc":"Returns a promise that is resolved once Knit has started. This is useful\\nfor any code that needs to tie into Knit services but is not the script\\nthat called `Start`.\\n```lua\\nKnit.OnStart():andThen(function()\\n\\tlocal MyService = Knit.Services.MyService\\n\\tMyService:DoSomething()\\nend):catch(warn)\\n```","params":[],"returns":[{"desc":"","lua_type":"Promise"}],"function_type":"static","source":{"line":452,"path":"src/KnitServer.lua"}}],"properties":[{"name":"Util","desc":"References the Util folder. Should only be accessed when using Knit as\\na standalone module. If using Knit from Wally, modules should just be\\npulled in via Wally instead of relying on Knit\'s Util folder, as this\\nfolder only contains what is necessary for Knit to run in Wally mode.","lua_type":"Folder","readonly":true,"source":{"line":120,"path":"src/KnitServer.lua"}}],"types":[{"name":"Middleware","desc":"","fields":[{"name":"Inbound","lua_type":"ServerMiddleware?","desc":""},{"name":"Outbound","lua_type":"ServerMiddleware?","desc":""}],"source":{"line":7,"path":"src/KnitServer.lua"}},{"name":"ServerMiddlewareFn","desc":"For more info, see [ServerComm](https://sleitnick.github.io/RbxUtil/api/ServerComm/) documentation.","lua_type":"(player: Player, args: {any}) -> (shouldContinue: boolean, ...: any)","source":{"line":18,"path":"src/KnitServer.lua"}},{"name":"ServerMiddleware","desc":"An array of server middleware functions.","lua_type":"{ServerMiddlewareFn}","source":{"line":25,"path":"src/KnitServer.lua"}},{"name":"ServiceDef","desc":"Used to define a service when creating it in `CreateService`.\\n\\nThe middleware tables provided will be used instead of the Knit-level\\nmiddleware (if any). This allows fine-tuning each service\'s middleware.\\nThese can also be left out or `nil` to not include middleware.","fields":[{"name":"Name","lua_type":"string","desc":""},{"name":"Client","lua_type":"table?","desc":""},{"name":"Middleware","lua_type":"Middleware?","desc":""},{"name":"[any]","lua_type":"any","desc":""}],"source":{"line":40,"path":"src/KnitServer.lua"}},{"name":"Service","desc":"","fields":[{"name":"Name","lua_type":"string","desc":""},{"name":"Client","lua_type":"ServiceClient","desc":""},{"name":"KnitComm","lua_type":"Comm","desc":""},{"name":"[any]","lua_type":"any","desc":""}],"source":{"line":55,"path":"src/KnitServer.lua"}},{"name":"ServiceClient","desc":"","fields":[{"name":"Server","lua_type":"Service","desc":""},{"name":"[any]","lua_type":"any","desc":""}],"source":{"line":68,"path":"src/KnitServer.lua"}},{"name":"KnitOptions","desc":"- Middleware will apply to all services _except_ ones that define\\ntheir own middleware.","fields":[{"name":"Middleware","lua_type":"Middleware?","desc":""}],"source":{"line":81,"path":"src/KnitServer.lua"}}],"name":"KnitServer","desc":"Knit server-side lets developers create services and expose methods and signals\\nto the clients.\\n\\n```lua\\nlocal Knit = require(somewhere.Knit)\\n\\n-- Load service modules within some folder:\\nKnit.AddServices(somewhere.Services)\\n\\n-- Start Knit:\\nKnit.Start():andThen(function()\\n\\tprint(\\"Knit started\\")\\nend):catch(warn)\\n```","realm":["Server"],"source":{"line":109,"path":"src/KnitServer.lua"}}')}}]); \ No newline at end of file diff --git a/assets/js/5506604c.bc8b7bcf.js b/assets/js/5506604c.bc8b7bcf.js new file mode 100644 index 00000000..fb88db67 --- /dev/null +++ b/assets/js/5506604c.bc8b7bcf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[662],{63193:e=>{e.exports=JSON.parse('{"functions":[{"name":"CreateService","desc":"Constructs a new service.\\n\\n:::caution\\nServices must be created _before_ calling `Knit.Start()`.\\n:::\\n```lua\\n-- Create a service\\nlocal MyService = Knit.CreateService {\\n\\tName = \\"MyService\\",\\n\\tClient = {},\\n}\\n\\n-- Expose a ToAllCaps remote function to the clients\\nfunction MyService.Client:ToAllCaps(player, msg)\\n\\treturn msg:upper()\\nend\\n\\n-- Knit will call KnitStart after all services have been initialized\\nfunction MyService:KnitStart()\\n\\tprint(\\"MyService started\\")\\nend\\n\\n-- Knit will call KnitInit when Knit is first started\\nfunction MyService:KnitInit()\\n\\tprint(\\"MyService initialize\\")\\nend\\n```","params":[{"name":"serviceDef","desc":"","lua_type":"ServiceDef"}],"returns":[{"desc":"","lua_type":"Service\\n"}],"function_type":"static","source":{"line":183,"path":"src/KnitServer.lua"}},{"name":"AddServices","desc":"Requires all the modules that are children of the given parent. This is an easy\\nway to quickly load all services that might be in a folder.\\n```lua\\nKnit.AddServices(somewhere.Services)\\n```","params":[{"name":"parent","desc":"","lua_type":"Instance"}],"returns":[{"desc":"","lua_type":"{ Service }\\n"}],"function_type":"static","source":{"line":209,"path":"src/KnitServer.lua"}},{"name":"AddServicesDeep","desc":"Requires all the modules that are descendants of the given parent.","params":[{"name":"parent","desc":"","lua_type":"Instance"}],"returns":[{"desc":"","lua_type":"{ Service }\\n"}],"function_type":"static","source":{"line":223,"path":"src/KnitServer.lua"}},{"name":"GetService","desc":"Gets the service by name. Throws an error if the service is not found.","params":[{"name":"serviceName","desc":"","lua_type":"string"}],"returns":[{"desc":"","lua_type":"Service\\n"}],"function_type":"static","source":{"line":237,"path":"src/KnitServer.lua"}},{"name":"GetServices","desc":"Gets a table of all services.","params":[],"returns":[{"desc":"","lua_type":"{ [string]: Service }\\n"}],"function_type":"static","source":{"line":246,"path":"src/KnitServer.lua"}},{"name":"CreateSignal","desc":"Returns a marker that will transform the current key into\\na RemoteSignal once the service is created. Should only\\nbe called within the Client table of a service.\\n\\nSee [RemoteSignal](https://sleitnick.github.io/RbxUtil/api/RemoteSignal)\\ndocumentation for more info.\\n```lua\\nlocal MyService = Knit.CreateService {\\n\\tName = \\"MyService\\",\\n\\tClient = {\\n\\t\\t-- Create the signal marker, which will turn into a\\n\\t\\t-- RemoteSignal when Knit.Start() is called:\\n\\t\\tMySignal = Knit.CreateSignal(),\\n\\t},\\n}\\n\\nfunction MyService:KnitInit()\\n\\t-- Connect to the signal:\\n\\tself.Client.MySignal:Connect(function(player, ...) end)\\nend\\n```","params":[],"returns":[{"desc":"","lua_type":"SIGNAL_MARKER"}],"function_type":"static","source":{"line":275,"path":"src/KnitServer.lua"}},{"name":"CreateUnreliableSignal","desc":"Returns a marker that will transform the current key into\\nan unreliable RemoteSignal once the service is created. Should\\nonly be called within the Client table of a service.\\n\\nSee [RemoteSignal](https://sleitnick.github.io/RbxUtil/api/RemoteSignal)\\ndocumentation for more info.\\n\\n:::info Unreliable Events\\nInternally, this uses UnreliableRemoteEvents, which allows for\\nnetwork communication that is unreliable and unordered. This is\\nuseful for events that are not crucial for gameplay, since the\\ndelivery of the events may occur out of order or not at all.\\n\\nSee the documentation for [UnreliableRemoteEvents](https://create.roblox.com/docs/reference/engine/classes/UnreliableRemoteEvent)\\nfor more info.","params":[],"returns":[{"desc":"","lua_type":"UNRELIABLE_SIGNAL_MARKER"}],"function_type":"static","source":{"line":298,"path":"src/KnitServer.lua"}},{"name":"CreateProperty","desc":"Returns a marker that will transform the current key into\\na RemoteProperty once the service is created. Should only\\nbe called within the Client table of a service. An initial\\nvalue can be passed along as well.\\n\\nRemoteProperties are great for replicating data to all of\\nthe clients. Different data can also be set per client.\\n\\nSee [RemoteProperty](https://sleitnick.github.io/RbxUtil/api/RemoteProperty)\\ndocumentation for more info.\\n\\n```lua\\nlocal MyService = Knit.CreateService {\\n\\tName = \\"MyService\\",\\n\\tClient = {\\n\\t\\t-- Create the property marker, which will turn into a\\n\\t\\t-- RemoteProperty when Knit.Start() is called:\\n\\t\\tMyProperty = Knit.CreateProperty(\\"HelloWorld\\"),\\n\\t},\\n}\\n\\nfunction MyService:KnitInit()\\n\\t-- Change the value of the property:\\n\\tself.Client.MyProperty:Set(\\"HelloWorldAgain\\")\\nend\\n```","params":[{"name":"initialValue","desc":"","lua_type":"any"}],"returns":[{"desc":"","lua_type":"PROPERTY_MARKER"}],"function_type":"static","source":{"line":331,"path":"src/KnitServer.lua"}},{"name":"Start","desc":"Starts Knit. Should only be called once.\\n\\nOptionally, `KnitOptions` can be passed in order to set\\nKnit\'s custom configurations.\\n\\n:::caution\\nBe sure that all services have been created _before_\\ncalling `Start`. Services cannot be added later.\\n:::\\n\\n```lua\\nKnit.Start():andThen(function()\\n\\tprint(\\"Knit started!\\")\\nend):catch(warn)\\n```\\n\\nExample of Knit started with options:\\n```lua\\nKnit.Start({\\n\\tMiddleware = {\\n\\t\\tInbound = {\\n\\t\\t\\tfunction(player, args)\\n\\t\\t\\t\\tprint(\\"Player is giving following args to server:\\", args)\\n\\t\\t\\t\\treturn true\\n\\t\\t\\tend\\n\\t\\t},\\n\\t},\\n}):andThen(function()\\n\\tprint(\\"Knit started!\\")\\nend):catch(warn)\\n```","params":[{"name":"options","desc":"","lua_type":"KnitOptions?"}],"returns":[{"desc":"","lua_type":"Promise"}],"function_type":"static","source":{"line":369,"path":"src/KnitServer.lua"}},{"name":"OnStart","desc":"Returns a promise that is resolved once Knit has started. This is useful\\nfor any code that needs to tie into Knit services but is not the script\\nthat called `Start`.\\n```lua\\nKnit.OnStart():andThen(function()\\n\\tlocal MyService = Knit.Services.MyService\\n\\tMyService:DoSomething()\\nend):catch(warn)\\n```","params":[],"returns":[{"desc":"","lua_type":"Promise"}],"function_type":"static","source":{"line":463,"path":"src/KnitServer.lua"}}],"properties":[{"name":"Util","desc":"References the Util folder. Should only be accessed when using Knit as\\na standalone module. If using Knit from Wally, modules should just be\\npulled in via Wally instead of relying on Knit\'s Util folder, as this\\nfolder only contains what is necessary for Knit to run in Wally mode.","lua_type":"Folder","readonly":true,"source":{"line":120,"path":"src/KnitServer.lua"}}],"types":[{"name":"Middleware","desc":"","fields":[{"name":"Inbound","lua_type":"ServerMiddleware?","desc":""},{"name":"Outbound","lua_type":"ServerMiddleware?","desc":""}],"source":{"line":7,"path":"src/KnitServer.lua"}},{"name":"ServerMiddlewareFn","desc":"For more info, see [ServerComm](https://sleitnick.github.io/RbxUtil/api/ServerComm/) documentation.","lua_type":"(player: Player, args: {any}) -> (shouldContinue: boolean, ...: any)","source":{"line":18,"path":"src/KnitServer.lua"}},{"name":"ServerMiddleware","desc":"An array of server middleware functions.","lua_type":"{ServerMiddlewareFn}","source":{"line":25,"path":"src/KnitServer.lua"}},{"name":"ServiceDef","desc":"Used to define a service when creating it in `CreateService`.\\n\\nThe middleware tables provided will be used instead of the Knit-level\\nmiddleware (if any). This allows fine-tuning each service\'s middleware.\\nThese can also be left out or `nil` to not include middleware.","fields":[{"name":"Name","lua_type":"string","desc":""},{"name":"Client","lua_type":"table?","desc":""},{"name":"Middleware","lua_type":"Middleware?","desc":""},{"name":"[any]","lua_type":"any","desc":""}],"source":{"line":40,"path":"src/KnitServer.lua"}},{"name":"Service","desc":"","fields":[{"name":"Name","lua_type":"string","desc":""},{"name":"Client","lua_type":"ServiceClient","desc":""},{"name":"KnitComm","lua_type":"Comm","desc":""},{"name":"[any]","lua_type":"any","desc":""}],"source":{"line":55,"path":"src/KnitServer.lua"}},{"name":"ServiceClient","desc":"","fields":[{"name":"Server","lua_type":"Service","desc":""},{"name":"[any]","lua_type":"any","desc":""}],"source":{"line":68,"path":"src/KnitServer.lua"}},{"name":"KnitOptions","desc":"- Middleware will apply to all services _except_ ones that define\\ntheir own middleware.","fields":[{"name":"Middleware","lua_type":"Middleware?","desc":""}],"source":{"line":81,"path":"src/KnitServer.lua"}}],"name":"KnitServer","desc":"Knit server-side lets developers create services and expose methods and signals\\nto the clients.\\n\\n```lua\\nlocal Knit = require(somewhere.Knit)\\n\\n-- Load service modules within some folder:\\nKnit.AddServices(somewhere.Services)\\n\\n-- Start Knit:\\nKnit.Start():andThen(function()\\n\\tprint(\\"Knit started\\")\\nend):catch(warn)\\n```","realm":["Server"],"source":{"line":109,"path":"src/KnitServer.lua"}}')}}]); \ No newline at end of file diff --git a/assets/js/8deedfb8.477fa23f.js b/assets/js/8deedfb8.477fa23f.js new file mode 100644 index 00000000..1b30efff --- /dev/null +++ b/assets/js/8deedfb8.477fa23f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[556],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>c});var l=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,l)}return a}function r(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=l.createContext({}),d=function(e){var t=l.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},u=function(e){var t=d(e.components);return l.createElement(p.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},k=l.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),m=d(a),k=n,c=m["".concat(p,".").concat(k)]||m[k]||s[k]||i;return a?l.createElement(c,r(r({ref:t},u),{},{components:a})):l.createElement(c,r({ref:t},u))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,r=new Array(i);r[0]=k;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[m]="string"==typeof e?e:n,r[1]=o;for(var d=2;d{a.r(t),a.d(t,{contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var l=a(87462),n=(a(67294),a(3905));const i={},r=void 0,o={type:"mdx",permalink:"/Knit/CHANGELOG",source:"@site/pages/CHANGELOG.md",description:"1.7.0",frontMatter:{}},p=[{value:"1.7.0",id:"170",level:2},{value:"1.6.0",id:"160",level:2},{value:"1.5.3",id:"153",level:2},{value:"1.5.2",id:"152",level:2},{value:"1.5.1",id:"151",level:2},{value:"1.5.0",id:"150",level:2},{value:"1.4.7",id:"147",level:2},{value:"1.4.6",id:"146",level:2},{value:"1.4.5",id:"145",level:2},{value:"1.4.4",id:"144",level:2},{value:"1.4.3",id:"143",level:2},{value:"1.4.2",id:"142",level:2},{value:"1.4.1",id:"141",level:2},{value:"1.4.0",id:"140",level:2},{value:"1.3.0",id:"130",level:2},{value:"1.2.1",id:"121",level:2},{value:"1.2.0",id:"120",level:2},{value:"1.1.0-rc.2",id:"110-rc2",level:2},{value:"1.1.0-rc.1",id:"110-rc1",level:2},{value:"0.0.22-alpha",id:"0022-alpha",level:2},{value:"0.0.21-alpha",id:"0021-alpha",level:2},{value:"0.0.20-alpha",id:"0020-alpha",level:2},{value:"0.0.19-alpha",id:"0019-alpha",level:2},{value:"0.0.18-alpha",id:"0018-alpha",level:2},{value:"Components",id:"components",level:3},{value:"Documentation",id:"documentation",level:3},{value:"Stability",id:"stability",level:3},{value:"0.0.17-alpha",id:"0017-alpha",level:2},{value:"0.0.16-alpha",id:"0016-alpha",level:2},{value:"0.0.15-alpha",id:"0015-alpha",level:2},{value:"0.0.14-alpha",id:"0014-alpha",level:2},{value:"0.0.13-alpha",id:"0013-alpha",level:2},{value:"0.0.12-alpha",id:"0012-alpha",level:2},{value:"0.0.11-alpha",id:"0011-alpha",level:2},{value:"0.0.10-alpha",id:"0010-alpha",level:2},{value:"0.0.9-alpha",id:"009-alpha",level:2},{value:"0.0.8-alpha",id:"008-alpha",level:2},{value:"0.0.7-alpha",id:"007-alpha",level:2},{value:"0.0.6-alpha",id:"006-alpha",level:2},{value:"0.0.5-alpha",id:"005-alpha",level:2},{value:"0.0.4-alpha",id:"004-alpha",level:2},{value:"0.0.3-alpha",id:"003-alpha",level:2},{value:"0.0.2-alpha",id:"002-alpha",level:2},{value:"0.0.1-alpha",id:"001-alpha",level:2}],d={toc:p},u="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,l.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"170"},"1.7.0"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Adds ",(0,n.kt)("inlineCode",{parentName:"li"},"Knit.GetServices()")," function server-side"),(0,n.kt)("li",{parentName:"ul"},"Adds ",(0,n.kt)("inlineCode",{parentName:"li"},"Knit.GetControllers()")," function client-side"),(0,n.kt)("li",{parentName:"ul"},"Freezes ",(0,n.kt)("inlineCode",{parentName:"li"},"services"),"/",(0,n.kt)("inlineCode",{parentName:"li"},"controllers")," tables so that they can be safely returned in the functions listed above."),(0,n.kt)("li",{parentName:"ul"},"Update GitHub workflow dependencies")),(0,n.kt)("h2",{id:"160"},"1.6.0"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add support for UnreliableRemoteEvents (using ",(0,n.kt)("inlineCode",{parentName:"li"},"Knit.CreateUnreliableSignal()")," on server)"),(0,n.kt)("li",{parentName:"ul"},"Update dependencies")),(0,n.kt)("h2",{id:"153"},"1.5.3"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fix incorrect RunService call")),(0,n.kt)("h2",{id:"152"},"1.5.2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update dependencies"),(0,n.kt)("li",{parentName:"ul"},"Prevent KnitServer from destroying itself in edit mode")),(0,n.kt)("h2",{id:"151"},"1.5.1"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Bugfix for main Knit init file")),(0,n.kt)("h2",{id:"150"},"1.5.0"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Code styling"),(0,n.kt)("li",{parentName:"ul"},"Utilize newer Luau features"),(0,n.kt)("li",{parentName:"ul"},"Migrate to Aftman"),(0,n.kt)("li",{parentName:"ul"},"General repository cleanup"),(0,n.kt)("li",{parentName:"ul"},"Update dependencies")),(0,n.kt)("h2",{id:"147"},"1.4.7"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update dependencies for bundled version of Knit")),(0,n.kt)("h2",{id:"146"},"1.4.6"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update Comm dependency with new methods"),(0,n.kt)("li",{parentName:"ul"},"Update TableUtil (in bundled version) to use ",(0,n.kt)("inlineCode",{parentName:"li"},"table.clone")," internally where appropriate")),(0,n.kt)("h2",{id:"145"},"1.4.5"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update dependencies"),(0,n.kt)("li",{parentName:"ul"},"Use Promise v4")),(0,n.kt)("h2",{id:"144"},"1.4.4"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add memory categories per service and controller to help track memory usage"),(0,n.kt)("li",{parentName:"ul"},"Update dependencies")),(0,n.kt)("h2",{id:"143"},"1.4.3"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update Component dependency"),(0,n.kt)("li",{parentName:"ul"},"Update Input dependency"),(0,n.kt)("li",{parentName:"ul"},"Update Signal dependency"),(0,n.kt)("li",{parentName:"ul"},"Update Timer dependency"),(0,n.kt)("li",{parentName:"ul"},"Update Trove dependency")),(0,n.kt)("h2",{id:"142"},"1.4.2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update dependencies to latest")),(0,n.kt)("h2",{id:"141"},"1.4.1"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update the Comm module to patch a ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/Sleitnick/RbxUtil/pull/27"},"middleware bug")," only affecting middleware that tries to change number of arguments (i.e. injecting custom arguments will now be fixed)"),(0,n.kt)("li",{parentName:"ul"},"Documentation improvements")),(0,n.kt)("h2",{id:"140"},"1.4.0"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add ability to set independent middleware per service, but on the server and the client"),(0,n.kt)("li",{parentName:"ul"},"Added tutorial video links"),(0,n.kt)("li",{parentName:"ul"},"Add short-circuit evaluation to ",(0,n.kt)("inlineCode",{parentName:"li"},"GetService")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"GetController")," functions for better performance when the service/controller exists"),(0,n.kt)("li",{parentName:"ul"},"Change Comm module to use service name as namespace instead of nested ",(0,n.kt)("inlineCode",{parentName:"li"},"__comm__")," folder"),(0,n.kt)("li",{parentName:"ul"},"Documentation improvements"),(0,n.kt)("li",{parentName:"ul"},"Breaking changes to middleware assignment (now within one ",(0,n.kt)("inlineCode",{parentName:"li"},"Middleware")," table instead of two for inbound/outbound)")),(0,n.kt)("h2",{id:"130"},"1.3.0"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add support for RemoteProperties via Comm library")),(0,n.kt)("h2",{id:"121"},"1.2.1"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add updated dependencies to the ",(0,n.kt)("inlineCode",{parentName:"li"},"wally_bundle.toml")," dependency list")),(0,n.kt)("h2",{id:"120"},"1.2.0"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added options to include middleware")),(0,n.kt)("h2",{id:"110-rc2"},"1.1.0-rc.2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Removed ",(0,n.kt)("inlineCode",{parentName:"li"},"Services")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"Controllers")," properties to force use of ",(0,n.kt)("inlineCode",{parentName:"li"},"GetService")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"GetController")," functions"),(0,n.kt)("li",{parentName:"ul"},"Add ",(0,n.kt)("inlineCode",{parentName:"li"},"KnitOptions")," argument for KnitClient to toggle whether service methods simply yield or return promises (promises by default)"),(0,n.kt)("li",{parentName:"ul"},"Various documentation improvements")),(0,n.kt)("h2",{id:"110-rc1"},"1.1.0-rc.1"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Migrated all core modules to Wally"),(0,n.kt)("li",{parentName:"ul"},"Revamped documentation")),(0,n.kt)("h2",{id:"0022-alpha"},"0.0.22-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fix ",(0,n.kt)("inlineCode",{parentName:"li"},"TableUtil.Sample")," algorithm to properly implement a partial Fisher-Yates shuffle"),(0,n.kt)("li",{parentName:"ul"},"Fix ",(0,n.kt)("inlineCode",{parentName:"li"},"TableUtil.Reduce")," to handle the ",(0,n.kt)("inlineCode",{parentName:"li"},"init")," parameter properly"),(0,n.kt)("li",{parentName:"ul"},"Update Janitor to ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/howmanysmall/Janitor/releases/tag/V1.13.6"},"v1.13.6")),(0,n.kt)("li",{parentName:"ul"},"Small documentation adjustments")),(0,n.kt)("h2",{id:"0021-alpha"},"0.0.21-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fix issue with having multiple required components"),(0,n.kt)("li",{parentName:"ul"},"Adds ",(0,n.kt)("inlineCode",{parentName:"li"},"Sample")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"Zip")," to TableUtil"),(0,n.kt)("li",{parentName:"ul"},"Improvements to Timer module")),(0,n.kt)("h2",{id:"0020-alpha"},"0.0.20-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fixes bug with Timer class"),(0,n.kt)("li",{parentName:"ul"},"Updates Janitor"),(0,n.kt)("li",{parentName:"ul"},"Removes unnecessary parentheses"),(0,n.kt)("li",{parentName:"ul"},"Adds some more Luau types")),(0,n.kt)("h2",{id:"0019-alpha"},"0.0.19-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"New Signal implementation"),(0,n.kt)("li",{parentName:"ul"},"Remove Thread module in favor of new ",(0,n.kt)("inlineCode",{parentName:"li"},"task.spawn")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"task.defer")," functions"),(0,n.kt)("li",{parentName:"ul"},"Add Janitor / Remove Maid"),(0,n.kt)("li",{parentName:"ul"},"Add Timer module")),(0,n.kt)("h2",{id:"0018-alpha"},"0.0.18-alpha"),(0,n.kt)("h3",{id:"components"},"Components"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added optional ",(0,n.kt)("a",{parentName:"li",href:"https://sleitnick.github.io/Knit/util/component/#required-components"},(0,n.kt)("inlineCode",{parentName:"a"},"RequiredComponents"))," table for components"),(0,n.kt)("li",{parentName:"ul"},"Added ",(0,n.kt)("a",{parentName:"li",href:"https://sleitnick.github.io/Knit/util/component/#observe"},(0,n.kt)("inlineCode",{parentName:"a"},"Observe"))," method for components"),(0,n.kt)("li",{parentName:"ul"},"Fixed ",(0,n.kt)("inlineCode",{parentName:"li"},"Added")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"Removed")," events not being cleaned up when component class destroyed"),(0,n.kt)("li",{parentName:"ul"},"Fixed lifecycle RunService method bindings not being cleaned up properly for future reuse")),(0,n.kt)("h3",{id:"documentation"},"Documentation"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added ",(0,n.kt)("a",{parentName:"li",href:"https://sleitnick.github.io/Knit/util/component"},"more documentation")," for components")),(0,n.kt)("h3",{id:"stability"},"Stability"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Upgraded CI/CD pipeline to use latest packages")),(0,n.kt)("h2",{id:"0017-alpha"},"0.0.17-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Hotfix for TableUtil ",(0,n.kt)("inlineCode",{parentName:"li"},"Sync"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Assign"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Extend"),", and ",(0,n.kt)("inlineCode",{parentName:"li"},"Shuffle")," functions to do shallow copies instead of deep copies"),(0,n.kt)("li",{parentName:"ul"},"Fix release GitHub action to properly use ",(0,n.kt)("inlineCode",{parentName:"li"},'"Knit"')," as the top-level directory name within the zipped file"),(0,n.kt)("li",{parentName:"ul"},"Fix documentation to properly use user preference theme (light/dark)")),(0,n.kt)("h2",{id:"0016-alpha"},"0.0.16-alpha"),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"[BR]")," = Breaking Change"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Project directory restructure"),(0,n.kt)("li",{parentName:"ul"},"Can now include Knit as a Git submodule and reference the default rojo project to sync in (see below)"),(0,n.kt)("li",{parentName:"ul"},"Added unit tests for Knit-specific utility modules"),(0,n.kt)("li",{parentName:"ul"},"Added simple integration tests"),(0,n.kt)("li",{parentName:"ul"},"TableUtil fixes, additions, and improvements:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"[BR]")," All functions (except ",(0,n.kt)("inlineCode",{parentName:"li"},"FastRemove")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"FastRemoveFirstValue"),") no longer mutate table"),(0,n.kt)("li",{parentName:"ul"},"Fix ",(0,n.kt)("inlineCode",{parentName:"li"},"Filter")," bug introduced in v0.0.15-alpha"),(0,n.kt)("li",{parentName:"ul"},"Fix behavior of ",(0,n.kt)("inlineCode",{parentName:"li"},"Extend")," to extend arrays and not dictionaries (use ",(0,n.kt)("inlineCode",{parentName:"li"},"Assign")," to extend a dictionary)"),(0,n.kt)("li",{parentName:"ul"},"Add optional RNG override parameter for ",(0,n.kt)("inlineCode",{parentName:"li"},"Shuffle")),(0,n.kt)("li",{parentName:"ul"},"Add ",(0,n.kt)("inlineCode",{parentName:"li"},"Flat"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"FlatMap"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Keys"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Find"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Every"),", and ",(0,n.kt)("inlineCode",{parentName:"li"},"Some")," functions"),(0,n.kt)("li",{parentName:"ul"},"Add documentation page for TableUtil"))),(0,n.kt)("li",{parentName:"ul"},"Simplify ",(0,n.kt)("inlineCode",{parentName:"li"},"Knit.OnStart()")," internally to use ",(0,n.kt)("inlineCode",{parentName:"li"},"Promise.FromEvent")),(0,n.kt)("li",{parentName:"ul"},"Update Rojo version used by CI/CD pipeline"),(0,n.kt)("li",{parentName:"ul"},"Fix broken links in documentation pages")),(0,n.kt)("h2",{id:"0015-alpha"},"0.0.15-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Memory leak fixed with Streamable when instance was immediately available"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Knit.GetService(serviceName)")," added to server-side Knit"),(0,n.kt)("li",{parentName:"ul"},"Minor improvements to TableUtil"),(0,n.kt)("li",{parentName:"ul"},"Util documentation split across multiple pages")),(0,n.kt)("h2",{id:"0014-alpha"},"0.0.14-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fix Signal leak when firing with no connections"),(0,n.kt)("li",{parentName:"ul"},"Change ",(0,n.kt)("inlineCode",{parentName:"li"},"._instance")," to ",(0,n.kt)("inlineCode",{parentName:"li"},".Instance")," in Component"),(0,n.kt)("li",{parentName:"ul"},"Components will use attributes to store unique ID instead of StringValue"),(0,n.kt)("li",{parentName:"ul"},"Add ",(0,n.kt)("inlineCode",{parentName:"li"},"Signal.Proxy")," constructor to wrap built-in RBXScriptSignals"),(0,n.kt)("li",{parentName:"ul"},"Add ",(0,n.kt)("inlineCode",{parentName:"li"},"Maid:GivePromise")," method"),(0,n.kt)("li",{parentName:"ul"},"Allow dictionary tables in ",(0,n.kt)("inlineCode",{parentName:"li"},"StreamableUtil.Compound")," observers list")),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"Note breaking changes from above:")),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"When upgrading, make sure to change ",(0,n.kt)("inlineCode",{parentName:"li"},"._instance")," field accessors to ",(0,n.kt)("inlineCode",{parentName:"li"},".Instance")," for components"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"ServerID")," StringValue for components has been switched to use attributes: ",(0,n.kt)("inlineCode",{parentName:"li"},'instance:GetAttribute("ComponentServerId")'))),(0,n.kt)("h2",{id:"0013-alpha"},"0.0.13-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Component:WaitFor")," has been rewritten to utilize built-in promise features better, which also eliminated an existing event connection leak."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Streamable")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"StreamableUtil")," modules added to easily manage parts that may stream in & out during runtime when using ",(0,n.kt)("a",{parentName:"li",href:"https://developer.roblox.com/en-us/api-reference/property/Workspace/StreamingEnabled"},(0,n.kt)("inlineCode",{parentName:"a"},"StreamingEnabled")),"."),(0,n.kt)("li",{parentName:"ul"},"Documentation improvements.")),(0,n.kt)("h2",{id:"0012-alpha"},"0.0.12-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added new 'Add' functions to automatically load all modules in a folder. This is useful for quickly loading a bunch of service or controller modules:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"KnitServer.AddServices(folder: Instance)")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"KnitServer.AddServicesDeep(folder: Instance)")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"KnitClient.AddControllers(folder: Instance)")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"KnitClient.AddControllersDeep(folder: Instance)")))),(0,n.kt)("li",{parentName:"ul"},"Split up remotes to server/client versions:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"RemoteEvent")," -> ",(0,n.kt)("inlineCode",{parentName:"li"},"RemoteSignal")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"ClientRemoteSignal")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"RemoteProperty")," -> ",(0,n.kt)("inlineCode",{parentName:"li"},"RemoteProperty")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"ClientRemoteProperty")))),(0,n.kt)("li",{parentName:"ul"},"Knit module isn't required to live in ReplicatedStorage now"),(0,n.kt)("li",{parentName:"ul"},"Added ",(0,n.kt)("inlineCode",{parentName:"li"},"EnumList")," class which wraps ",(0,n.kt)("inlineCode",{parentName:"li"},"Symbol"),"s to create pseudo-enums"),(0,n.kt)("li",{parentName:"ul"},"Added style guide in documentation")),(0,n.kt)("h2",{id:"0011-alpha"},"0.0.11-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Documentation fixes and additions"),(0,n.kt)("li",{parentName:"ul"},"Better table support for ",(0,n.kt)("inlineCode",{parentName:"li"},"RemoteProperty")," class"),(0,n.kt)("li",{parentName:"ul"},"Fixes and additions to ",(0,n.kt)("inlineCode",{parentName:"li"},"Option")," class"),(0,n.kt)("li",{parentName:"ul"},"Optional behavior argument for ",(0,n.kt)("inlineCode",{parentName:"li"},"Thread.DelayRepeat"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"Note:")," If using var-args list for ",(0,n.kt)("inlineCode",{parentName:"li"},"DelayRepeat"),", this is a breaking change. ",(0,n.kt)("inlineCode",{parentName:"li"},"DelayRepeat"),"'s third argument must be the behavior (",(0,n.kt)("inlineCode",{parentName:"li"},"Thread.DelayRepeatBehavior.Delayed")," or ",(0,n.kt)("inlineCode",{parentName:"li"},"Thread.DelayRepeatBehavior.Immediate"),")."))),(0,n.kt)("li",{parentName:"ul"},"Added ",(0,n.kt)("inlineCode",{parentName:"li"},"Symbol")," class")),(0,n.kt)("h2",{id:"0010-alpha"},"0.0.10-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Switch default branch from ",(0,n.kt)("inlineCode",{parentName:"li"},"master")," to ",(0,n.kt)("inlineCode",{parentName:"li"},"main")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Component:WaitFor")," first arg can now be a name or instance"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Init")," for individual components is called after a heartbeat, which helps allow components to get other components without race conditions when ",(0,n.kt)("inlineCode",{parentName:"li"},"Component.Auto")," is used.")),(0,n.kt)("h2",{id:"009-alpha"},"0.0.9-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fixed issue where remote objects were parented before services completed initialization. This created a possible race condition between services initializing and clients loading Knit.")),(0,n.kt)("h2",{id:"008-alpha"},"0.0.8-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added ",(0,n.kt)("inlineCode",{parentName:"li"},"Option")," class for creating optionals."),(0,n.kt)("li",{parentName:"ul"},"Added serialization/deserialization automatic flow for RemoteEvents and RemoteFunctions."),(0,n.kt)("li",{parentName:"ul"},"Upgraded ",(0,n.kt)("inlineCode",{parentName:"li"},"Promise")," to v3.0.1.")),(0,n.kt)("h2",{id:"007-alpha"},"0.0.7-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added a few tests (very few so far)"),(0,n.kt)("li",{parentName:"ul"},"Added PascalCase methods to Promise module"),(0,n.kt)("li",{parentName:"ul"},"Components will only trigger for instances that are descendants of Players or Workspace by default"),(0,n.kt)("li",{parentName:"ul"},"GitHub workflow to auto-publish the ",(0,n.kt)("a",{parentName:"li",href:"https://www.roblox.com/library/5530714855/Knit"},"Knit")," module to Roblox.")),(0,n.kt)("h2",{id:"006-alpha"},"0.0.6-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add more functionality to Component module")),(0,n.kt)("h2",{id:"005-alpha"},"0.0.5-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added Component class, which allows developers to bind component classes to in-game instances using the CollectionService tags"),(0,n.kt)("li",{parentName:"ul"},"Renamed ",(0,n.kt)("inlineCode",{parentName:"li"},"Event")," to ",(0,n.kt)("inlineCode",{parentName:"li"},"Signal"))),(0,n.kt)("h2",{id:"004-alpha"},"0.0.4-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Ability to use tables within RemoteProperty object"),(0,n.kt)("li",{parentName:"ul"},"RemoteProperty now has ",(0,n.kt)("inlineCode",{parentName:"li"},"property:Replicate()")," method server-side that must be called when a table value is changed (",(0,n.kt)("a",{parentName:"li",href:"https://sleitnick.github.io/Knit/util/#remoteproperty"},"see doc"),")")),(0,n.kt)("h2",{id:"003-alpha"},"0.0.3-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add more documentation"),(0,n.kt)("li",{parentName:"ul"},"Inject ",(0,n.kt)("inlineCode",{parentName:"li"},"Player")," field into ",(0,n.kt)("inlineCode",{parentName:"li"},"KnitClient"))),(0,n.kt)("h2",{id:"002-alpha"},"0.0.2-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add ",(0,n.kt)("inlineCode",{parentName:"li"},"Knit.OnStart()")," to capture when Knit starts"),(0,n.kt)("li",{parentName:"ul"},"Add RemoteEvent and RemoteProperty"),(0,n.kt)("li",{parentName:"ul"},"Add documentation")),(0,n.kt)("h2",{id:"001-alpha"},"0.0.1-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Initial release")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8deedfb8.f2f387bf.js b/assets/js/8deedfb8.f2f387bf.js deleted file mode 100644 index 3349b57b..00000000 --- a/assets/js/8deedfb8.f2f387bf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[556],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>c});var l=a(67294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);t&&(l=l.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,l)}return a}function r(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(l=0;l=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=l.createContext({}),d=function(e){var t=l.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},u=function(e){var t=d(e.components);return l.createElement(p.Provider,{value:t},e.children)},m="mdxType",s={inlineCode:"code",wrapper:function(e){var t=e.children;return l.createElement(l.Fragment,{},t)}},k=l.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),m=d(a),k=n,c=m["".concat(p,".").concat(k)]||m[k]||s[k]||i;return a?l.createElement(c,r(r({ref:t},u),{},{components:a})):l.createElement(c,r({ref:t},u))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,r=new Array(i);r[0]=k;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o[m]="string"==typeof e?e:n,r[1]=o;for(var d=2;d{a.r(t),a.d(t,{contentTitle:()=>r,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>p});var l=a(87462),n=(a(67294),a(3905));const i={},r=void 0,o={type:"mdx",permalink:"/Knit/CHANGELOG",source:"@site/pages/CHANGELOG.md",description:"1.6.0",frontMatter:{}},p=[{value:"1.6.0",id:"160",level:2},{value:"1.5.3",id:"153",level:2},{value:"1.5.2",id:"152",level:2},{value:"1.5.1",id:"151",level:2},{value:"1.5.0",id:"150",level:2},{value:"1.4.7",id:"147",level:2},{value:"1.4.6",id:"146",level:2},{value:"1.4.5",id:"145",level:2},{value:"1.4.4",id:"144",level:2},{value:"1.4.3",id:"143",level:2},{value:"1.4.2",id:"142",level:2},{value:"1.4.1",id:"141",level:2},{value:"1.4.0",id:"140",level:2},{value:"1.3.0",id:"130",level:2},{value:"1.2.1",id:"121",level:2},{value:"1.2.0",id:"120",level:2},{value:"1.1.0-rc.2",id:"110-rc2",level:2},{value:"1.1.0-rc.1",id:"110-rc1",level:2},{value:"0.0.22-alpha",id:"0022-alpha",level:2},{value:"0.0.21-alpha",id:"0021-alpha",level:2},{value:"0.0.20-alpha",id:"0020-alpha",level:2},{value:"0.0.19-alpha",id:"0019-alpha",level:2},{value:"0.0.18-alpha",id:"0018-alpha",level:2},{value:"Components",id:"components",level:3},{value:"Documentation",id:"documentation",level:3},{value:"Stability",id:"stability",level:3},{value:"0.0.17-alpha",id:"0017-alpha",level:2},{value:"0.0.16-alpha",id:"0016-alpha",level:2},{value:"0.0.15-alpha",id:"0015-alpha",level:2},{value:"0.0.14-alpha",id:"0014-alpha",level:2},{value:"0.0.13-alpha",id:"0013-alpha",level:2},{value:"0.0.12-alpha",id:"0012-alpha",level:2},{value:"0.0.11-alpha",id:"0011-alpha",level:2},{value:"0.0.10-alpha",id:"0010-alpha",level:2},{value:"0.0.9-alpha",id:"009-alpha",level:2},{value:"0.0.8-alpha",id:"008-alpha",level:2},{value:"0.0.7-alpha",id:"007-alpha",level:2},{value:"0.0.6-alpha",id:"006-alpha",level:2},{value:"0.0.5-alpha",id:"005-alpha",level:2},{value:"0.0.4-alpha",id:"004-alpha",level:2},{value:"0.0.3-alpha",id:"003-alpha",level:2},{value:"0.0.2-alpha",id:"002-alpha",level:2},{value:"0.0.1-alpha",id:"001-alpha",level:2}],d={toc:p},u="wrapper";function m(e){let{components:t,...a}=e;return(0,n.kt)(u,(0,l.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"160"},"1.6.0"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add support for UnreliableRemoteEvents (using ",(0,n.kt)("inlineCode",{parentName:"li"},"Knit.CreateUnreliableSignal()")," on server)"),(0,n.kt)("li",{parentName:"ul"},"Update dependencies")),(0,n.kt)("h2",{id:"153"},"1.5.3"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fix incorrect RunService call")),(0,n.kt)("h2",{id:"152"},"1.5.2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update dependencies"),(0,n.kt)("li",{parentName:"ul"},"Prevent KnitServer from destroying itself in edit mode")),(0,n.kt)("h2",{id:"151"},"1.5.1"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Bugfix for main Knit init file")),(0,n.kt)("h2",{id:"150"},"1.5.0"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Code styling"),(0,n.kt)("li",{parentName:"ul"},"Utilize newer Luau features"),(0,n.kt)("li",{parentName:"ul"},"Migrate to Aftman"),(0,n.kt)("li",{parentName:"ul"},"General repository cleanup"),(0,n.kt)("li",{parentName:"ul"},"Update dependencies")),(0,n.kt)("h2",{id:"147"},"1.4.7"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update dependencies for bundled version of Knit")),(0,n.kt)("h2",{id:"146"},"1.4.6"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update Comm dependency with new methods"),(0,n.kt)("li",{parentName:"ul"},"Update TableUtil (in bundled version) to use ",(0,n.kt)("inlineCode",{parentName:"li"},"table.clone")," internally where appropriate")),(0,n.kt)("h2",{id:"145"},"1.4.5"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update dependencies"),(0,n.kt)("li",{parentName:"ul"},"Use Promise v4")),(0,n.kt)("h2",{id:"144"},"1.4.4"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add memory categories per service and controller to help track memory usage"),(0,n.kt)("li",{parentName:"ul"},"Update dependencies")),(0,n.kt)("h2",{id:"143"},"1.4.3"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update Component dependency"),(0,n.kt)("li",{parentName:"ul"},"Update Input dependency"),(0,n.kt)("li",{parentName:"ul"},"Update Signal dependency"),(0,n.kt)("li",{parentName:"ul"},"Update Timer dependency"),(0,n.kt)("li",{parentName:"ul"},"Update Trove dependency")),(0,n.kt)("h2",{id:"142"},"1.4.2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update dependencies to latest")),(0,n.kt)("h2",{id:"141"},"1.4.1"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Update the Comm module to patch a ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/Sleitnick/RbxUtil/pull/27"},"middleware bug")," only affecting middleware that tries to change number of arguments (i.e. injecting custom arguments will now be fixed)"),(0,n.kt)("li",{parentName:"ul"},"Documentation improvements")),(0,n.kt)("h2",{id:"140"},"1.4.0"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add ability to set independent middleware per service, but on the server and the client"),(0,n.kt)("li",{parentName:"ul"},"Added tutorial video links"),(0,n.kt)("li",{parentName:"ul"},"Add short-circuit evaluation to ",(0,n.kt)("inlineCode",{parentName:"li"},"GetService")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"GetController")," functions for better performance when the service/controller exists"),(0,n.kt)("li",{parentName:"ul"},"Change Comm module to use service name as namespace instead of nested ",(0,n.kt)("inlineCode",{parentName:"li"},"__comm__")," folder"),(0,n.kt)("li",{parentName:"ul"},"Documentation improvements"),(0,n.kt)("li",{parentName:"ul"},"Breaking changes to middleware assignment (now within one ",(0,n.kt)("inlineCode",{parentName:"li"},"Middleware")," table instead of two for inbound/outbound)")),(0,n.kt)("h2",{id:"130"},"1.3.0"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add support for RemoteProperties via Comm library")),(0,n.kt)("h2",{id:"121"},"1.2.1"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add updated dependencies to the ",(0,n.kt)("inlineCode",{parentName:"li"},"wally_bundle.toml")," dependency list")),(0,n.kt)("h2",{id:"120"},"1.2.0"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added options to include middleware")),(0,n.kt)("h2",{id:"110-rc2"},"1.1.0-rc.2"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Removed ",(0,n.kt)("inlineCode",{parentName:"li"},"Services")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"Controllers")," properties to force use of ",(0,n.kt)("inlineCode",{parentName:"li"},"GetService")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"GetController")," functions"),(0,n.kt)("li",{parentName:"ul"},"Add ",(0,n.kt)("inlineCode",{parentName:"li"},"KnitOptions")," argument for KnitClient to toggle whether service methods simply yield or return promises (promises by default)"),(0,n.kt)("li",{parentName:"ul"},"Various documentation improvements")),(0,n.kt)("h2",{id:"110-rc1"},"1.1.0-rc.1"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Migrated all core modules to Wally"),(0,n.kt)("li",{parentName:"ul"},"Revamped documentation")),(0,n.kt)("h2",{id:"0022-alpha"},"0.0.22-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fix ",(0,n.kt)("inlineCode",{parentName:"li"},"TableUtil.Sample")," algorithm to properly implement a partial Fisher-Yates shuffle"),(0,n.kt)("li",{parentName:"ul"},"Fix ",(0,n.kt)("inlineCode",{parentName:"li"},"TableUtil.Reduce")," to handle the ",(0,n.kt)("inlineCode",{parentName:"li"},"init")," parameter properly"),(0,n.kt)("li",{parentName:"ul"},"Update Janitor to ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/howmanysmall/Janitor/releases/tag/V1.13.6"},"v1.13.6")),(0,n.kt)("li",{parentName:"ul"},"Small documentation adjustments")),(0,n.kt)("h2",{id:"0021-alpha"},"0.0.21-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fix issue with having multiple required components"),(0,n.kt)("li",{parentName:"ul"},"Adds ",(0,n.kt)("inlineCode",{parentName:"li"},"Sample")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"Zip")," to TableUtil"),(0,n.kt)("li",{parentName:"ul"},"Improvements to Timer module")),(0,n.kt)("h2",{id:"0020-alpha"},"0.0.20-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fixes bug with Timer class"),(0,n.kt)("li",{parentName:"ul"},"Updates Janitor"),(0,n.kt)("li",{parentName:"ul"},"Removes unnecessary parentheses"),(0,n.kt)("li",{parentName:"ul"},"Adds some more Luau types")),(0,n.kt)("h2",{id:"0019-alpha"},"0.0.19-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"New Signal implementation"),(0,n.kt)("li",{parentName:"ul"},"Remove Thread module in favor of new ",(0,n.kt)("inlineCode",{parentName:"li"},"task.spawn")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"task.defer")," functions"),(0,n.kt)("li",{parentName:"ul"},"Add Janitor / Remove Maid"),(0,n.kt)("li",{parentName:"ul"},"Add Timer module")),(0,n.kt)("h2",{id:"0018-alpha"},"0.0.18-alpha"),(0,n.kt)("h3",{id:"components"},"Components"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added optional ",(0,n.kt)("a",{parentName:"li",href:"https://sleitnick.github.io/Knit/util/component/#required-components"},(0,n.kt)("inlineCode",{parentName:"a"},"RequiredComponents"))," table for components"),(0,n.kt)("li",{parentName:"ul"},"Added ",(0,n.kt)("a",{parentName:"li",href:"https://sleitnick.github.io/Knit/util/component/#observe"},(0,n.kt)("inlineCode",{parentName:"a"},"Observe"))," method for components"),(0,n.kt)("li",{parentName:"ul"},"Fixed ",(0,n.kt)("inlineCode",{parentName:"li"},"Added")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"Removed")," events not being cleaned up when component class destroyed"),(0,n.kt)("li",{parentName:"ul"},"Fixed lifecycle RunService method bindings not being cleaned up properly for future reuse")),(0,n.kt)("h3",{id:"documentation"},"Documentation"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added ",(0,n.kt)("a",{parentName:"li",href:"https://sleitnick.github.io/Knit/util/component"},"more documentation")," for components")),(0,n.kt)("h3",{id:"stability"},"Stability"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Upgraded CI/CD pipeline to use latest packages")),(0,n.kt)("h2",{id:"0017-alpha"},"0.0.17-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Hotfix for TableUtil ",(0,n.kt)("inlineCode",{parentName:"li"},"Sync"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Assign"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Extend"),", and ",(0,n.kt)("inlineCode",{parentName:"li"},"Shuffle")," functions to do shallow copies instead of deep copies"),(0,n.kt)("li",{parentName:"ul"},"Fix release GitHub action to properly use ",(0,n.kt)("inlineCode",{parentName:"li"},'"Knit"')," as the top-level directory name within the zipped file"),(0,n.kt)("li",{parentName:"ul"},"Fix documentation to properly use user preference theme (light/dark)")),(0,n.kt)("h2",{id:"0016-alpha"},"0.0.16-alpha"),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"[BR]")," = Breaking Change"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Project directory restructure"),(0,n.kt)("li",{parentName:"ul"},"Can now include Knit as a Git submodule and reference the default rojo project to sync in (see below)"),(0,n.kt)("li",{parentName:"ul"},"Added unit tests for Knit-specific utility modules"),(0,n.kt)("li",{parentName:"ul"},"Added simple integration tests"),(0,n.kt)("li",{parentName:"ul"},"TableUtil fixes, additions, and improvements:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"[BR]")," All functions (except ",(0,n.kt)("inlineCode",{parentName:"li"},"FastRemove")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"FastRemoveFirstValue"),") no longer mutate table"),(0,n.kt)("li",{parentName:"ul"},"Fix ",(0,n.kt)("inlineCode",{parentName:"li"},"Filter")," bug introduced in v0.0.15-alpha"),(0,n.kt)("li",{parentName:"ul"},"Fix behavior of ",(0,n.kt)("inlineCode",{parentName:"li"},"Extend")," to extend arrays and not dictionaries (use ",(0,n.kt)("inlineCode",{parentName:"li"},"Assign")," to extend a dictionary)"),(0,n.kt)("li",{parentName:"ul"},"Add optional RNG override parameter for ",(0,n.kt)("inlineCode",{parentName:"li"},"Shuffle")),(0,n.kt)("li",{parentName:"ul"},"Add ",(0,n.kt)("inlineCode",{parentName:"li"},"Flat"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"FlatMap"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Keys"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Find"),", ",(0,n.kt)("inlineCode",{parentName:"li"},"Every"),", and ",(0,n.kt)("inlineCode",{parentName:"li"},"Some")," functions"),(0,n.kt)("li",{parentName:"ul"},"Add documentation page for TableUtil"))),(0,n.kt)("li",{parentName:"ul"},"Simplify ",(0,n.kt)("inlineCode",{parentName:"li"},"Knit.OnStart()")," internally to use ",(0,n.kt)("inlineCode",{parentName:"li"},"Promise.FromEvent")),(0,n.kt)("li",{parentName:"ul"},"Update Rojo version used by CI/CD pipeline"),(0,n.kt)("li",{parentName:"ul"},"Fix broken links in documentation pages")),(0,n.kt)("h2",{id:"0015-alpha"},"0.0.15-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Memory leak fixed with Streamable when instance was immediately available"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Knit.GetService(serviceName)")," added to server-side Knit"),(0,n.kt)("li",{parentName:"ul"},"Minor improvements to TableUtil"),(0,n.kt)("li",{parentName:"ul"},"Util documentation split across multiple pages")),(0,n.kt)("h2",{id:"0014-alpha"},"0.0.14-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fix Signal leak when firing with no connections"),(0,n.kt)("li",{parentName:"ul"},"Change ",(0,n.kt)("inlineCode",{parentName:"li"},"._instance")," to ",(0,n.kt)("inlineCode",{parentName:"li"},".Instance")," in Component"),(0,n.kt)("li",{parentName:"ul"},"Components will use attributes to store unique ID instead of StringValue"),(0,n.kt)("li",{parentName:"ul"},"Add ",(0,n.kt)("inlineCode",{parentName:"li"},"Signal.Proxy")," constructor to wrap built-in RBXScriptSignals"),(0,n.kt)("li",{parentName:"ul"},"Add ",(0,n.kt)("inlineCode",{parentName:"li"},"Maid:GivePromise")," method"),(0,n.kt)("li",{parentName:"ul"},"Allow dictionary tables in ",(0,n.kt)("inlineCode",{parentName:"li"},"StreamableUtil.Compound")," observers list")),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"Note breaking changes from above:")),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"When upgrading, make sure to change ",(0,n.kt)("inlineCode",{parentName:"li"},"._instance")," field accessors to ",(0,n.kt)("inlineCode",{parentName:"li"},".Instance")," for components"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"ServerID")," StringValue for components has been switched to use attributes: ",(0,n.kt)("inlineCode",{parentName:"li"},'instance:GetAttribute("ComponentServerId")'))),(0,n.kt)("h2",{id:"0013-alpha"},"0.0.13-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Component:WaitFor")," has been rewritten to utilize built-in promise features better, which also eliminated an existing event connection leak."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Streamable")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"StreamableUtil")," modules added to easily manage parts that may stream in & out during runtime when using ",(0,n.kt)("a",{parentName:"li",href:"https://developer.roblox.com/en-us/api-reference/property/Workspace/StreamingEnabled"},(0,n.kt)("inlineCode",{parentName:"a"},"StreamingEnabled")),"."),(0,n.kt)("li",{parentName:"ul"},"Documentation improvements.")),(0,n.kt)("h2",{id:"0012-alpha"},"0.0.12-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added new 'Add' functions to automatically load all modules in a folder. This is useful for quickly loading a bunch of service or controller modules:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"KnitServer.AddServices(folder: Instance)")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"KnitServer.AddServicesDeep(folder: Instance)")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"KnitClient.AddControllers(folder: Instance)")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"KnitClient.AddControllersDeep(folder: Instance)")))),(0,n.kt)("li",{parentName:"ul"},"Split up remotes to server/client versions:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"RemoteEvent")," -> ",(0,n.kt)("inlineCode",{parentName:"li"},"RemoteSignal")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"ClientRemoteSignal")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"RemoteProperty")," -> ",(0,n.kt)("inlineCode",{parentName:"li"},"RemoteProperty")," and ",(0,n.kt)("inlineCode",{parentName:"li"},"ClientRemoteProperty")))),(0,n.kt)("li",{parentName:"ul"},"Knit module isn't required to live in ReplicatedStorage now"),(0,n.kt)("li",{parentName:"ul"},"Added ",(0,n.kt)("inlineCode",{parentName:"li"},"EnumList")," class which wraps ",(0,n.kt)("inlineCode",{parentName:"li"},"Symbol"),"s to create pseudo-enums"),(0,n.kt)("li",{parentName:"ul"},"Added style guide in documentation")),(0,n.kt)("h2",{id:"0011-alpha"},"0.0.11-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Documentation fixes and additions"),(0,n.kt)("li",{parentName:"ul"},"Better table support for ",(0,n.kt)("inlineCode",{parentName:"li"},"RemoteProperty")," class"),(0,n.kt)("li",{parentName:"ul"},"Fixes and additions to ",(0,n.kt)("inlineCode",{parentName:"li"},"Option")," class"),(0,n.kt)("li",{parentName:"ul"},"Optional behavior argument for ",(0,n.kt)("inlineCode",{parentName:"li"},"Thread.DelayRepeat"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"Note:")," If using var-args list for ",(0,n.kt)("inlineCode",{parentName:"li"},"DelayRepeat"),", this is a breaking change. ",(0,n.kt)("inlineCode",{parentName:"li"},"DelayRepeat"),"'s third argument must be the behavior (",(0,n.kt)("inlineCode",{parentName:"li"},"Thread.DelayRepeatBehavior.Delayed")," or ",(0,n.kt)("inlineCode",{parentName:"li"},"Thread.DelayRepeatBehavior.Immediate"),")."))),(0,n.kt)("li",{parentName:"ul"},"Added ",(0,n.kt)("inlineCode",{parentName:"li"},"Symbol")," class")),(0,n.kt)("h2",{id:"0010-alpha"},"0.0.10-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Switch default branch from ",(0,n.kt)("inlineCode",{parentName:"li"},"master")," to ",(0,n.kt)("inlineCode",{parentName:"li"},"main")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Component:WaitFor")," first arg can now be a name or instance"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"Init")," for individual components is called after a heartbeat, which helps allow components to get other components without race conditions when ",(0,n.kt)("inlineCode",{parentName:"li"},"Component.Auto")," is used.")),(0,n.kt)("h2",{id:"009-alpha"},"0.0.9-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Fixed issue where remote objects were parented before services completed initialization. This created a possible race condition between services initializing and clients loading Knit.")),(0,n.kt)("h2",{id:"008-alpha"},"0.0.8-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added ",(0,n.kt)("inlineCode",{parentName:"li"},"Option")," class for creating optionals."),(0,n.kt)("li",{parentName:"ul"},"Added serialization/deserialization automatic flow for RemoteEvents and RemoteFunctions."),(0,n.kt)("li",{parentName:"ul"},"Upgraded ",(0,n.kt)("inlineCode",{parentName:"li"},"Promise")," to v3.0.1.")),(0,n.kt)("h2",{id:"007-alpha"},"0.0.7-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added a few tests (very few so far)"),(0,n.kt)("li",{parentName:"ul"},"Added PascalCase methods to Promise module"),(0,n.kt)("li",{parentName:"ul"},"Components will only trigger for instances that are descendants of Players or Workspace by default"),(0,n.kt)("li",{parentName:"ul"},"GitHub workflow to auto-publish the ",(0,n.kt)("a",{parentName:"li",href:"https://www.roblox.com/library/5530714855/Knit"},"Knit")," module to Roblox.")),(0,n.kt)("h2",{id:"006-alpha"},"0.0.6-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add more functionality to Component module")),(0,n.kt)("h2",{id:"005-alpha"},"0.0.5-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Added Component class, which allows developers to bind component classes to in-game instances using the CollectionService tags"),(0,n.kt)("li",{parentName:"ul"},"Renamed ",(0,n.kt)("inlineCode",{parentName:"li"},"Event")," to ",(0,n.kt)("inlineCode",{parentName:"li"},"Signal"))),(0,n.kt)("h2",{id:"004-alpha"},"0.0.4-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Ability to use tables within RemoteProperty object"),(0,n.kt)("li",{parentName:"ul"},"RemoteProperty now has ",(0,n.kt)("inlineCode",{parentName:"li"},"property:Replicate()")," method server-side that must be called when a table value is changed (",(0,n.kt)("a",{parentName:"li",href:"https://sleitnick.github.io/Knit/util/#remoteproperty"},"see doc"),")")),(0,n.kt)("h2",{id:"003-alpha"},"0.0.3-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add more documentation"),(0,n.kt)("li",{parentName:"ul"},"Inject ",(0,n.kt)("inlineCode",{parentName:"li"},"Player")," field into ",(0,n.kt)("inlineCode",{parentName:"li"},"KnitClient"))),(0,n.kt)("h2",{id:"002-alpha"},"0.0.2-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Add ",(0,n.kt)("inlineCode",{parentName:"li"},"Knit.OnStart()")," to capture when Knit starts"),(0,n.kt)("li",{parentName:"ul"},"Add RemoteEvent and RemoteProperty"),(0,n.kt)("li",{parentName:"ul"},"Add documentation")),(0,n.kt)("h2",{id:"001-alpha"},"0.0.1-alpha"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Initial release")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ad6f44fb.0419ac19.js b/assets/js/ad6f44fb.8b9faf41.js similarity index 82% rename from assets/js/ad6f44fb.0419ac19.js rename to assets/js/ad6f44fb.8b9faf41.js index f4ce0a0e..bc60380e 100644 --- a/assets/js/ad6f44fb.0419ac19.js +++ b/assets/js/ad6f44fb.8b9faf41.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[113],{65306:e=>{e.exports=JSON.parse('[{"value":"Types","id":"types","level":2},{"value":"ClientMiddleware","id":"ClientMiddleware","level":3},{"value":"ClientMiddlewareFn","id":"ClientMiddlewareFn","level":3},{"value":"Controller","id":"Controller","level":3},{"value":"ControllerDef","id":"ControllerDef","level":3},{"value":"KnitOptions","id":"KnitOptions","level":3},{"value":"Middleware","id":"Middleware","level":3},{"value":"PerServiceMiddleware","id":"PerServiceMiddleware","level":3},{"value":"Service","id":"Service","level":3},{"value":"Properties","id":"properties","level":2},{"value":"Player","id":"Player","level":3},{"value":"Util","id":"Util","level":3},{"value":"Functions","id":"functions","level":2},{"value":".AddControllers","id":"AddControllers","level":3},{"value":".AddControllersDeep","id":"AddControllersDeep","level":3},{"value":".CreateController","id":"CreateController","level":3},{"value":".GetController","id":"GetController","level":3},{"value":".GetService","id":"GetService","level":3},{"value":".OnStart","id":"OnStart","level":3},{"value":".Start","id":"Start","level":3}]')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[113],{65306:e=>{e.exports=JSON.parse('[{"value":"Types","id":"types","level":2},{"value":"ClientMiddleware","id":"ClientMiddleware","level":3},{"value":"ClientMiddlewareFn","id":"ClientMiddlewareFn","level":3},{"value":"Controller","id":"Controller","level":3},{"value":"ControllerDef","id":"ControllerDef","level":3},{"value":"KnitOptions","id":"KnitOptions","level":3},{"value":"Middleware","id":"Middleware","level":3},{"value":"PerServiceMiddleware","id":"PerServiceMiddleware","level":3},{"value":"Service","id":"Service","level":3},{"value":"Properties","id":"properties","level":2},{"value":"Player","id":"Player","level":3},{"value":"Util","id":"Util","level":3},{"value":"Functions","id":"functions","level":2},{"value":".AddControllers","id":"AddControllers","level":3},{"value":".AddControllersDeep","id":"AddControllersDeep","level":3},{"value":".CreateController","id":"CreateController","level":3},{"value":".GetController","id":"GetController","level":3},{"value":".GetControllers","id":"GetControllers","level":3},{"value":".GetService","id":"GetService","level":3},{"value":".OnStart","id":"OnStart","level":3},{"value":".Start","id":"Start","level":3}]')}}]); \ No newline at end of file diff --git a/assets/js/ba6452ef.0439b3f9.js b/assets/js/ba6452ef.0439b3f9.js deleted file mode 100644 index 0c6af7ab..00000000 --- a/assets/js/ba6452ef.0439b3f9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[334],{8230:e=>{e.exports=JSON.parse('{"functions":[{"name":"CreateController","desc":"Creates a new controller.\\n\\n:::caution\\nControllers must be created _before_ calling `Knit.Start()`.\\n:::\\n```lua\\n-- Create a controller\\nlocal MyController = Knit.CreateController {\\n\\tName = \\"MyController\\",\\n}\\n\\nfunction MyController:KnitStart()\\n\\tprint(\\"MyController started\\")\\nend\\n\\nfunction MyController:KnitInit()\\n\\tprint(\\"MyController initialized\\")\\nend\\n```","params":[{"name":"controllerDef","desc":"","lua_type":"ControllerDef"}],"returns":[{"desc":"","lua_type":"Controller\\n"}],"function_type":"static","source":{"line":175,"path":"src/KnitClient.lua"}},{"name":"AddControllers","desc":"Requires all the modules that are children of the given parent. This is an easy\\nway to quickly load all controllers that might be in a folder.\\n```lua\\nKnit.AddControllers(somewhere.Controllers)\\n```","params":[{"name":"parent","desc":"","lua_type":"Instance"}],"returns":[{"desc":"","lua_type":"{ Controller }\\n"}],"function_type":"static","source":{"line":192,"path":"src/KnitClient.lua"}},{"name":"AddControllersDeep","desc":"Requires all the modules that are descendants of the given parent.","params":[{"name":"parent","desc":"","lua_type":"Instance"}],"returns":[{"desc":"","lua_type":"{ Controller }\\n"}],"function_type":"static","source":{"line":206,"path":"src/KnitClient.lua"}},{"name":"GetService","desc":"Returns a Service object which is a reflection of the remote objects\\nwithin the Client table of the given service. Throws an error if the\\nservice is not found.\\n\\nIf a service\'s Client table contains RemoteSignals and/or RemoteProperties,\\nthese values are reflected as\\n[ClientRemoteSignals](https://sleitnick.github.io/RbxUtil/api/ClientRemoteSignal) and\\n[ClientRemoteProperties](https://sleitnick.github.io/RbxUtil/api/ClientRemoteProperty).\\n\\n```lua\\n-- Server-side service creation:\\nlocal MyService = Knit.CreateService {\\n\\tName = \\"MyService\\",\\n\\tClient = {\\n\\t\\tMySignal = Knit.CreateSignal(),\\n\\t\\tMyProperty = Knit.CreateProperty(\\"Hello\\"),\\n\\t},\\n}\\nfunction MyService:AddOne(player, number)\\n\\treturn number + 1\\nend\\n\\n-------------------------------------------------\\n\\n-- Client-side service reflection:\\nlocal MyService = Knit.GetService(\\"MyService\\")\\n\\n-- Call a method:\\nlocal num = MyService:AddOne(5) --\x3e 6\\n\\n-- Fire a signal to the server:\\nMyService.MySignal:Fire(\\"Hello\\")\\n\\n-- Listen for signals from the server:\\nMyService.MySignal:Connect(function(message)\\n\\tprint(message)\\nend)\\n\\n-- Observe the initial value and changes to properties:\\nMyService.MyProperty:Observe(function(value)\\n\\tprint(value)\\nend)\\n```\\n\\n:::caution\\nServices are only exposed to the client if the service has remote-based\\ncontent in the Client table. If not, the service will not be visible\\nto the client. `KnitClient.GetService` will only work on services that\\nexpose remote-based content on their Client tables.\\n:::","params":[{"name":"serviceName","desc":"","lua_type":"string"}],"returns":[{"desc":"","lua_type":"Service\\n"}],"function_type":"static","source":{"line":269,"path":"src/KnitClient.lua"}},{"name":"GetController","desc":"Gets the controller by name. Throws an error if the controller\\nis not found.","params":[{"name":"controllerName","desc":"","lua_type":"string"}],"returns":[{"desc":"","lua_type":"Controller\\n"}],"function_type":"static","source":{"line":283,"path":"src/KnitClient.lua"}},{"name":"Start","desc":"Starts Knit. Should only be called once per client.\\n```lua\\nKnit.Start():andThen(function()\\n\\tprint(\\"Knit started!\\")\\nend):catch(warn)\\n```\\n\\nBy default, service methods exposed to the client will return promises.\\nTo change this behavior, set the `ServicePromises` option to `false`:\\n```lua\\nKnit.Start({ServicePromises = false}):andThen(function()\\n\\tprint(\\"Knit started!\\")\\nend):catch(warn)\\n```","params":[{"name":"options","desc":"","lua_type":"KnitOptions?"}],"returns":[{"desc":"","lua_type":"Promise"}],"function_type":"static","source":{"line":310,"path":"src/KnitClient.lua"}},{"name":"OnStart","desc":"Returns a promise that is resolved once Knit has started. This is useful\\nfor any code that needs to tie into Knit controllers but is not the script\\nthat called `Start`.\\n```lua\\nKnit.OnStart():andThen(function()\\n\\tlocal MyController = Knit.GetController(\\"MyController\\")\\n\\tMyController:DoSomething()\\nend):catch(warn)\\n```","params":[],"returns":[{"desc":"","lua_type":"Promise"}],"function_type":"static","source":{"line":382,"path":"src/KnitClient.lua"}}],"properties":[{"name":"Player","desc":"Reference to the LocalPlayer.","lua_type":"Player","readonly":true,"source":{"line":102,"path":"src/KnitClient.lua"}},{"name":"Util","desc":"References the Util folder. Should only be accessed when using Knit as\\na standalone module. If using Knit from Wally, modules should just be\\npulled in via Wally instead of relying on Knit\'s Util folder, as this\\nfolder only contains what is necessary for Knit to run in Wally mode.","lua_type":"Folder","readonly":true,"source":{"line":113,"path":"src/KnitClient.lua"}}],"types":[{"name":"Middleware","desc":"","fields":[{"name":"Inbound","lua_type":"ClientMiddleware?","desc":""},{"name":"Outbound","lua_type":"ClientMiddleware?","desc":""}],"source":{"line":7,"path":"src/KnitClient.lua"}},{"name":"ClientMiddlewareFn","desc":"For more info, see [ClientComm](https://sleitnick.github.io/RbxUtil/api/ClientComm/) documentation.","lua_type":"(args: {any}) -> (shouldContinue: boolean, ...: any)","source":{"line":18,"path":"src/KnitClient.lua"}},{"name":"ClientMiddleware","desc":"An array of client middleware functions.","lua_type":"{ClientMiddlewareFn}","source":{"line":25,"path":"src/KnitClient.lua"}},{"name":"PerServiceMiddleware","desc":"","lua_type":"{[string]: Middleware}","source":{"line":31,"path":"src/KnitClient.lua"}},{"name":"ControllerDef","desc":"Used to define a controller when creating it in `CreateController`.","fields":[{"name":"Name","lua_type":"string","desc":""},{"name":"[any]","lua_type":"any","desc":""}],"source":{"line":40,"path":"src/KnitClient.lua"}},{"name":"Controller","desc":"","fields":[{"name":"Name","lua_type":"string","desc":""},{"name":"[any]","lua_type":"any","desc":""}],"source":{"line":51,"path":"src/KnitClient.lua"}},{"name":"Service","desc":"","fields":[{"name":"[any]","lua_type":"any","desc":""}],"source":{"line":61,"path":"src/KnitClient.lua"}},{"name":"KnitOptions","desc":"- `ServicePromises` defaults to `true` and indicates if service methods use promises.\\n- Each service will go through the defined middleware, unless the service\\nhas middleware defined in `PerServiceMiddleware`.","fields":[{"name":"ServicePromises","lua_type":"boolean?","desc":""},{"name":"Middleware","lua_type":"Middleware?","desc":""},{"name":"PerServiceMiddleware","lua_type":"PerServiceMiddleware?","desc":""}],"source":{"line":76,"path":"src/KnitClient.lua"}}],"name":"KnitClient","desc":"","realm":["Client"],"source":{"line":94,"path":"src/KnitClient.lua"}}')}}]); \ No newline at end of file diff --git a/assets/js/ba6452ef.0993c500.js b/assets/js/ba6452ef.0993c500.js new file mode 100644 index 00000000..82359f79 --- /dev/null +++ b/assets/js/ba6452ef.0993c500.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[334],{8230:e=>{e.exports=JSON.parse('{"functions":[{"name":"CreateController","desc":"Creates a new controller.\\n\\n:::caution\\nControllers must be created _before_ calling `Knit.Start()`.\\n:::\\n```lua\\n-- Create a controller\\nlocal MyController = Knit.CreateController {\\n\\tName = \\"MyController\\",\\n}\\n\\nfunction MyController:KnitStart()\\n\\tprint(\\"MyController started\\")\\nend\\n\\nfunction MyController:KnitInit()\\n\\tprint(\\"MyController initialized\\")\\nend\\n```","params":[{"name":"controllerDef","desc":"","lua_type":"ControllerDef"}],"returns":[{"desc":"","lua_type":"Controller\\n"}],"function_type":"static","source":{"line":175,"path":"src/KnitClient.lua"}},{"name":"AddControllers","desc":"Requires all the modules that are children of the given parent. This is an easy\\nway to quickly load all controllers that might be in a folder.\\n```lua\\nKnit.AddControllers(somewhere.Controllers)\\n```","params":[{"name":"parent","desc":"","lua_type":"Instance"}],"returns":[{"desc":"","lua_type":"{ Controller }\\n"}],"function_type":"static","source":{"line":193,"path":"src/KnitClient.lua"}},{"name":"AddControllersDeep","desc":"Requires all the modules that are descendants of the given parent.","params":[{"name":"parent","desc":"","lua_type":"Instance"}],"returns":[{"desc":"","lua_type":"{ Controller }\\n"}],"function_type":"static","source":{"line":207,"path":"src/KnitClient.lua"}},{"name":"GetService","desc":"Returns a Service object which is a reflection of the remote objects\\nwithin the Client table of the given service. Throws an error if the\\nservice is not found.\\n\\nIf a service\'s Client table contains RemoteSignals and/or RemoteProperties,\\nthese values are reflected as\\n[ClientRemoteSignals](https://sleitnick.github.io/RbxUtil/api/ClientRemoteSignal) and\\n[ClientRemoteProperties](https://sleitnick.github.io/RbxUtil/api/ClientRemoteProperty).\\n\\n```lua\\n-- Server-side service creation:\\nlocal MyService = Knit.CreateService {\\n\\tName = \\"MyService\\",\\n\\tClient = {\\n\\t\\tMySignal = Knit.CreateSignal(),\\n\\t\\tMyProperty = Knit.CreateProperty(\\"Hello\\"),\\n\\t},\\n}\\nfunction MyService:AddOne(player, number)\\n\\treturn number + 1\\nend\\n\\n-------------------------------------------------\\n\\n-- Client-side service reflection:\\nlocal MyService = Knit.GetService(\\"MyService\\")\\n\\n-- Call a method:\\nlocal num = MyService:AddOne(5) --\x3e 6\\n\\n-- Fire a signal to the server:\\nMyService.MySignal:Fire(\\"Hello\\")\\n\\n-- Listen for signals from the server:\\nMyService.MySignal:Connect(function(message)\\n\\tprint(message)\\nend)\\n\\n-- Observe the initial value and changes to properties:\\nMyService.MyProperty:Observe(function(value)\\n\\tprint(value)\\nend)\\n```\\n\\n:::caution\\nServices are only exposed to the client if the service has remote-based\\ncontent in the Client table. If not, the service will not be visible\\nto the client. `KnitClient.GetService` will only work on services that\\nexpose remote-based content on their Client tables.\\n:::","params":[{"name":"serviceName","desc":"","lua_type":"string"}],"returns":[{"desc":"","lua_type":"Service\\n"}],"function_type":"static","source":{"line":270,"path":"src/KnitClient.lua"}},{"name":"GetController","desc":"Gets the controller by name. Throws an error if the controller\\nis not found.","params":[{"name":"controllerName","desc":"","lua_type":"string"}],"returns":[{"desc":"","lua_type":"Controller\\n"}],"function_type":"static","source":{"line":284,"path":"src/KnitClient.lua"}},{"name":"GetControllers","desc":"Gets a table of all controllers.","params":[],"returns":[{"desc":"","lua_type":"{ [string]: Controller }\\n"}],"function_type":"static","source":{"line":297,"path":"src/KnitClient.lua"}},{"name":"Start","desc":"Starts Knit. Should only be called once per client.\\n```lua\\nKnit.Start():andThen(function()\\n\\tprint(\\"Knit started!\\")\\nend):catch(warn)\\n```\\n\\nBy default, service methods exposed to the client will return promises.\\nTo change this behavior, set the `ServicePromises` option to `false`:\\n```lua\\nKnit.Start({ServicePromises = false}):andThen(function()\\n\\tprint(\\"Knit started!\\")\\nend):catch(warn)\\n```","params":[{"name":"options","desc":"","lua_type":"KnitOptions?"}],"returns":[{"desc":"","lua_type":"Promise"}],"function_type":"static","source":{"line":319,"path":"src/KnitClient.lua"}},{"name":"OnStart","desc":"Returns a promise that is resolved once Knit has started. This is useful\\nfor any code that needs to tie into Knit controllers but is not the script\\nthat called `Start`.\\n```lua\\nKnit.OnStart():andThen(function()\\n\\tlocal MyController = Knit.GetController(\\"MyController\\")\\n\\tMyController:DoSomething()\\nend):catch(warn)\\n```","params":[],"returns":[{"desc":"","lua_type":"Promise"}],"function_type":"static","source":{"line":393,"path":"src/KnitClient.lua"}}],"properties":[{"name":"Player","desc":"Reference to the LocalPlayer.","lua_type":"Player","readonly":true,"source":{"line":102,"path":"src/KnitClient.lua"}},{"name":"Util","desc":"References the Util folder. Should only be accessed when using Knit as\\na standalone module. If using Knit from Wally, modules should just be\\npulled in via Wally instead of relying on Knit\'s Util folder, as this\\nfolder only contains what is necessary for Knit to run in Wally mode.","lua_type":"Folder","readonly":true,"source":{"line":113,"path":"src/KnitClient.lua"}}],"types":[{"name":"Middleware","desc":"","fields":[{"name":"Inbound","lua_type":"ClientMiddleware?","desc":""},{"name":"Outbound","lua_type":"ClientMiddleware?","desc":""}],"source":{"line":7,"path":"src/KnitClient.lua"}},{"name":"ClientMiddlewareFn","desc":"For more info, see [ClientComm](https://sleitnick.github.io/RbxUtil/api/ClientComm/) documentation.","lua_type":"(args: {any}) -> (shouldContinue: boolean, ...: any)","source":{"line":18,"path":"src/KnitClient.lua"}},{"name":"ClientMiddleware","desc":"An array of client middleware functions.","lua_type":"{ClientMiddlewareFn}","source":{"line":25,"path":"src/KnitClient.lua"}},{"name":"PerServiceMiddleware","desc":"","lua_type":"{[string]: Middleware}","source":{"line":31,"path":"src/KnitClient.lua"}},{"name":"ControllerDef","desc":"Used to define a controller when creating it in `CreateController`.","fields":[{"name":"Name","lua_type":"string","desc":""},{"name":"[any]","lua_type":"any","desc":""}],"source":{"line":40,"path":"src/KnitClient.lua"}},{"name":"Controller","desc":"","fields":[{"name":"Name","lua_type":"string","desc":""},{"name":"[any]","lua_type":"any","desc":""}],"source":{"line":51,"path":"src/KnitClient.lua"}},{"name":"Service","desc":"","fields":[{"name":"[any]","lua_type":"any","desc":""}],"source":{"line":61,"path":"src/KnitClient.lua"}},{"name":"KnitOptions","desc":"- `ServicePromises` defaults to `true` and indicates if service methods use promises.\\n- Each service will go through the defined middleware, unless the service\\nhas middleware defined in `PerServiceMiddleware`.","fields":[{"name":"ServicePromises","lua_type":"boolean?","desc":""},{"name":"Middleware","lua_type":"Middleware?","desc":""},{"name":"PerServiceMiddleware","lua_type":"PerServiceMiddleware?","desc":""}],"source":{"line":76,"path":"src/KnitClient.lua"}}],"name":"KnitClient","desc":"","realm":["Client"],"source":{"line":94,"path":"src/KnitClient.lua"}}')}}]); \ No newline at end of file diff --git a/assets/js/d692d782.368e726d.js b/assets/js/d692d782.368e726d.js deleted file mode 100644 index 37909d22..00000000 --- a/assets/js/d692d782.368e726d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[801],{85492:e=>{e.exports=JSON.parse('{"Instance":"https://developer.roblox.com/en-us/api-reference/datatype/Instance","AccessoryDescription":"https://developer.roblox.com/en-us/api-reference/class/AccessoryDescription","AccountService":"https://developer.roblox.com/en-us/api-reference/class/AccountService","Accoutrement":"https://developer.roblox.com/en-us/api-reference/class/Accoutrement","Accessory":"https://developer.roblox.com/en-us/api-reference/class/Accessory","Hat":"https://developer.roblox.com/en-us/api-reference/class/Hat","AdPortal":"https://developer.roblox.com/en-us/api-reference/class/AdPortal","AdService":"https://developer.roblox.com/en-us/api-reference/class/AdService","AdvancedDragger":"https://developer.roblox.com/en-us/api-reference/class/AdvancedDragger","AnalyticsService":"https://developer.roblox.com/en-us/api-reference/class/AnalyticsService","Animation":"https://developer.roblox.com/en-us/api-reference/class/Animation","AnimationClip":"https://developer.roblox.com/en-us/api-reference/class/AnimationClip","CurveAnimation":"https://developer.roblox.com/en-us/api-reference/class/CurveAnimation","KeyframeSequence":"https://developer.roblox.com/en-us/api-reference/class/KeyframeSequence","AnimationClipProvider":"https://developer.roblox.com/en-us/api-reference/class/AnimationClipProvider","AnimationController":"https://developer.roblox.com/en-us/api-reference/class/AnimationController","AnimationFromVideoCreatorService":"https://developer.roblox.com/en-us/api-reference/class/AnimationFromVideoCreatorService","AnimationFromVideoCreatorStudioService":"https://developer.roblox.com/en-us/api-reference/class/AnimationFromVideoCreatorStudioService","AnimationRigData":"https://developer.roblox.com/en-us/api-reference/class/AnimationRigData","AnimationStreamTrack":"https://developer.roblox.com/en-us/api-reference/class/AnimationStreamTrack","AnimationTrack":"https://developer.roblox.com/en-us/api-reference/class/AnimationTrack","Animator":"https://developer.roblox.com/en-us/api-reference/class/Animator","AppUpdateService":"https://developer.roblox.com/en-us/api-reference/class/AppUpdateService","AssetCounterService":"https://developer.roblox.com/en-us/api-reference/class/AssetCounterService","AssetDeliveryProxy":"https://developer.roblox.com/en-us/api-reference/class/AssetDeliveryProxy","AssetImportService":"https://developer.roblox.com/en-us/api-reference/class/AssetImportService","AssetImportSession":"https://developer.roblox.com/en-us/api-reference/class/AssetImportSession","AssetManagerService":"https://developer.roblox.com/en-us/api-reference/class/AssetManagerService","AssetPatchSettings":"https://developer.roblox.com/en-us/api-reference/class/AssetPatchSettings","AssetService":"https://developer.roblox.com/en-us/api-reference/class/AssetService","Atmosphere":"https://developer.roblox.com/en-us/api-reference/class/Atmosphere","Attachment":"https://developer.roblox.com/en-us/api-reference/class/Attachment","Bone":"https://developer.roblox.com/en-us/api-reference/class/Bone","AudioAnalyzer":"https://developer.roblox.com/en-us/api-reference/class/AudioAnalyzer","AudioChorus":"https://developer.roblox.com/en-us/api-reference/class/AudioChorus","AudioCompressor":"https://developer.roblox.com/en-us/api-reference/class/AudioCompressor","AudioDeviceInput":"https://developer.roblox.com/en-us/api-reference/class/AudioDeviceInput","AudioDeviceOutput":"https://developer.roblox.com/en-us/api-reference/class/AudioDeviceOutput","AudioDistortion":"https://developer.roblox.com/en-us/api-reference/class/AudioDistortion","AudioEcho":"https://developer.roblox.com/en-us/api-reference/class/AudioEcho","AudioEmitter":"https://developer.roblox.com/en-us/api-reference/class/AudioEmitter","AudioEqualizer":"https://developer.roblox.com/en-us/api-reference/class/AudioEqualizer","AudioFader":"https://developer.roblox.com/en-us/api-reference/class/AudioFader","AudioFlanger":"https://developer.roblox.com/en-us/api-reference/class/AudioFlanger","AudioListener":"https://developer.roblox.com/en-us/api-reference/class/AudioListener","AudioPitchShifter":"https://developer.roblox.com/en-us/api-reference/class/AudioPitchShifter","AudioPlayer":"https://developer.roblox.com/en-us/api-reference/class/AudioPlayer","AudioReverb":"https://developer.roblox.com/en-us/api-reference/class/AudioReverb","AudioSearchParams":"https://developer.roblox.com/en-us/api-reference/class/AudioSearchParams","AvatarChatService":"https://developer.roblox.com/en-us/api-reference/class/AvatarChatService","AvatarCreationService":"https://developer.roblox.com/en-us/api-reference/class/AvatarCreationService","AvatarEditorService":"https://developer.roblox.com/en-us/api-reference/class/AvatarEditorService","AvatarImportService":"https://developer.roblox.com/en-us/api-reference/class/AvatarImportService","Backpack":"https://developer.roblox.com/en-us/api-reference/class/Backpack","BadgeService":"https://developer.roblox.com/en-us/api-reference/class/BadgeService","BaseImportData":"https://developer.roblox.com/en-us/api-reference/class/BaseImportData","AnimationImportData":"https://developer.roblox.com/en-us/api-reference/class/AnimationImportData","FacsImportData":"https://developer.roblox.com/en-us/api-reference/class/FacsImportData","GroupImportData":"https://developer.roblox.com/en-us/api-reference/class/GroupImportData","JointImportData":"https://developer.roblox.com/en-us/api-reference/class/JointImportData","MaterialImportData":"https://developer.roblox.com/en-us/api-reference/class/MaterialImportData","MeshImportData":"https://developer.roblox.com/en-us/api-reference/class/MeshImportData","RootImportData":"https://developer.roblox.com/en-us/api-reference/class/RootImportData","BasePlayerGui":"https://developer.roblox.com/en-us/api-reference/class/BasePlayerGui","CoreGui":"https://developer.roblox.com/en-us/api-reference/class/CoreGui","PlayerGui":"https://developer.roblox.com/en-us/api-reference/class/PlayerGui","StarterGui":"https://developer.roblox.com/en-us/api-reference/class/StarterGui","BaseRemoteEvent":"https://developer.roblox.com/en-us/api-reference/class/BaseRemoteEvent","RemoteEvent":"https://developer.roblox.com/en-us/api-reference/class/RemoteEvent","UnreliableRemoteEvent":"https://developer.roblox.com/en-us/api-reference/class/UnreliableRemoteEvent","BaseWrap":"https://developer.roblox.com/en-us/api-reference/class/BaseWrap","WrapLayer":"https://developer.roblox.com/en-us/api-reference/class/WrapLayer","WrapTarget":"https://developer.roblox.com/en-us/api-reference/class/WrapTarget","Beam":"https://developer.roblox.com/en-us/api-reference/class/Beam","BindableEvent":"https://developer.roblox.com/en-us/api-reference/class/BindableEvent","BindableFunction":"https://developer.roblox.com/en-us/api-reference/class/BindableFunction","BodyMover":"https://developer.roblox.com/en-us/api-reference/class/BodyMover","BodyAngularVelocity":"https://developer.roblox.com/en-us/api-reference/class/BodyAngularVelocity","BodyForce":"https://developer.roblox.com/en-us/api-reference/class/BodyForce","BodyGyro":"https://developer.roblox.com/en-us/api-reference/class/BodyGyro","BodyPosition":"https://developer.roblox.com/en-us/api-reference/class/BodyPosition","BodyThrust":"https://developer.roblox.com/en-us/api-reference/class/BodyThrust","BodyVelocity":"https://developer.roblox.com/en-us/api-reference/class/BodyVelocity","RocketPropulsion":"https://developer.roblox.com/en-us/api-reference/class/RocketPropulsion","BodyPartDescription":"https://developer.roblox.com/en-us/api-reference/class/BodyPartDescription","Breakpoint":"https://developer.roblox.com/en-us/api-reference/class/Breakpoint","BrowserService":"https://developer.roblox.com/en-us/api-reference/class/BrowserService","BubbleChatMessageProperties":"https://developer.roblox.com/en-us/api-reference/class/BubbleChatMessageProperties","BulkImportService":"https://developer.roblox.com/en-us/api-reference/class/BulkImportService","CacheableContentProvider":"https://developer.roblox.com/en-us/api-reference/class/CacheableContentProvider","HSRDataContentProvider":"https://developer.roblox.com/en-us/api-reference/class/HSRDataContentProvider","MeshContentProvider":"https://developer.roblox.com/en-us/api-reference/class/MeshContentProvider","SolidModelContentProvider":"https://developer.roblox.com/en-us/api-reference/class/SolidModelContentProvider","CalloutService":"https://developer.roblox.com/en-us/api-reference/class/CalloutService","Camera":"https://developer.roblox.com/en-us/api-reference/class/Camera","CaptureService":"https://developer.roblox.com/en-us/api-reference/class/CaptureService","ChangeHistoryService":"https://developer.roblox.com/en-us/api-reference/class/ChangeHistoryService","CharacterAppearance":"https://developer.roblox.com/en-us/api-reference/class/CharacterAppearance","BodyColors":"https://developer.roblox.com/en-us/api-reference/class/BodyColors","CharacterMesh":"https://developer.roblox.com/en-us/api-reference/class/CharacterMesh","Clothing":"https://developer.roblox.com/en-us/api-reference/class/Clothing","Pants":"https://developer.roblox.com/en-us/api-reference/class/Pants","Shirt":"https://developer.roblox.com/en-us/api-reference/class/Shirt","ShirtGraphic":"https://developer.roblox.com/en-us/api-reference/class/ShirtGraphic","Skin":"https://developer.roblox.com/en-us/api-reference/class/Skin","Chat":"https://developer.roblox.com/en-us/api-reference/class/Chat","ChatbotUIService":"https://developer.roblox.com/en-us/api-reference/class/ChatbotUIService","ClickDetector":"https://developer.roblox.com/en-us/api-reference/class/ClickDetector","DragDetector":"https://developer.roblox.com/en-us/api-reference/class/DragDetector","Clouds":"https://developer.roblox.com/en-us/api-reference/class/Clouds","ClusterPacketCache":"https://developer.roblox.com/en-us/api-reference/class/ClusterPacketCache","Collaborator":"https://developer.roblox.com/en-us/api-reference/class/Collaborator","CollaboratorsService":"https://developer.roblox.com/en-us/api-reference/class/CollaboratorsService","CollectionService":"https://developer.roblox.com/en-us/api-reference/class/CollectionService","CommandInstance":"https://developer.roblox.com/en-us/api-reference/class/CommandInstance","CommandService":"https://developer.roblox.com/en-us/api-reference/class/CommandService","Configuration":"https://developer.roblox.com/en-us/api-reference/class/Configuration","ConfigureServerService":"https://developer.roblox.com/en-us/api-reference/class/ConfigureServerService","Constraint":"https://developer.roblox.com/en-us/api-reference/class/Constraint","AlignOrientation":"https://developer.roblox.com/en-us/api-reference/class/AlignOrientation","AlignPosition":"https://developer.roblox.com/en-us/api-reference/class/AlignPosition","AngularVelocity":"https://developer.roblox.com/en-us/api-reference/class/AngularVelocity","AnimationConstraint":"https://developer.roblox.com/en-us/api-reference/class/AnimationConstraint","BallSocketConstraint":"https://developer.roblox.com/en-us/api-reference/class/BallSocketConstraint","HingeConstraint":"https://developer.roblox.com/en-us/api-reference/class/HingeConstraint","LineForce":"https://developer.roblox.com/en-us/api-reference/class/LineForce","LinearVelocity":"https://developer.roblox.com/en-us/api-reference/class/LinearVelocity","PlaneConstraint":"https://developer.roblox.com/en-us/api-reference/class/PlaneConstraint","Plane":"https://developer.roblox.com/en-us/api-reference/class/Plane","RigidConstraint":"https://developer.roblox.com/en-us/api-reference/class/RigidConstraint","RodConstraint":"https://developer.roblox.com/en-us/api-reference/class/RodConstraint","RopeConstraint":"https://developer.roblox.com/en-us/api-reference/class/RopeConstraint","SlidingBallConstraint":"https://developer.roblox.com/en-us/api-reference/class/SlidingBallConstraint","CylindricalConstraint":"https://developer.roblox.com/en-us/api-reference/class/CylindricalConstraint","PrismaticConstraint":"https://developer.roblox.com/en-us/api-reference/class/PrismaticConstraint","SpringConstraint":"https://developer.roblox.com/en-us/api-reference/class/SpringConstraint","Torque":"https://developer.roblox.com/en-us/api-reference/class/Torque","TorsionSpringConstraint":"https://developer.roblox.com/en-us/api-reference/class/TorsionSpringConstraint","UniversalConstraint":"https://developer.roblox.com/en-us/api-reference/class/UniversalConstraint","VectorForce":"https://developer.roblox.com/en-us/api-reference/class/VectorForce","ContentProvider":"https://developer.roblox.com/en-us/api-reference/class/ContentProvider","ContextActionService":"https://developer.roblox.com/en-us/api-reference/class/ContextActionService","Controller":"/Knit/api/KnitClient#Controller","HumanoidController":"https://developer.roblox.com/en-us/api-reference/class/HumanoidController","SkateboardController":"https://developer.roblox.com/en-us/api-reference/class/SkateboardController","VehicleController":"https://developer.roblox.com/en-us/api-reference/class/VehicleController","ControllerBase":"https://developer.roblox.com/en-us/api-reference/class/ControllerBase","AirController":"https://developer.roblox.com/en-us/api-reference/class/AirController","ClimbController":"https://developer.roblox.com/en-us/api-reference/class/ClimbController","GroundController":"https://developer.roblox.com/en-us/api-reference/class/GroundController","SwimController":"https://developer.roblox.com/en-us/api-reference/class/SwimController","ControllerManager":"https://developer.roblox.com/en-us/api-reference/class/ControllerManager","ControllerService":"https://developer.roblox.com/en-us/api-reference/class/ControllerService","CookiesService":"https://developer.roblox.com/en-us/api-reference/class/CookiesService","CorePackages":"https://developer.roblox.com/en-us/api-reference/class/CorePackages","CoreScriptDebuggingManagerHelper":"https://developer.roblox.com/en-us/api-reference/class/CoreScriptDebuggingManagerHelper","CoreScriptSyncService":"https://developer.roblox.com/en-us/api-reference/class/CoreScriptSyncService","CreationDBService":"https://developer.roblox.com/en-us/api-reference/class/CreationDBService","CrossDMScriptChangeListener":"https://developer.roblox.com/en-us/api-reference/class/CrossDMScriptChangeListener","CustomEvent":"https://developer.roblox.com/en-us/api-reference/class/CustomEvent","CustomEventReceiver":"https://developer.roblox.com/en-us/api-reference/class/CustomEventReceiver","DataModelMesh":"https://developer.roblox.com/en-us/api-reference/class/DataModelMesh","BevelMesh":"https://developer.roblox.com/en-us/api-reference/class/BevelMesh","BlockMesh":"https://developer.roblox.com/en-us/api-reference/class/BlockMesh","CylinderMesh":"https://developer.roblox.com/en-us/api-reference/class/CylinderMesh","EditableMesh":"https://developer.roblox.com/en-us/api-reference/class/EditableMesh","FileMesh":"https://developer.roblox.com/en-us/api-reference/class/FileMesh","SpecialMesh":"https://developer.roblox.com/en-us/api-reference/class/SpecialMesh","DataModelPatchService":"https://developer.roblox.com/en-us/api-reference/class/DataModelPatchService","DataModelSession":"https://developer.roblox.com/en-us/api-reference/class/DataModelSession","DataStoreGetOptions":"https://developer.roblox.com/en-us/api-reference/class/DataStoreGetOptions","DataStoreIncrementOptions":"https://developer.roblox.com/en-us/api-reference/class/DataStoreIncrementOptions","DataStoreInfo":"https://developer.roblox.com/en-us/api-reference/class/DataStoreInfo","DataStoreKey":"https://developer.roblox.com/en-us/api-reference/class/DataStoreKey","DataStoreKeyInfo":"https://developer.roblox.com/en-us/api-reference/class/DataStoreKeyInfo","DataStoreObjectVersionInfo":"https://developer.roblox.com/en-us/api-reference/class/DataStoreObjectVersionInfo","DataStoreOptions":"https://developer.roblox.com/en-us/api-reference/class/DataStoreOptions","DataStoreService":"https://developer.roblox.com/en-us/api-reference/class/DataStoreService","DataStoreSetOptions":"https://developer.roblox.com/en-us/api-reference/class/DataStoreSetOptions","Debris":"https://developer.roblox.com/en-us/api-reference/class/Debris","DebugSettings":"https://developer.roblox.com/en-us/api-reference/class/DebugSettings","DebuggablePluginWatcher":"https://developer.roblox.com/en-us/api-reference/class/DebuggablePluginWatcher","DebuggerBreakpoint":"https://developer.roblox.com/en-us/api-reference/class/DebuggerBreakpoint","DebuggerConnection":"https://developer.roblox.com/en-us/api-reference/class/DebuggerConnection","LocalDebuggerConnection":"https://developer.roblox.com/en-us/api-reference/class/LocalDebuggerConnection","DebuggerConnectionManager":"https://developer.roblox.com/en-us/api-reference/class/DebuggerConnectionManager","DebuggerLuaResponse":"https://developer.roblox.com/en-us/api-reference/class/DebuggerLuaResponse","DebuggerManager":"https://developer.roblox.com/en-us/api-reference/class/DebuggerManager","DebuggerUIService":"https://developer.roblox.com/en-us/api-reference/class/DebuggerUIService","DebuggerVariable":"https://developer.roblox.com/en-us/api-reference/class/DebuggerVariable","DebuggerWatch":"https://developer.roblox.com/en-us/api-reference/class/DebuggerWatch","DeviceIdService":"https://developer.roblox.com/en-us/api-reference/class/DeviceIdService","Dialog":"https://developer.roblox.com/en-us/api-reference/class/Dialog","DialogChoice":"https://developer.roblox.com/en-us/api-reference/class/DialogChoice","DraftsService":"https://developer.roblox.com/en-us/api-reference/class/DraftsService","Dragger":"https://developer.roblox.com/en-us/api-reference/class/Dragger","DraggerService":"https://developer.roblox.com/en-us/api-reference/class/DraggerService","EditableImage":"https://developer.roblox.com/en-us/api-reference/class/EditableImage","EngineAPICloudProcessingService":"https://developer.roblox.com/en-us/api-reference/class/EngineAPICloudProcessingService","EulerRotationCurve":"https://developer.roblox.com/en-us/api-reference/class/EulerRotationCurve","EventIngestService":"https://developer.roblox.com/en-us/api-reference/class/EventIngestService","ExperienceAuthService":"https://developer.roblox.com/en-us/api-reference/class/ExperienceAuthService","ExperienceInviteOptions":"https://developer.roblox.com/en-us/api-reference/class/ExperienceInviteOptions","ExperienceNotificationService":"https://developer.roblox.com/en-us/api-reference/class/ExperienceNotificationService","ExperienceService":"https://developer.roblox.com/en-us/api-reference/class/ExperienceService","ExperienceStateCaptureService":"https://developer.roblox.com/en-us/api-reference/class/ExperienceStateCaptureService","Explosion":"https://developer.roblox.com/en-us/api-reference/class/Explosion","FaceAnimatorService":"https://developer.roblox.com/en-us/api-reference/class/FaceAnimatorService","FaceControls":"https://developer.roblox.com/en-us/api-reference/class/FaceControls","FaceInstance":"https://developer.roblox.com/en-us/api-reference/class/FaceInstance","Decal":"https://developer.roblox.com/en-us/api-reference/class/Decal","Texture":"https://developer.roblox.com/en-us/api-reference/class/Texture","FacialAnimationRecordingService":"https://developer.roblox.com/en-us/api-reference/class/FacialAnimationRecordingService","FacialAnimationStreamingServiceStats":"https://developer.roblox.com/en-us/api-reference/class/FacialAnimationStreamingServiceStats","FacialAnimationStreamingServiceV2":"https://developer.roblox.com/en-us/api-reference/class/FacialAnimationStreamingServiceV2","FacialAnimationStreamingSubsessionStats":"https://developer.roblox.com/en-us/api-reference/class/FacialAnimationStreamingSubsessionStats","Feature":"https://developer.roblox.com/en-us/api-reference/class/Feature","Hole":"https://developer.roblox.com/en-us/api-reference/class/Hole","MotorFeature":"https://developer.roblox.com/en-us/api-reference/class/MotorFeature","File":"https://developer.roblox.com/en-us/api-reference/class/File","Fire":"https://developer.roblox.com/en-us/api-reference/class/Fire","FlagStandService":"https://developer.roblox.com/en-us/api-reference/class/FlagStandService","FloatCurve":"https://developer.roblox.com/en-us/api-reference/class/FloatCurve","FlyweightService":"https://developer.roblox.com/en-us/api-reference/class/FlyweightService","CSGDictionaryService":"https://developer.roblox.com/en-us/api-reference/class/CSGDictionaryService","NonReplicatedCSGDictionaryService":"https://developer.roblox.com/en-us/api-reference/class/NonReplicatedCSGDictionaryService","Folder":"https://developer.roblox.com/en-us/api-reference/class/Folder","ForceField":"https://developer.roblox.com/en-us/api-reference/class/ForceField","FriendService":"https://developer.roblox.com/en-us/api-reference/class/FriendService","FunctionalTest":"https://developer.roblox.com/en-us/api-reference/class/FunctionalTest","GamePassService":"https://developer.roblox.com/en-us/api-reference/class/GamePassService","GameSettings":"https://developer.roblox.com/en-us/api-reference/class/GameSettings","GamepadService":"https://developer.roblox.com/en-us/api-reference/class/GamepadService","Geometry":"https://developer.roblox.com/en-us/api-reference/class/Geometry","GeometryService":"https://developer.roblox.com/en-us/api-reference/class/GeometryService","GetTextBoundsParams":"https://developer.roblox.com/en-us/api-reference/class/GetTextBoundsParams","GlobalDataStore":"https://developer.roblox.com/en-us/api-reference/class/GlobalDataStore","DataStore":"https://developer.roblox.com/en-us/api-reference/class/DataStore","OrderedDataStore":"https://developer.roblox.com/en-us/api-reference/class/OrderedDataStore","GoogleAnalyticsConfiguration":"https://developer.roblox.com/en-us/api-reference/class/GoogleAnalyticsConfiguration","GroupService":"https://developer.roblox.com/en-us/api-reference/class/GroupService","GuiBase":"https://developer.roblox.com/en-us/api-reference/class/GuiBase","GuiBase2d":"https://developer.roblox.com/en-us/api-reference/class/GuiBase2d","GuiObject":"https://developer.roblox.com/en-us/api-reference/class/GuiObject","CanvasGroup":"https://developer.roblox.com/en-us/api-reference/class/CanvasGroup","Frame":"https://developer.roblox.com/en-us/api-reference/class/Frame","GuiButton":"https://developer.roblox.com/en-us/api-reference/class/GuiButton","ImageButton":"https://developer.roblox.com/en-us/api-reference/class/ImageButton","TextButton":"https://developer.roblox.com/en-us/api-reference/class/TextButton","GuiLabel":"https://developer.roblox.com/en-us/api-reference/class/GuiLabel","ImageLabel":"https://developer.roblox.com/en-us/api-reference/class/ImageLabel","TextLabel":"https://developer.roblox.com/en-us/api-reference/class/TextLabel","ScrollingFrame":"https://developer.roblox.com/en-us/api-reference/class/ScrollingFrame","TextBox":"https://developer.roblox.com/en-us/api-reference/class/TextBox","VideoFrame":"https://developer.roblox.com/en-us/api-reference/class/VideoFrame","ViewportFrame":"https://developer.roblox.com/en-us/api-reference/class/ViewportFrame","LayerCollector":"https://developer.roblox.com/en-us/api-reference/class/LayerCollector","BillboardGui":"https://developer.roblox.com/en-us/api-reference/class/BillboardGui","PluginGui":"https://developer.roblox.com/en-us/api-reference/class/PluginGui","DockWidgetPluginGui":"https://developer.roblox.com/en-us/api-reference/class/DockWidgetPluginGui","QWidgetPluginGui":"https://developer.roblox.com/en-us/api-reference/class/QWidgetPluginGui","ScreenGui":"https://developer.roblox.com/en-us/api-reference/class/ScreenGui","GuiMain":"https://developer.roblox.com/en-us/api-reference/class/GuiMain","SurfaceGuiBase":"https://developer.roblox.com/en-us/api-reference/class/SurfaceGuiBase","AdGui":"https://developer.roblox.com/en-us/api-reference/class/AdGui","SurfaceGui":"https://developer.roblox.com/en-us/api-reference/class/SurfaceGui","GuiBase3d":"https://developer.roblox.com/en-us/api-reference/class/GuiBase3d","FloorWire":"https://developer.roblox.com/en-us/api-reference/class/FloorWire","InstanceAdornment":"https://developer.roblox.com/en-us/api-reference/class/InstanceAdornment","SelectionBox":"https://developer.roblox.com/en-us/api-reference/class/SelectionBox","PVAdornment":"https://developer.roblox.com/en-us/api-reference/class/PVAdornment","HandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/HandleAdornment","BoxHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/BoxHandleAdornment","ConeHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/ConeHandleAdornment","CylinderHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/CylinderHandleAdornment","ImageHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/ImageHandleAdornment","LineHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/LineHandleAdornment","SphereHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/SphereHandleAdornment","WireframeHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/WireframeHandleAdornment","ParabolaAdornment":"https://developer.roblox.com/en-us/api-reference/class/ParabolaAdornment","SelectionSphere":"https://developer.roblox.com/en-us/api-reference/class/SelectionSphere","PartAdornment":"https://developer.roblox.com/en-us/api-reference/class/PartAdornment","HandlesBase":"https://developer.roblox.com/en-us/api-reference/class/HandlesBase","ArcHandles":"https://developer.roblox.com/en-us/api-reference/class/ArcHandles","Handles":"https://developer.roblox.com/en-us/api-reference/class/Handles","SurfaceSelection":"https://developer.roblox.com/en-us/api-reference/class/SurfaceSelection","SelectionLasso":"https://developer.roblox.com/en-us/api-reference/class/SelectionLasso","SelectionPartLasso":"https://developer.roblox.com/en-us/api-reference/class/SelectionPartLasso","SelectionPointLasso":"https://developer.roblox.com/en-us/api-reference/class/SelectionPointLasso","Path2D":"https://developer.roblox.com/en-us/api-reference/class/Path2D","GuiService":"https://developer.roblox.com/en-us/api-reference/class/GuiService","GuidRegistryService":"https://developer.roblox.com/en-us/api-reference/class/GuidRegistryService","HapticService":"https://developer.roblox.com/en-us/api-reference/class/HapticService","HeightmapImporterService":"https://developer.roblox.com/en-us/api-reference/class/HeightmapImporterService","HiddenSurfaceRemovalAsset":"https://developer.roblox.com/en-us/api-reference/class/HiddenSurfaceRemovalAsset","Highlight":"https://developer.roblox.com/en-us/api-reference/class/Highlight","Hopper":"https://developer.roblox.com/en-us/api-reference/class/Hopper","HttpRbxApiService":"https://developer.roblox.com/en-us/api-reference/class/HttpRbxApiService","HttpRequest":"https://developer.roblox.com/en-us/api-reference/class/HttpRequest","HttpService":"https://developer.roblox.com/en-us/api-reference/class/HttpService","Humanoid":"https://developer.roblox.com/en-us/api-reference/class/Humanoid","HumanoidDescription":"https://developer.roblox.com/en-us/api-reference/class/HumanoidDescription","IKControl":"https://developer.roblox.com/en-us/api-reference/class/IKControl","ILegacyStudioBridge":"https://developer.roblox.com/en-us/api-reference/class/ILegacyStudioBridge","LegacyStudioBridge":"https://developer.roblox.com/en-us/api-reference/class/LegacyStudioBridge","IXPService":"https://developer.roblox.com/en-us/api-reference/class/IXPService","IncrementalPatchBuilder":"https://developer.roblox.com/en-us/api-reference/class/IncrementalPatchBuilder","InputObject":"https://developer.roblox.com/en-us/api-reference/class/InputObject","InsertService":"https://developer.roblox.com/en-us/api-reference/class/InsertService","JointInstance":"https://developer.roblox.com/en-us/api-reference/class/JointInstance","DynamicRotate":"https://developer.roblox.com/en-us/api-reference/class/DynamicRotate","RotateP":"https://developer.roblox.com/en-us/api-reference/class/RotateP","RotateV":"https://developer.roblox.com/en-us/api-reference/class/RotateV","Glue":"https://developer.roblox.com/en-us/api-reference/class/Glue","ManualSurfaceJointInstance":"https://developer.roblox.com/en-us/api-reference/class/ManualSurfaceJointInstance","ManualGlue":"https://developer.roblox.com/en-us/api-reference/class/ManualGlue","ManualWeld":"https://developer.roblox.com/en-us/api-reference/class/ManualWeld","Motor":"https://developer.roblox.com/en-us/api-reference/class/Motor","Motor6D":"https://developer.roblox.com/en-us/api-reference/class/Motor6D","Rotate":"https://developer.roblox.com/en-us/api-reference/class/Rotate","Snap":"https://developer.roblox.com/en-us/api-reference/class/Snap","VelocityMotor":"https://developer.roblox.com/en-us/api-reference/class/VelocityMotor","Weld":"https://developer.roblox.com/en-us/api-reference/class/Weld","JointsService":"https://developer.roblox.com/en-us/api-reference/class/JointsService","KeyboardService":"https://developer.roblox.com/en-us/api-reference/class/KeyboardService","Keyframe":"https://developer.roblox.com/en-us/api-reference/class/Keyframe","KeyframeMarker":"https://developer.roblox.com/en-us/api-reference/class/KeyframeMarker","KeyframeSequenceProvider":"https://developer.roblox.com/en-us/api-reference/class/KeyframeSequenceProvider","LSPFileSyncService":"https://developer.roblox.com/en-us/api-reference/class/LSPFileSyncService","LanguageService":"https://developer.roblox.com/en-us/api-reference/class/LanguageService","Light":"https://developer.roblox.com/en-us/api-reference/class/Light","PointLight":"https://developer.roblox.com/en-us/api-reference/class/PointLight","SpotLight":"https://developer.roblox.com/en-us/api-reference/class/SpotLight","SurfaceLight":"https://developer.roblox.com/en-us/api-reference/class/SurfaceLight","Lighting":"https://developer.roblox.com/en-us/api-reference/class/Lighting","LiveScriptingService":"https://developer.roblox.com/en-us/api-reference/class/LiveScriptingService","LocalStorageService":"https://developer.roblox.com/en-us/api-reference/class/LocalStorageService","AppStorageService":"https://developer.roblox.com/en-us/api-reference/class/AppStorageService","UserStorageService":"https://developer.roblox.com/en-us/api-reference/class/UserStorageService","LocalizationService":"https://developer.roblox.com/en-us/api-reference/class/LocalizationService","LocalizationTable":"https://developer.roblox.com/en-us/api-reference/class/LocalizationTable","CloudLocalizationTable":"https://developer.roblox.com/en-us/api-reference/class/CloudLocalizationTable","LodDataEntity":"https://developer.roblox.com/en-us/api-reference/class/LodDataEntity","LodDataService":"https://developer.roblox.com/en-us/api-reference/class/LodDataService","LogReporterService":"https://developer.roblox.com/en-us/api-reference/class/LogReporterService","LogService":"https://developer.roblox.com/en-us/api-reference/class/LogService","LoginService":"https://developer.roblox.com/en-us/api-reference/class/LoginService","LuaSettings":"https://developer.roblox.com/en-us/api-reference/class/LuaSettings","LuaSourceContainer":"https://developer.roblox.com/en-us/api-reference/class/LuaSourceContainer","BaseScript":"https://developer.roblox.com/en-us/api-reference/class/BaseScript","CoreScript":"https://developer.roblox.com/en-us/api-reference/class/CoreScript","Script":"https://developer.roblox.com/en-us/api-reference/class/Script","LocalScript":"https://developer.roblox.com/en-us/api-reference/class/LocalScript","ModuleScript":"https://developer.roblox.com/en-us/api-reference/class/ModuleScript","LuaWebService":"https://developer.roblox.com/en-us/api-reference/class/LuaWebService","LuauScriptAnalyzerService":"https://developer.roblox.com/en-us/api-reference/class/LuauScriptAnalyzerService","MarkerCurve":"https://developer.roblox.com/en-us/api-reference/class/MarkerCurve","MarketplaceService":"https://developer.roblox.com/en-us/api-reference/class/MarketplaceService","MaterialGenerationService":"https://developer.roblox.com/en-us/api-reference/class/MaterialGenerationService","MaterialGenerationSession":"https://developer.roblox.com/en-us/api-reference/class/MaterialGenerationSession","MaterialService":"https://developer.roblox.com/en-us/api-reference/class/MaterialService","MaterialVariant":"https://developer.roblox.com/en-us/api-reference/class/MaterialVariant","MemStorageConnection":"https://developer.roblox.com/en-us/api-reference/class/MemStorageConnection","MemStorageService":"https://developer.roblox.com/en-us/api-reference/class/MemStorageService","MemoryStoreHashMap":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreHashMap","MemoryStoreQueue":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreQueue","MemoryStoreService":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreService","MemoryStoreSortedMap":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreSortedMap","Message":"https://developer.roblox.com/en-us/api-reference/class/Message","Hint":"https://developer.roblox.com/en-us/api-reference/class/Hint","MessageBusConnection":"https://developer.roblox.com/en-us/api-reference/class/MessageBusConnection","MessageBusService":"https://developer.roblox.com/en-us/api-reference/class/MessageBusService","MessagingService":"https://developer.roblox.com/en-us/api-reference/class/MessagingService","MetaBreakpoint":"https://developer.roblox.com/en-us/api-reference/class/MetaBreakpoint","MetaBreakpointContext":"https://developer.roblox.com/en-us/api-reference/class/MetaBreakpointContext","MetaBreakpointManager":"https://developer.roblox.com/en-us/api-reference/class/MetaBreakpointManager","Mouse":"https://developer.roblox.com/en-us/api-reference/class/Mouse","PlayerMouse":"https://developer.roblox.com/en-us/api-reference/class/PlayerMouse","PluginMouse":"https://developer.roblox.com/en-us/api-reference/class/PluginMouse","MouseService":"https://developer.roblox.com/en-us/api-reference/class/MouseService","MultipleDocumentInterfaceInstance":"https://developer.roblox.com/en-us/api-reference/class/MultipleDocumentInterfaceInstance","NetworkMarker":"https://developer.roblox.com/en-us/api-reference/class/NetworkMarker","NetworkPeer":"https://developer.roblox.com/en-us/api-reference/class/NetworkPeer","NetworkClient":"https://developer.roblox.com/en-us/api-reference/class/NetworkClient","NetworkServer":"https://developer.roblox.com/en-us/api-reference/class/NetworkServer","NetworkReplicator":"https://developer.roblox.com/en-us/api-reference/class/NetworkReplicator","ClientReplicator":"https://developer.roblox.com/en-us/api-reference/class/ClientReplicator","ServerReplicator":"https://developer.roblox.com/en-us/api-reference/class/ServerReplicator","NetworkSettings":"https://developer.roblox.com/en-us/api-reference/class/NetworkSettings","NoCollisionConstraint":"https://developer.roblox.com/en-us/api-reference/class/NoCollisionConstraint","NotificationService":"https://developer.roblox.com/en-us/api-reference/class/NotificationService","OmniRecommendationsService":"https://developer.roblox.com/en-us/api-reference/class/OmniRecommendationsService","OpenCloudApiV1":"https://developer.roblox.com/en-us/api-reference/class/OpenCloudApiV1","OpenCloudService":"https://developer.roblox.com/en-us/api-reference/class/OpenCloudService","OperationGraph":"https://developer.roblox.com/en-us/api-reference/class/OperationGraph","PVInstance":"https://developer.roblox.com/en-us/api-reference/class/PVInstance","BasePart":"https://developer.roblox.com/en-us/api-reference/class/BasePart","CornerWedgePart":"https://developer.roblox.com/en-us/api-reference/class/CornerWedgePart","FormFactorPart":"https://developer.roblox.com/en-us/api-reference/class/FormFactorPart","Part":"https://developer.roblox.com/en-us/api-reference/class/Part","FlagStand":"https://developer.roblox.com/en-us/api-reference/class/FlagStand","Platform":"https://developer.roblox.com/en-us/api-reference/enum/Platform","Seat":"https://developer.roblox.com/en-us/api-reference/class/Seat","SkateboardPlatform":"https://developer.roblox.com/en-us/api-reference/class/SkateboardPlatform","SpawnLocation":"https://developer.roblox.com/en-us/api-reference/class/SpawnLocation","WedgePart":"https://developer.roblox.com/en-us/api-reference/class/WedgePart","Terrain":"https://developer.roblox.com/en-us/api-reference/class/Terrain","TriangleMeshPart":"https://developer.roblox.com/en-us/api-reference/class/TriangleMeshPart","MeshPart":"https://developer.roblox.com/en-us/api-reference/class/MeshPart","PartOperation":"https://developer.roblox.com/en-us/api-reference/class/PartOperation","IntersectOperation":"https://developer.roblox.com/en-us/api-reference/class/IntersectOperation","NegateOperation":"https://developer.roblox.com/en-us/api-reference/class/NegateOperation","UnionOperation":"https://developer.roblox.com/en-us/api-reference/class/UnionOperation","TrussPart":"https://developer.roblox.com/en-us/api-reference/class/TrussPart","VehicleSeat":"https://developer.roblox.com/en-us/api-reference/class/VehicleSeat","Model":"https://developer.roblox.com/en-us/api-reference/class/Model","Actor":"https://developer.roblox.com/en-us/api-reference/class/Actor","BackpackItem":"https://developer.roblox.com/en-us/api-reference/class/BackpackItem","HopperBin":"https://developer.roblox.com/en-us/api-reference/class/HopperBin","Tool":"https://developer.roblox.com/en-us/api-reference/class/Tool","Flag":"https://developer.roblox.com/en-us/api-reference/class/Flag","Status":"https://developer.roblox.com/en-us/api-reference/enum/Status","WorldRoot":"https://developer.roblox.com/en-us/api-reference/class/WorldRoot","Workspace":"https://developer.roblox.com/en-us/api-reference/class/Workspace","WorldModel":"https://developer.roblox.com/en-us/api-reference/class/WorldModel","PackageLink":"https://developer.roblox.com/en-us/api-reference/class/PackageLink","PackageService":"https://developer.roblox.com/en-us/api-reference/class/PackageService","PackageUIService":"https://developer.roblox.com/en-us/api-reference/class/PackageUIService","Pages":"https://developer.roblox.com/en-us/api-reference/class/Pages","AudioPages":"https://developer.roblox.com/en-us/api-reference/class/AudioPages","CatalogPages":"https://developer.roblox.com/en-us/api-reference/class/CatalogPages","DataStoreKeyPages":"https://developer.roblox.com/en-us/api-reference/class/DataStoreKeyPages","DataStoreListingPages":"https://developer.roblox.com/en-us/api-reference/class/DataStoreListingPages","DataStorePages":"https://developer.roblox.com/en-us/api-reference/class/DataStorePages","DataStoreVersionPages":"https://developer.roblox.com/en-us/api-reference/class/DataStoreVersionPages","FriendPages":"https://developer.roblox.com/en-us/api-reference/class/FriendPages","InventoryPages":"https://developer.roblox.com/en-us/api-reference/class/InventoryPages","EmotesPages":"https://developer.roblox.com/en-us/api-reference/class/EmotesPages","MemoryStoreHashMapPages":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreHashMapPages","OutfitPages":"https://developer.roblox.com/en-us/api-reference/class/OutfitPages","StandardPages":"https://developer.roblox.com/en-us/api-reference/class/StandardPages","PartOperationAsset":"https://developer.roblox.com/en-us/api-reference/class/PartOperationAsset","ParticleEmitter":"https://developer.roblox.com/en-us/api-reference/class/ParticleEmitter","PatchBundlerFileWatch":"https://developer.roblox.com/en-us/api-reference/class/PatchBundlerFileWatch","PatchMapping":"https://developer.roblox.com/en-us/api-reference/class/PatchMapping","Path":"https://developer.roblox.com/en-us/api-reference/class/Path","PathfindingLink":"https://developer.roblox.com/en-us/api-reference/class/PathfindingLink","PathfindingModifier":"https://developer.roblox.com/en-us/api-reference/class/PathfindingModifier","PathfindingService":"https://developer.roblox.com/en-us/api-reference/class/PathfindingService","PausedState":"https://developer.roblox.com/en-us/api-reference/class/PausedState","PausedStateBreakpoint":"https://developer.roblox.com/en-us/api-reference/class/PausedStateBreakpoint","PausedStateException":"https://developer.roblox.com/en-us/api-reference/class/PausedStateException","PermissionsService":"https://developer.roblox.com/en-us/api-reference/class/PermissionsService","PhysicsService":"https://developer.roblox.com/en-us/api-reference/class/PhysicsService","PhysicsSettings":"https://developer.roblox.com/en-us/api-reference/class/PhysicsSettings","PlaceStatsService":"https://developer.roblox.com/en-us/api-reference/class/PlaceStatsService","PlacesService":"https://developer.roblox.com/en-us/api-reference/class/PlacesService","PlatformCloudStorageService":"https://developer.roblox.com/en-us/api-reference/class/PlatformCloudStorageService","PlatformFriendsService":"https://developer.roblox.com/en-us/api-reference/class/PlatformFriendsService","Player":"https://developer.roblox.com/en-us/api-reference/class/Player","PlayerEmulatorService":"https://developer.roblox.com/en-us/api-reference/class/PlayerEmulatorService","PlayerScripts":"https://developer.roblox.com/en-us/api-reference/class/PlayerScripts","PlayerViewService":"https://developer.roblox.com/en-us/api-reference/class/PlayerViewService","Players":"https://developer.roblox.com/en-us/api-reference/class/Players","Plugin":"https://developer.roblox.com/en-us/api-reference/class/Plugin","PluginAction":"https://developer.roblox.com/en-us/api-reference/class/PluginAction","PluginCapabilities":"https://developer.roblox.com/en-us/api-reference/class/PluginCapabilities","PluginDebugService":"https://developer.roblox.com/en-us/api-reference/class/PluginDebugService","PluginDragEvent":"https://developer.roblox.com/en-us/api-reference/class/PluginDragEvent","PluginGuiService":"https://developer.roblox.com/en-us/api-reference/class/PluginGuiService","PluginManagementService":"https://developer.roblox.com/en-us/api-reference/class/PluginManagementService","PluginManager":"https://developer.roblox.com/en-us/api-reference/class/PluginManager","PluginManagerInterface":"https://developer.roblox.com/en-us/api-reference/class/PluginManagerInterface","PluginMenu":"https://developer.roblox.com/en-us/api-reference/class/PluginMenu","PluginPolicyService":"https://developer.roblox.com/en-us/api-reference/class/PluginPolicyService","PluginToolbar":"https://developer.roblox.com/en-us/api-reference/class/PluginToolbar","PluginToolbarButton":"https://developer.roblox.com/en-us/api-reference/class/PluginToolbarButton","PointsService":"https://developer.roblox.com/en-us/api-reference/class/PointsService","PolicyService":"https://developer.roblox.com/en-us/api-reference/class/PolicyService","PoseBase":"https://developer.roblox.com/en-us/api-reference/class/PoseBase","NumberPose":"https://developer.roblox.com/en-us/api-reference/class/NumberPose","Pose":"https://developer.roblox.com/en-us/api-reference/class/Pose","PostEffect":"https://developer.roblox.com/en-us/api-reference/class/PostEffect","BloomEffect":"https://developer.roblox.com/en-us/api-reference/class/BloomEffect","BlurEffect":"https://developer.roblox.com/en-us/api-reference/class/BlurEffect","ColorCorrectionEffect":"https://developer.roblox.com/en-us/api-reference/class/ColorCorrectionEffect","DepthOfFieldEffect":"https://developer.roblox.com/en-us/api-reference/class/DepthOfFieldEffect","SunRaysEffect":"https://developer.roblox.com/en-us/api-reference/class/SunRaysEffect","ProcessInstancePhysicsService":"https://developer.roblox.com/en-us/api-reference/class/ProcessInstancePhysicsService","ProximityPrompt":"https://developer.roblox.com/en-us/api-reference/class/ProximityPrompt","ProximityPromptService":"https://developer.roblox.com/en-us/api-reference/class/ProximityPromptService","PublishService":"https://developer.roblox.com/en-us/api-reference/class/PublishService","RbxAnalyticsService":"https://developer.roblox.com/en-us/api-reference/class/RbxAnalyticsService","ReflectionMetadata":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadata","ReflectionMetadataCallbacks":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataCallbacks","ReflectionMetadataClasses":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataClasses","ReflectionMetadataEnums":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataEnums","ReflectionMetadataEvents":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataEvents","ReflectionMetadataFunctions":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataFunctions","ReflectionMetadataItem":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataItem","ReflectionMetadataClass":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataClass","ReflectionMetadataEnum":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataEnum","ReflectionMetadataEnumItem":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataEnumItem","ReflectionMetadataMember":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataMember","ReflectionMetadataProperties":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataProperties","ReflectionMetadataYieldFunctions":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataYieldFunctions","ReflectionService":"https://developer.roblox.com/en-us/api-reference/class/ReflectionService","RemoteCursorService":"https://developer.roblox.com/en-us/api-reference/class/RemoteCursorService","RemoteDebuggerServer":"https://developer.roblox.com/en-us/api-reference/class/RemoteDebuggerServer","RemoteFunction":"https://developer.roblox.com/en-us/api-reference/class/RemoteFunction","RenderSettings":"https://developer.roblox.com/en-us/api-reference/class/RenderSettings","RenderingTest":"https://developer.roblox.com/en-us/api-reference/class/RenderingTest","ReplicatedFirst":"https://developer.roblox.com/en-us/api-reference/class/ReplicatedFirst","ReplicatedStorage":"https://developer.roblox.com/en-us/api-reference/class/ReplicatedStorage","RibbonNotificationService":"https://developer.roblox.com/en-us/api-reference/class/RibbonNotificationService","RobloxPluginGuiService":"https://developer.roblox.com/en-us/api-reference/class/RobloxPluginGuiService","RobloxReplicatedStorage":"https://developer.roblox.com/en-us/api-reference/class/RobloxReplicatedStorage","RobloxServerStorage":"https://developer.roblox.com/en-us/api-reference/class/RobloxServerStorage","RomarkService":"https://developer.roblox.com/en-us/api-reference/class/RomarkService","RotationCurve":"https://developer.roblox.com/en-us/api-reference/class/RotationCurve","RtMessagingService":"https://developer.roblox.com/en-us/api-reference/class/RtMessagingService","RunService":"https://developer.roblox.com/en-us/api-reference/class/RunService","RuntimeScriptService":"https://developer.roblox.com/en-us/api-reference/class/RuntimeScriptService","SafetyService":"https://developer.roblox.com/en-us/api-reference/class/SafetyService","ScreenshotHud":"https://developer.roblox.com/en-us/api-reference/class/ScreenshotHud","ScriptBuilder":"https://developer.roblox.com/en-us/api-reference/class/ScriptBuilder","SyncScriptBuilder":"https://developer.roblox.com/en-us/api-reference/class/SyncScriptBuilder","ScriptChangeService":"https://developer.roblox.com/en-us/api-reference/class/ScriptChangeService","ScriptCloneWatcher":"https://developer.roblox.com/en-us/api-reference/class/ScriptCloneWatcher","ScriptCloneWatcherHelper":"https://developer.roblox.com/en-us/api-reference/class/ScriptCloneWatcherHelper","ScriptCommitService":"https://developer.roblox.com/en-us/api-reference/class/ScriptCommitService","ScriptContext":"https://developer.roblox.com/en-us/api-reference/class/ScriptContext","ScriptDebugger":"https://developer.roblox.com/en-us/api-reference/class/ScriptDebugger","ScriptDocument":"https://developer.roblox.com/en-us/api-reference/class/ScriptDocument","ScriptEditorService":"https://developer.roblox.com/en-us/api-reference/class/ScriptEditorService","ScriptRegistrationService":"https://developer.roblox.com/en-us/api-reference/class/ScriptRegistrationService","ScriptRuntime":"https://developer.roblox.com/en-us/api-reference/class/ScriptRuntime","ScriptService":"https://developer.roblox.com/en-us/api-reference/class/ScriptService","Selection":"https://developer.roblox.com/en-us/api-reference/class/Selection","SelectionHighlightManager":"https://developer.roblox.com/en-us/api-reference/class/SelectionHighlightManager","SensorBase":"https://developer.roblox.com/en-us/api-reference/class/SensorBase","BuoyancySensor":"https://developer.roblox.com/en-us/api-reference/class/BuoyancySensor","ControllerSensor":"https://developer.roblox.com/en-us/api-reference/class/ControllerSensor","ControllerPartSensor":"https://developer.roblox.com/en-us/api-reference/class/ControllerPartSensor","ServerScriptService":"https://developer.roblox.com/en-us/api-reference/class/ServerScriptService","ServerStorage":"https://developer.roblox.com/en-us/api-reference/class/ServerStorage","ServiceProvider":"https://developer.roblox.com/en-us/api-reference/class/ServiceProvider","DataModel":"https://developer.roblox.com/en-us/api-reference/class/DataModel","GenericSettings":"https://developer.roblox.com/en-us/api-reference/class/GenericSettings","AnalysticsSettings":"https://developer.roblox.com/en-us/api-reference/class/AnalysticsSettings","GlobalSettings":"https://developer.roblox.com/en-us/api-reference/class/GlobalSettings","UserSettings":"https://developer.roblox.com/en-us/api-reference/class/UserSettings","ServiceVisibilityService":"https://developer.roblox.com/en-us/api-reference/class/ServiceVisibilityService","SessionService":"https://developer.roblox.com/en-us/api-reference/class/SessionService","SharedTableRegistry":"https://developer.roblox.com/en-us/api-reference/class/SharedTableRegistry","ShorelineUpgraderService":"https://developer.roblox.com/en-us/api-reference/class/ShorelineUpgraderService","Sky":"https://developer.roblox.com/en-us/api-reference/class/Sky","Smoke":"https://developer.roblox.com/en-us/api-reference/class/Smoke","SmoothVoxelsUpgraderService":"https://developer.roblox.com/en-us/api-reference/class/SmoothVoxelsUpgraderService","SnippetService":"https://developer.roblox.com/en-us/api-reference/class/SnippetService","SocialService":"https://developer.roblox.com/en-us/api-reference/class/SocialService","Sound":"https://developer.roblox.com/en-us/api-reference/class/Sound","SoundEffect":"https://developer.roblox.com/en-us/api-reference/class/SoundEffect","ChorusSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/ChorusSoundEffect","CompressorSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/CompressorSoundEffect","CustomSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/CustomSoundEffect","AssetSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/AssetSoundEffect","ChannelSelectorSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/ChannelSelectorSoundEffect","DistortionSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/DistortionSoundEffect","EchoSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/EchoSoundEffect","EqualizerSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/EqualizerSoundEffect","FlangeSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/FlangeSoundEffect","PitchShiftSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/PitchShiftSoundEffect","ReverbSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/ReverbSoundEffect","TremoloSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/TremoloSoundEffect","SoundGroup":"https://developer.roblox.com/en-us/api-reference/class/SoundGroup","SoundService":"https://developer.roblox.com/en-us/api-reference/class/SoundService","Sparkles":"https://developer.roblox.com/en-us/api-reference/class/Sparkles","SpawnerService":"https://developer.roblox.com/en-us/api-reference/class/SpawnerService","StackFrame":"https://developer.roblox.com/en-us/api-reference/class/StackFrame","StandalonePluginScripts":"https://developer.roblox.com/en-us/api-reference/class/StandalonePluginScripts","StarterGear":"https://developer.roblox.com/en-us/api-reference/class/StarterGear","StarterPack":"https://developer.roblox.com/en-us/api-reference/class/StarterPack","StarterPlayer":"https://developer.roblox.com/en-us/api-reference/class/StarterPlayer","StarterPlayerScripts":"https://developer.roblox.com/en-us/api-reference/class/StarterPlayerScripts","StarterCharacterScripts":"https://developer.roblox.com/en-us/api-reference/class/StarterCharacterScripts","Stats":"https://developer.roblox.com/en-us/api-reference/class/Stats","StatsItem":"https://developer.roblox.com/en-us/api-reference/class/StatsItem","RunningAverageItemDouble":"https://developer.roblox.com/en-us/api-reference/class/RunningAverageItemDouble","RunningAverageItemInt":"https://developer.roblox.com/en-us/api-reference/class/RunningAverageItemInt","RunningAverageTimeIntervalItem":"https://developer.roblox.com/en-us/api-reference/class/RunningAverageTimeIntervalItem","TotalCountTimeIntervalItem":"https://developer.roblox.com/en-us/api-reference/class/TotalCountTimeIntervalItem","StopWatchReporter":"https://developer.roblox.com/en-us/api-reference/class/StopWatchReporter","StreamingService":"https://developer.roblox.com/en-us/api-reference/class/StreamingService","Studio":"https://developer.roblox.com/en-us/api-reference/class/Studio","StudioAssetService":"https://developer.roblox.com/en-us/api-reference/class/StudioAssetService","StudioAttachment":"https://developer.roblox.com/en-us/api-reference/class/StudioAttachment","StudioCallout":"https://developer.roblox.com/en-us/api-reference/class/StudioCallout","StudioData":"https://developer.roblox.com/en-us/api-reference/class/StudioData","StudioDeviceEmulatorService":"https://developer.roblox.com/en-us/api-reference/class/StudioDeviceEmulatorService","StudioObjectBase":"https://developer.roblox.com/en-us/api-reference/class/StudioObjectBase","StudioWidget":"https://developer.roblox.com/en-us/api-reference/class/StudioWidget","StudioPublishService":"https://developer.roblox.com/en-us/api-reference/class/StudioPublishService","StudioScriptDebugEventListener":"https://developer.roblox.com/en-us/api-reference/class/StudioScriptDebugEventListener","StudioSdkService":"https://developer.roblox.com/en-us/api-reference/class/StudioSdkService","StudioService":"https://developer.roblox.com/en-us/api-reference/class/StudioService","StudioTheme":"https://developer.roblox.com/en-us/api-reference/class/StudioTheme","StudioWidgetsService":"https://developer.roblox.com/en-us/api-reference/class/StudioWidgetsService","StyleBase":"https://developer.roblox.com/en-us/api-reference/class/StyleBase","StyleRule":"https://developer.roblox.com/en-us/api-reference/class/StyleRule","StyleSheet":"https://developer.roblox.com/en-us/api-reference/class/StyleSheet","StyleDerive":"https://developer.roblox.com/en-us/api-reference/class/StyleDerive","StyleLink":"https://developer.roblox.com/en-us/api-reference/class/StyleLink","StylingService":"https://developer.roblox.com/en-us/api-reference/class/StylingService","SurfaceAppearance":"https://developer.roblox.com/en-us/api-reference/class/SurfaceAppearance","TaskScheduler":"https://developer.roblox.com/en-us/api-reference/class/TaskScheduler","Team":"https://developer.roblox.com/en-us/api-reference/class/Team","TeamCreateData":"https://developer.roblox.com/en-us/api-reference/class/TeamCreateData","TeamCreatePublishService":"https://developer.roblox.com/en-us/api-reference/class/TeamCreatePublishService","TeamCreateService":"https://developer.roblox.com/en-us/api-reference/class/TeamCreateService","Teams":"https://developer.roblox.com/en-us/api-reference/class/Teams","TeleportAsyncResult":"https://developer.roblox.com/en-us/api-reference/class/TeleportAsyncResult","TeleportOptions":"https://developer.roblox.com/en-us/api-reference/class/TeleportOptions","TeleportService":"https://developer.roblox.com/en-us/api-reference/class/TeleportService","TemporaryCageMeshProvider":"https://developer.roblox.com/en-us/api-reference/class/TemporaryCageMeshProvider","TemporaryScriptService":"https://developer.roblox.com/en-us/api-reference/class/TemporaryScriptService","TerrainDetail":"https://developer.roblox.com/en-us/api-reference/class/TerrainDetail","TerrainRegion":"https://developer.roblox.com/en-us/api-reference/class/TerrainRegion","TestService":"https://developer.roblox.com/en-us/api-reference/class/TestService","TextBoxService":"https://developer.roblox.com/en-us/api-reference/class/TextBoxService","TextChannel":"https://developer.roblox.com/en-us/api-reference/class/TextChannel","TextChatCommand":"https://developer.roblox.com/en-us/api-reference/class/TextChatCommand","TextChatConfigurations":"https://developer.roblox.com/en-us/api-reference/class/TextChatConfigurations","BubbleChatConfiguration":"https://developer.roblox.com/en-us/api-reference/class/BubbleChatConfiguration","ChatInputBarConfiguration":"https://developer.roblox.com/en-us/api-reference/class/ChatInputBarConfiguration","ChatWindowConfiguration":"https://developer.roblox.com/en-us/api-reference/class/ChatWindowConfiguration","TextChatMessage":"https://developer.roblox.com/en-us/api-reference/class/TextChatMessage","TextChatMessageProperties":"https://developer.roblox.com/en-us/api-reference/class/TextChatMessageProperties","TextChatService":"https://developer.roblox.com/en-us/api-reference/class/TextChatService","TextFilterResult":"https://developer.roblox.com/en-us/api-reference/class/TextFilterResult","TextFilterTranslatedResult":"https://developer.roblox.com/en-us/api-reference/class/TextFilterTranslatedResult","TextService":"https://developer.roblox.com/en-us/api-reference/class/TextService","TextSource":"https://developer.roblox.com/en-us/api-reference/class/TextSource","TextureGenerationMeshHandler":"https://developer.roblox.com/en-us/api-reference/class/TextureGenerationMeshHandler","ThirdPartyUserService":"https://developer.roblox.com/en-us/api-reference/class/ThirdPartyUserService","ThreadState":"https://developer.roblox.com/en-us/api-reference/class/ThreadState","TimerService":"https://developer.roblox.com/en-us/api-reference/class/TimerService","ToastNotificationService":"https://developer.roblox.com/en-us/api-reference/class/ToastNotificationService","TouchInputService":"https://developer.roblox.com/en-us/api-reference/class/TouchInputService","TouchTransmitter":"https://developer.roblox.com/en-us/api-reference/class/TouchTransmitter","TracerService":"https://developer.roblox.com/en-us/api-reference/class/TracerService","TrackerLodController":"https://developer.roblox.com/en-us/api-reference/class/TrackerLodController","TrackerStreamAnimation":"https://developer.roblox.com/en-us/api-reference/class/TrackerStreamAnimation","Trail":"https://developer.roblox.com/en-us/api-reference/class/Trail","Translator":"https://developer.roblox.com/en-us/api-reference/class/Translator","TutorialService":"https://developer.roblox.com/en-us/api-reference/class/TutorialService","TweenBase":"https://developer.roblox.com/en-us/api-reference/class/TweenBase","Tween":"https://developer.roblox.com/en-us/api-reference/class/Tween","TweenService":"https://developer.roblox.com/en-us/api-reference/class/TweenService","UGCAvatarService":"https://developer.roblox.com/en-us/api-reference/class/UGCAvatarService","UGCValidationService":"https://developer.roblox.com/en-us/api-reference/class/UGCValidationService","UIBase":"https://developer.roblox.com/en-us/api-reference/class/UIBase","UIComponent":"https://developer.roblox.com/en-us/api-reference/class/UIComponent","UIConstraint":"https://developer.roblox.com/en-us/api-reference/class/UIConstraint","UIAspectRatioConstraint":"https://developer.roblox.com/en-us/api-reference/class/UIAspectRatioConstraint","UISizeConstraint":"https://developer.roblox.com/en-us/api-reference/class/UISizeConstraint","UITextSizeConstraint":"https://developer.roblox.com/en-us/api-reference/class/UITextSizeConstraint","UICorner":"https://developer.roblox.com/en-us/api-reference/class/UICorner","UIFlexItem":"https://developer.roblox.com/en-us/api-reference/class/UIFlexItem","UIGradient":"https://developer.roblox.com/en-us/api-reference/class/UIGradient","UILayout":"https://developer.roblox.com/en-us/api-reference/class/UILayout","UIGridStyleLayout":"https://developer.roblox.com/en-us/api-reference/class/UIGridStyleLayout","UIGridLayout":"https://developer.roblox.com/en-us/api-reference/class/UIGridLayout","UIListLayout":"https://developer.roblox.com/en-us/api-reference/class/UIListLayout","UIPageLayout":"https://developer.roblox.com/en-us/api-reference/class/UIPageLayout","UITableLayout":"https://developer.roblox.com/en-us/api-reference/class/UITableLayout","UIPadding":"https://developer.roblox.com/en-us/api-reference/class/UIPadding","UIScale":"https://developer.roblox.com/en-us/api-reference/class/UIScale","UIStroke":"https://developer.roblox.com/en-us/api-reference/class/UIStroke","UnvalidatedAssetService":"https://developer.roblox.com/en-us/api-reference/class/UnvalidatedAssetService","UserGameSettings":"https://developer.roblox.com/en-us/api-reference/class/UserGameSettings","UserInputService":"https://developer.roblox.com/en-us/api-reference/class/UserInputService","UserNotification":"https://developer.roblox.com/en-us/api-reference/class/UserNotification","UserNotificationPayload":"https://developer.roblox.com/en-us/api-reference/class/UserNotificationPayload","UserNotificationPayloadAnalyticsData":"https://developer.roblox.com/en-us/api-reference/class/UserNotificationPayloadAnalyticsData","UserNotificationPayloadJoinExperience":"https://developer.roblox.com/en-us/api-reference/class/UserNotificationPayloadJoinExperience","UserNotificationPayloadParameterValue":"https://developer.roblox.com/en-us/api-reference/class/UserNotificationPayloadParameterValue","UserService":"https://developer.roblox.com/en-us/api-reference/class/UserService","VRService":"https://developer.roblox.com/en-us/api-reference/class/VRService","VRStatusService":"https://developer.roblox.com/en-us/api-reference/class/VRStatusService","ValueBase":"https://developer.roblox.com/en-us/api-reference/class/ValueBase","BinaryStringValue":"https://developer.roblox.com/en-us/api-reference/class/BinaryStringValue","BoolValue":"https://developer.roblox.com/en-us/api-reference/class/BoolValue","BrickColorValue":"https://developer.roblox.com/en-us/api-reference/class/BrickColorValue","CFrameValue":"https://developer.roblox.com/en-us/api-reference/class/CFrameValue","Color3Value":"https://developer.roblox.com/en-us/api-reference/class/Color3Value","DoubleConstrainedValue":"https://developer.roblox.com/en-us/api-reference/class/DoubleConstrainedValue","IntConstrainedValue":"https://developer.roblox.com/en-us/api-reference/class/IntConstrainedValue","IntValue":"https://developer.roblox.com/en-us/api-reference/class/IntValue","NumberValue":"https://developer.roblox.com/en-us/api-reference/class/NumberValue","ObjectValue":"https://developer.roblox.com/en-us/api-reference/class/ObjectValue","RayValue":"https://developer.roblox.com/en-us/api-reference/class/RayValue","StringValue":"https://developer.roblox.com/en-us/api-reference/class/StringValue","Vector3Value":"https://developer.roblox.com/en-us/api-reference/class/Vector3Value","Vector3Curve":"https://developer.roblox.com/en-us/api-reference/class/Vector3Curve","VersionControlService":"https://developer.roblox.com/en-us/api-reference/class/VersionControlService","VideoCaptureService":"https://developer.roblox.com/en-us/api-reference/class/VideoCaptureService","VideoService":"https://developer.roblox.com/en-us/api-reference/class/VideoService","VirtualInputManager":"https://developer.roblox.com/en-us/api-reference/class/VirtualInputManager","VirtualUser":"https://developer.roblox.com/en-us/api-reference/class/VirtualUser","VisibilityCheckDispatcher":"https://developer.roblox.com/en-us/api-reference/class/VisibilityCheckDispatcher","VisibilityService":"https://developer.roblox.com/en-us/api-reference/class/VisibilityService","Visit":"https://developer.roblox.com/en-us/api-reference/class/Visit","VoiceChatInternal":"https://developer.roblox.com/en-us/api-reference/class/VoiceChatInternal","VoiceChatService":"https://developer.roblox.com/en-us/api-reference/class/VoiceChatService","WeldConstraint":"https://developer.roblox.com/en-us/api-reference/class/WeldConstraint","Wire":"https://developer.roblox.com/en-us/api-reference/class/Wire","AccessModifierType":"https://developer.roblox.com/en-us/api-reference/enum/AccessModifierType","AccessoryType":"https://developer.roblox.com/en-us/api-reference/enum/AccessoryType","ActionType":"https://developer.roblox.com/en-us/api-reference/enum/ActionType","ActuatorRelativeTo":"https://developer.roblox.com/en-us/api-reference/enum/ActuatorRelativeTo","ActuatorType":"https://developer.roblox.com/en-us/api-reference/enum/ActuatorType","AdEventType":"https://developer.roblox.com/en-us/api-reference/enum/AdEventType","AdShape":"https://developer.roblox.com/en-us/api-reference/enum/AdShape","AdTeleportMethod":"https://developer.roblox.com/en-us/api-reference/enum/AdTeleportMethod","AdUnitStatus":"https://developer.roblox.com/en-us/api-reference/enum/AdUnitStatus","AdornCullingMode":"https://developer.roblox.com/en-us/api-reference/enum/AdornCullingMode","AlignType":"https://developer.roblox.com/en-us/api-reference/enum/AlignType","AlphaMode":"https://developer.roblox.com/en-us/api-reference/enum/AlphaMode","AnalyticsEconomyAction":"https://developer.roblox.com/en-us/api-reference/enum/AnalyticsEconomyAction","AnalyticsLogLevel":"https://developer.roblox.com/en-us/api-reference/enum/AnalyticsLogLevel","AnalyticsProgressionStatus":"https://developer.roblox.com/en-us/api-reference/enum/AnalyticsProgressionStatus","AnimationClipFromVideoStatus":"https://developer.roblox.com/en-us/api-reference/enum/AnimationClipFromVideoStatus","AnimationCompositorMode":"https://developer.roblox.com/en-us/api-reference/enum/AnimationCompositorMode","AnimationPriority":"https://developer.roblox.com/en-us/api-reference/enum/AnimationPriority","AnimatorRetargetingMode":"https://developer.roblox.com/en-us/api-reference/enum/AnimatorRetargetingMode","AppShellActionType":"https://developer.roblox.com/en-us/api-reference/enum/AppShellActionType","AppShellFeature":"https://developer.roblox.com/en-us/api-reference/enum/AppShellFeature","AppUpdateStatus":"https://developer.roblox.com/en-us/api-reference/enum/AppUpdateStatus","ApplyStrokeMode":"https://developer.roblox.com/en-us/api-reference/enum/ApplyStrokeMode","AspectType":"https://developer.roblox.com/en-us/api-reference/enum/AspectType","AssetCreatorType":"https://developer.roblox.com/en-us/api-reference/enum/AssetCreatorType","AssetFetchStatus":"https://developer.roblox.com/en-us/api-reference/enum/AssetFetchStatus","AssetType":"https://developer.roblox.com/en-us/api-reference/enum/AssetType","AssetTypeVerification":"https://developer.roblox.com/en-us/api-reference/enum/AssetTypeVerification","AudioApiRollout":"https://developer.roblox.com/en-us/api-reference/enum/AudioApiRollout","AudioSubType":"https://developer.roblox.com/en-us/api-reference/enum/AudioSubType","AudioWindowSize":"https://developer.roblox.com/en-us/api-reference/enum/AudioWindowSize","AutoIndentRule":"https://developer.roblox.com/en-us/api-reference/enum/AutoIndentRule","AutomaticSize":"https://developer.roblox.com/en-us/api-reference/enum/AutomaticSize","AvatarAssetType":"https://developer.roblox.com/en-us/api-reference/enum/AvatarAssetType","AvatarChatServiceFeature":"https://developer.roblox.com/en-us/api-reference/enum/AvatarChatServiceFeature","AvatarContextMenuOption":"https://developer.roblox.com/en-us/api-reference/enum/AvatarContextMenuOption","AvatarItemType":"https://developer.roblox.com/en-us/api-reference/enum/AvatarItemType","AvatarJointUpgrade":"https://developer.roblox.com/en-us/api-reference/enum/AvatarJointUpgrade","AvatarPromptResult":"https://developer.roblox.com/en-us/api-reference/enum/AvatarPromptResult","AvatarThumbnailCustomizationType":"https://developer.roblox.com/en-us/api-reference/enum/AvatarThumbnailCustomizationType","AvatarUnificationMode":"https://developer.roblox.com/en-us/api-reference/enum/AvatarUnificationMode","Axis":"https://developer.roblox.com/en-us/api-reference/enum/Axis","BinType":"https://developer.roblox.com/en-us/api-reference/enum/BinType","BodyPart":"https://developer.roblox.com/en-us/api-reference/enum/BodyPart","BodyPartR15":"https://developer.roblox.com/en-us/api-reference/enum/BodyPartR15","BorderMode":"https://developer.roblox.com/en-us/api-reference/enum/BorderMode","BreakReason":"https://developer.roblox.com/en-us/api-reference/enum/BreakReason","BreakpointRemoveReason":"https://developer.roblox.com/en-us/api-reference/enum/BreakpointRemoveReason","BulkMoveMode":"https://developer.roblox.com/en-us/api-reference/enum/BulkMoveMode","BundleType":"https://developer.roblox.com/en-us/api-reference/enum/BundleType","Button":"https://developer.roblox.com/en-us/api-reference/enum/Button","ButtonStyle":"https://developer.roblox.com/en-us/api-reference/enum/ButtonStyle","CageType":"https://developer.roblox.com/en-us/api-reference/enum/CageType","CameraMode":"https://developer.roblox.com/en-us/api-reference/enum/CameraMode","CameraPanMode":"https://developer.roblox.com/en-us/api-reference/enum/CameraPanMode","CameraSpeedAdjustBinding":"https://developer.roblox.com/en-us/api-reference/enum/CameraSpeedAdjustBinding","CameraType":"https://developer.roblox.com/en-us/api-reference/enum/CameraType","CatalogCategoryFilter":"https://developer.roblox.com/en-us/api-reference/enum/CatalogCategoryFilter","CatalogSortAggregation":"https://developer.roblox.com/en-us/api-reference/enum/CatalogSortAggregation","CatalogSortType":"https://developer.roblox.com/en-us/api-reference/enum/CatalogSortType","CellBlock":"https://developer.roblox.com/en-us/api-reference/enum/CellBlock","CellMaterial":"https://developer.roblox.com/en-us/api-reference/enum/CellMaterial","CellOrientation":"https://developer.roblox.com/en-us/api-reference/enum/CellOrientation","CenterDialogType":"https://developer.roblox.com/en-us/api-reference/enum/CenterDialogType","CharacterControlMode":"https://developer.roblox.com/en-us/api-reference/enum/CharacterControlMode","ChatCallbackType":"https://developer.roblox.com/en-us/api-reference/enum/ChatCallbackType","ChatColor":"https://developer.roblox.com/en-us/api-reference/enum/ChatColor","ChatMode":"https://developer.roblox.com/en-us/api-reference/enum/ChatMode","ChatPrivacyMode":"https://developer.roblox.com/en-us/api-reference/enum/ChatPrivacyMode","ChatStyle":"https://developer.roblox.com/en-us/api-reference/enum/ChatStyle","ChatVersion":"https://developer.roblox.com/en-us/api-reference/enum/ChatVersion","ClientAnimatorThrottlingMode":"https://developer.roblox.com/en-us/api-reference/enum/ClientAnimatorThrottlingMode","CollaboratorStatus":"https://developer.roblox.com/en-us/api-reference/enum/CollaboratorStatus","CollisionFidelity":"https://developer.roblox.com/en-us/api-reference/enum/CollisionFidelity","CommandPermission":"https://developer.roblox.com/en-us/api-reference/enum/CommandPermission","CompileTarget":"https://developer.roblox.com/en-us/api-reference/enum/CompileTarget","CompletionItemKind":"https://developer.roblox.com/en-us/api-reference/enum/CompletionItemKind","CompletionItemTag":"https://developer.roblox.com/en-us/api-reference/enum/CompletionItemTag","CompletionTriggerKind":"https://developer.roblox.com/en-us/api-reference/enum/CompletionTriggerKind","ComputerCameraMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/ComputerCameraMovementMode","ComputerMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/ComputerMovementMode","ConnectionError":"https://developer.roblox.com/en-us/api-reference/enum/ConnectionError","ConnectionState":"https://developer.roblox.com/en-us/api-reference/enum/ConnectionState","ContextActionPriority":"https://developer.roblox.com/en-us/api-reference/enum/ContextActionPriority","ContextActionResult":"https://developer.roblox.com/en-us/api-reference/enum/ContextActionResult","ControlMode":"https://developer.roblox.com/en-us/api-reference/enum/ControlMode","CoreGuiType":"https://developer.roblox.com/en-us/api-reference/enum/CoreGuiType","CreateOutfitFailure":"https://developer.roblox.com/en-us/api-reference/enum/CreateOutfitFailure","CreatorType":"https://developer.roblox.com/en-us/api-reference/enum/CreatorType","CreatorTypeFilter":"https://developer.roblox.com/en-us/api-reference/enum/CreatorTypeFilter","CurrencyType":"https://developer.roblox.com/en-us/api-reference/enum/CurrencyType","CustomCameraMode":"https://developer.roblox.com/en-us/api-reference/enum/CustomCameraMode","DataStoreRequestType":"https://developer.roblox.com/en-us/api-reference/enum/DataStoreRequestType","DeathStyle":"https://developer.roblox.com/en-us/api-reference/enum/DeathStyle","DebuggerEndReason":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerEndReason","DebuggerExceptionBreakMode":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerExceptionBreakMode","DebuggerFrameType":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerFrameType","DebuggerPauseReason":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerPauseReason","DebuggerStatus":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerStatus","DevCameraOcclusionMode":"https://developer.roblox.com/en-us/api-reference/enum/DevCameraOcclusionMode","DevComputerCameraMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DevComputerCameraMovementMode","DevComputerMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DevComputerMovementMode","DevTouchCameraMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DevTouchCameraMovementMode","DevTouchMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DevTouchMovementMode","DeveloperMemoryTag":"https://developer.roblox.com/en-us/api-reference/enum/DeveloperMemoryTag","DeviceType":"https://developer.roblox.com/en-us/api-reference/enum/DeviceType","DialogBehaviorType":"https://developer.roblox.com/en-us/api-reference/enum/DialogBehaviorType","DialogPurpose":"https://developer.roblox.com/en-us/api-reference/enum/DialogPurpose","DialogTone":"https://developer.roblox.com/en-us/api-reference/enum/DialogTone","DominantAxis":"https://developer.roblox.com/en-us/api-reference/enum/DominantAxis","DraftStatusCode":"https://developer.roblox.com/en-us/api-reference/enum/DraftStatusCode","DragDetectorDragStyle":"https://developer.roblox.com/en-us/api-reference/enum/DragDetectorDragStyle","DragDetectorResponseStyle":"https://developer.roblox.com/en-us/api-reference/enum/DragDetectorResponseStyle","DraggerCoordinateSpace":"https://developer.roblox.com/en-us/api-reference/enum/DraggerCoordinateSpace","DraggerMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DraggerMovementMode","EasingDirection":"https://developer.roblox.com/en-us/api-reference/enum/EasingDirection","EasingStyle":"https://developer.roblox.com/en-us/api-reference/enum/EasingStyle","EditorLiveScripting":"https://developer.roblox.com/en-us/api-reference/enum/EditorLiveScripting","ElasticBehavior":"https://developer.roblox.com/en-us/api-reference/enum/ElasticBehavior","EnviromentalPhysicsThrottle":"https://developer.roblox.com/en-us/api-reference/enum/EnviromentalPhysicsThrottle","ExperienceAuthScope":"https://developer.roblox.com/en-us/api-reference/enum/ExperienceAuthScope","ExplosionType":"https://developer.roblox.com/en-us/api-reference/enum/ExplosionType","FacialAnimationStreamingState":"https://developer.roblox.com/en-us/api-reference/enum/FacialAnimationStreamingState","FieldOfViewMode":"https://developer.roblox.com/en-us/api-reference/enum/FieldOfViewMode","FillDirection":"https://developer.roblox.com/en-us/api-reference/enum/FillDirection","FilterResult":"https://developer.roblox.com/en-us/api-reference/enum/FilterResult","FinishRecordingOperation":"https://developer.roblox.com/en-us/api-reference/enum/FinishRecordingOperation","FluidFidelity":"https://developer.roblox.com/en-us/api-reference/enum/FluidFidelity","FluidForces":"https://developer.roblox.com/en-us/api-reference/enum/FluidForces","Font":"https://developer.roblox.com/en-us/api-reference/enum/Font","FontSize":"https://developer.roblox.com/en-us/api-reference/enum/FontSize","FontStyle":"https://developer.roblox.com/en-us/api-reference/enum/FontStyle","FontWeight":"https://developer.roblox.com/en-us/api-reference/enum/FontWeight","ForceLimitMode":"https://developer.roblox.com/en-us/api-reference/enum/ForceLimitMode","FormFactor":"https://developer.roblox.com/en-us/api-reference/enum/FormFactor","FrameStyle":"https://developer.roblox.com/en-us/api-reference/enum/FrameStyle","FramerateManagerMode":"https://developer.roblox.com/en-us/api-reference/enum/FramerateManagerMode","FriendRequestEvent":"https://developer.roblox.com/en-us/api-reference/enum/FriendRequestEvent","FriendStatus":"https://developer.roblox.com/en-us/api-reference/enum/FriendStatus","FunctionalTestResult":"https://developer.roblox.com/en-us/api-reference/enum/FunctionalTestResult","GameAvatarType":"https://developer.roblox.com/en-us/api-reference/enum/GameAvatarType","GearGenreSetting":"https://developer.roblox.com/en-us/api-reference/enum/GearGenreSetting","GearType":"https://developer.roblox.com/en-us/api-reference/enum/GearType","Genre":"https://developer.roblox.com/en-us/api-reference/enum/Genre","GraphicsMode":"https://developer.roblox.com/en-us/api-reference/enum/GraphicsMode","GuiState":"https://developer.roblox.com/en-us/api-reference/enum/GuiState","GuiType":"https://developer.roblox.com/en-us/api-reference/enum/GuiType","HandlesStyle":"https://developer.roblox.com/en-us/api-reference/enum/HandlesStyle","HighlightDepthMode":"https://developer.roblox.com/en-us/api-reference/enum/HighlightDepthMode","HorizontalAlignment":"https://developer.roblox.com/en-us/api-reference/enum/HorizontalAlignment","HoverAnimateSpeed":"https://developer.roblox.com/en-us/api-reference/enum/HoverAnimateSpeed","HttpCachePolicy":"https://developer.roblox.com/en-us/api-reference/enum/HttpCachePolicy","HttpCompression":"https://developer.roblox.com/en-us/api-reference/enum/HttpCompression","HttpContentType":"https://developer.roblox.com/en-us/api-reference/enum/HttpContentType","HttpError":"https://developer.roblox.com/en-us/api-reference/enum/HttpError","HttpRequestType":"https://developer.roblox.com/en-us/api-reference/enum/HttpRequestType","HumanoidCollisionType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidCollisionType","HumanoidDisplayDistanceType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidDisplayDistanceType","HumanoidHealthDisplayType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidHealthDisplayType","HumanoidRigType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidRigType","HumanoidStateMachineMode":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidStateMachineMode","HumanoidStateType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidStateType","IKCollisionsMode":"https://developer.roblox.com/en-us/api-reference/enum/IKCollisionsMode","IKControlConstraintSupport":"https://developer.roblox.com/en-us/api-reference/enum/IKControlConstraintSupport","IKControlType":"https://developer.roblox.com/en-us/api-reference/enum/IKControlType","IXPLoadingStatus":"https://developer.roblox.com/en-us/api-reference/enum/IXPLoadingStatus","ImageCombineType":"https://developer.roblox.com/en-us/api-reference/enum/ImageCombineType","InOut":"https://developer.roblox.com/en-us/api-reference/enum/InOut","InfoType":"https://developer.roblox.com/en-us/api-reference/enum/InfoType","InitialDockState":"https://developer.roblox.com/en-us/api-reference/enum/InitialDockState","InputType":"https://developer.roblox.com/en-us/api-reference/enum/InputType","InterpolationThrottlingMode":"https://developer.roblox.com/en-us/api-reference/enum/InterpolationThrottlingMode","InviteState":"https://developer.roblox.com/en-us/api-reference/enum/InviteState","ItemLineAlignment":"https://developer.roblox.com/en-us/api-reference/enum/ItemLineAlignment","JointCreationMode":"https://developer.roblox.com/en-us/api-reference/enum/JointCreationMode","KeyCode":"https://developer.roblox.com/en-us/api-reference/enum/KeyCode","KeyInterpolationMode":"https://developer.roblox.com/en-us/api-reference/enum/KeyInterpolationMode","KeywordFilterType":"https://developer.roblox.com/en-us/api-reference/enum/KeywordFilterType","Language":"https://developer.roblox.com/en-us/api-reference/enum/Language","LeftRight":"https://developer.roblox.com/en-us/api-reference/enum/LeftRight","Limb":"https://developer.roblox.com/en-us/api-reference/enum/Limb","LineJoinMode":"https://developer.roblox.com/en-us/api-reference/enum/LineJoinMode","ListDisplayMode":"https://developer.roblox.com/en-us/api-reference/enum/ListDisplayMode","ListenerType":"https://developer.roblox.com/en-us/api-reference/enum/ListenerType","LiveEditingAtomicUpdateResponse":"https://developer.roblox.com/en-us/api-reference/enum/LiveEditingAtomicUpdateResponse","LiveEditingBroadcastMessageType":"https://developer.roblox.com/en-us/api-reference/enum/LiveEditingBroadcastMessageType","LoadCharacterLayeredClothing":"https://developer.roblox.com/en-us/api-reference/enum/LoadCharacterLayeredClothing","LoadDynamicHeads":"https://developer.roblox.com/en-us/api-reference/enum/LoadDynamicHeads","MarkupKind":"https://developer.roblox.com/en-us/api-reference/enum/MarkupKind","Material":"https://developer.roblox.com/en-us/api-reference/enum/Material","MaterialPattern":"https://developer.roblox.com/en-us/api-reference/enum/MaterialPattern","MembershipType":"https://developer.roblox.com/en-us/api-reference/enum/MembershipType","MeshPartDetailLevel":"https://developer.roblox.com/en-us/api-reference/enum/MeshPartDetailLevel","MeshPartHeadsAndAccessories":"https://developer.roblox.com/en-us/api-reference/enum/MeshPartHeadsAndAccessories","MeshScaleUnit":"https://developer.roblox.com/en-us/api-reference/enum/MeshScaleUnit","MeshType":"https://developer.roblox.com/en-us/api-reference/enum/MeshType","MessageType":"https://developer.roblox.com/en-us/api-reference/enum/MessageType","ModelLevelOfDetail":"https://developer.roblox.com/en-us/api-reference/enum/ModelLevelOfDetail","ModelStreamingBehavior":"https://developer.roblox.com/en-us/api-reference/enum/ModelStreamingBehavior","ModelStreamingMode":"https://developer.roblox.com/en-us/api-reference/enum/ModelStreamingMode","ModifierKey":"https://developer.roblox.com/en-us/api-reference/enum/ModifierKey","MouseBehavior":"https://developer.roblox.com/en-us/api-reference/enum/MouseBehavior","MoveState":"https://developer.roblox.com/en-us/api-reference/enum/MoveState","MuteState":"https://developer.roblox.com/en-us/api-reference/enum/MuteState","NameOcclusion":"https://developer.roblox.com/en-us/api-reference/enum/NameOcclusion","NetworkOwnership":"https://developer.roblox.com/en-us/api-reference/enum/NetworkOwnership","NormalId":"https://developer.roblox.com/en-us/api-reference/enum/NormalId","OperationType":"https://developer.roblox.com/en-us/api-reference/enum/OperationType","OrientationAlignmentMode":"https://developer.roblox.com/en-us/api-reference/enum/OrientationAlignmentMode","OutfitSource":"https://developer.roblox.com/en-us/api-reference/enum/OutfitSource","OutfitType":"https://developer.roblox.com/en-us/api-reference/enum/OutfitType","OutputLayoutMode":"https://developer.roblox.com/en-us/api-reference/enum/OutputLayoutMode","OverrideMouseIconBehavior":"https://developer.roblox.com/en-us/api-reference/enum/OverrideMouseIconBehavior","PackagePermission":"https://developer.roblox.com/en-us/api-reference/enum/PackagePermission","PartType":"https://developer.roblox.com/en-us/api-reference/enum/PartType","ParticleEmitterShape":"https://developer.roblox.com/en-us/api-reference/enum/ParticleEmitterShape","ParticleEmitterShapeInOut":"https://developer.roblox.com/en-us/api-reference/enum/ParticleEmitterShapeInOut","ParticleEmitterShapeStyle":"https://developer.roblox.com/en-us/api-reference/enum/ParticleEmitterShapeStyle","ParticleFlipbookLayout":"https://developer.roblox.com/en-us/api-reference/enum/ParticleFlipbookLayout","ParticleFlipbookMode":"https://developer.roblox.com/en-us/api-reference/enum/ParticleFlipbookMode","ParticleFlipbookTextureCompatible":"https://developer.roblox.com/en-us/api-reference/enum/ParticleFlipbookTextureCompatible","ParticleOrientation":"https://developer.roblox.com/en-us/api-reference/enum/ParticleOrientation","PathStatus":"https://developer.roblox.com/en-us/api-reference/enum/PathStatus","PathWaypointAction":"https://developer.roblox.com/en-us/api-reference/enum/PathWaypointAction","PermissionLevelShown":"https://developer.roblox.com/en-us/api-reference/enum/PermissionLevelShown","PhysicsSimulationRate":"https://developer.roblox.com/en-us/api-reference/enum/PhysicsSimulationRate","PhysicsSteppingMethod":"https://developer.roblox.com/en-us/api-reference/enum/PhysicsSteppingMethod","PlaybackState":"https://developer.roblox.com/en-us/api-reference/enum/PlaybackState","PlayerActions":"https://developer.roblox.com/en-us/api-reference/enum/PlayerActions","PlayerCharacterDestroyBehavior":"https://developer.roblox.com/en-us/api-reference/enum/PlayerCharacterDestroyBehavior","PlayerChatType":"https://developer.roblox.com/en-us/api-reference/enum/PlayerChatType","PoseEasingDirection":"https://developer.roblox.com/en-us/api-reference/enum/PoseEasingDirection","PoseEasingStyle":"https://developer.roblox.com/en-us/api-reference/enum/PoseEasingStyle","PositionAlignmentMode":"https://developer.roblox.com/en-us/api-reference/enum/PositionAlignmentMode","PrimalPhysicsSolver":"https://developer.roblox.com/en-us/api-reference/enum/PrimalPhysicsSolver","PrimitiveType":"https://developer.roblox.com/en-us/api-reference/enum/PrimitiveType","PrivilegeType":"https://developer.roblox.com/en-us/api-reference/enum/PrivilegeType","ProductLocationRestriction":"https://developer.roblox.com/en-us/api-reference/enum/ProductLocationRestriction","ProductPurchaseDecision":"https://developer.roblox.com/en-us/api-reference/enum/ProductPurchaseDecision","PromptCreateAssetResult":"https://developer.roblox.com/en-us/api-reference/enum/PromptCreateAssetResult","PromptCreateAvatarResult":"https://developer.roblox.com/en-us/api-reference/enum/PromptCreateAvatarResult","PromptPublishAssetResult":"https://developer.roblox.com/en-us/api-reference/enum/PromptPublishAssetResult","PropertyStatus":"https://developer.roblox.com/en-us/api-reference/enum/PropertyStatus","ProximityPromptExclusivity":"https://developer.roblox.com/en-us/api-reference/enum/ProximityPromptExclusivity","ProximityPromptInputType":"https://developer.roblox.com/en-us/api-reference/enum/ProximityPromptInputType","ProximityPromptStyle":"https://developer.roblox.com/en-us/api-reference/enum/ProximityPromptStyle","QualityLevel":"https://developer.roblox.com/en-us/api-reference/enum/QualityLevel","R15CollisionType":"https://developer.roblox.com/en-us/api-reference/enum/R15CollisionType","RaycastFilterType":"https://developer.roblox.com/en-us/api-reference/enum/RaycastFilterType","RejectCharacterDeletions":"https://developer.roblox.com/en-us/api-reference/enum/RejectCharacterDeletions","RenderFidelity":"https://developer.roblox.com/en-us/api-reference/enum/RenderFidelity","RenderPriority":"https://developer.roblox.com/en-us/api-reference/enum/RenderPriority","RenderingTestComparisonMethod":"https://developer.roblox.com/en-us/api-reference/enum/RenderingTestComparisonMethod","ReplicateInstanceDestroySetting":"https://developer.roblox.com/en-us/api-reference/enum/ReplicateInstanceDestroySetting","ResamplerMode":"https://developer.roblox.com/en-us/api-reference/enum/ResamplerMode","ReservedHighlightId":"https://developer.roblox.com/en-us/api-reference/enum/ReservedHighlightId","RestPose":"https://developer.roblox.com/en-us/api-reference/enum/RestPose","ReturnKeyType":"https://developer.roblox.com/en-us/api-reference/enum/ReturnKeyType","ReverbType":"https://developer.roblox.com/en-us/api-reference/enum/ReverbType","RibbonTool":"https://developer.roblox.com/en-us/api-reference/enum/RibbonTool","RigScale":"https://developer.roblox.com/en-us/api-reference/enum/RigScale","RigType":"https://developer.roblox.com/en-us/api-reference/enum/RigType","RollOffMode":"https://developer.roblox.com/en-us/api-reference/enum/RollOffMode","RotationOrder":"https://developer.roblox.com/en-us/api-reference/enum/RotationOrder","RotationType":"https://developer.roblox.com/en-us/api-reference/enum/RotationType","RtlTextSupport":"https://developer.roblox.com/en-us/api-reference/enum/RtlTextSupport","RunContext":"https://developer.roblox.com/en-us/api-reference/enum/RunContext","RuntimeUndoBehavior":"https://developer.roblox.com/en-us/api-reference/enum/RuntimeUndoBehavior","SafeAreaCompatibility":"https://developer.roblox.com/en-us/api-reference/enum/SafeAreaCompatibility","SalesTypeFilter":"https://developer.roblox.com/en-us/api-reference/enum/SalesTypeFilter","SaveAvatarThumbnailCustomizationFailure":"https://developer.roblox.com/en-us/api-reference/enum/SaveAvatarThumbnailCustomizationFailure","SaveFilter":"https://developer.roblox.com/en-us/api-reference/enum/SaveFilter","SavedQualitySetting":"https://developer.roblox.com/en-us/api-reference/enum/SavedQualitySetting","ScaleType":"https://developer.roblox.com/en-us/api-reference/enum/ScaleType","ScopeCheckResult":"https://developer.roblox.com/en-us/api-reference/enum/ScopeCheckResult","ScreenInsets":"https://developer.roblox.com/en-us/api-reference/enum/ScreenInsets","ScreenOrientation":"https://developer.roblox.com/en-us/api-reference/enum/ScreenOrientation","ScrollBarInset":"https://developer.roblox.com/en-us/api-reference/enum/ScrollBarInset","ScrollingDirection":"https://developer.roblox.com/en-us/api-reference/enum/ScrollingDirection","SelectionBehavior":"https://developer.roblox.com/en-us/api-reference/enum/SelectionBehavior","SelectionRenderMode":"https://developer.roblox.com/en-us/api-reference/enum/SelectionRenderMode","SelfViewPosition":"https://developer.roblox.com/en-us/api-reference/enum/SelfViewPosition","SensorMode":"https://developer.roblox.com/en-us/api-reference/enum/SensorMode","SensorUpdateType":"https://developer.roblox.com/en-us/api-reference/enum/SensorUpdateType","ServerAudioBehavior":"https://developer.roblox.com/en-us/api-reference/enum/ServerAudioBehavior","ServerLiveEditingMode":"https://developer.roblox.com/en-us/api-reference/enum/ServerLiveEditingMode","ServiceVisibility":"https://developer.roblox.com/en-us/api-reference/enum/ServiceVisibility","Severity":"https://developer.roblox.com/en-us/api-reference/enum/Severity","SignalBehavior":"https://developer.roblox.com/en-us/api-reference/enum/SignalBehavior","SizeConstraint":"https://developer.roblox.com/en-us/api-reference/enum/SizeConstraint","SolverConvergenceMetricType":"https://developer.roblox.com/en-us/api-reference/enum/SolverConvergenceMetricType","SolverConvergenceVisualizationMode":"https://developer.roblox.com/en-us/api-reference/enum/SolverConvergenceVisualizationMode","SortDirection":"https://developer.roblox.com/en-us/api-reference/enum/SortDirection","SortOrder":"https://developer.roblox.com/en-us/api-reference/enum/SortOrder","SpecialKey":"https://developer.roblox.com/en-us/api-reference/enum/SpecialKey","StartCorner":"https://developer.roblox.com/en-us/api-reference/enum/StartCorner","StreamOutBehavior":"https://developer.roblox.com/en-us/api-reference/enum/StreamOutBehavior","StreamingIntegrityMode":"https://developer.roblox.com/en-us/api-reference/enum/StreamingIntegrityMode","StreamingPauseMode":"https://developer.roblox.com/en-us/api-reference/enum/StreamingPauseMode","StudioCloseMode":"https://developer.roblox.com/en-us/api-reference/enum/StudioCloseMode","StudioDataModelType":"https://developer.roblox.com/en-us/api-reference/enum/StudioDataModelType","StudioPlaceUpdateFailureReason":"https://developer.roblox.com/en-us/api-reference/enum/StudioPlaceUpdateFailureReason","StudioScriptEditorColorCategories":"https://developer.roblox.com/en-us/api-reference/enum/StudioScriptEditorColorCategories","StudioScriptEditorColorPresets":"https://developer.roblox.com/en-us/api-reference/enum/StudioScriptEditorColorPresets","StudioStyleGuideColor":"https://developer.roblox.com/en-us/api-reference/enum/StudioStyleGuideColor","StudioStyleGuideModifier":"https://developer.roblox.com/en-us/api-reference/enum/StudioStyleGuideModifier","Style":"https://developer.roblox.com/en-us/api-reference/enum/Style","SubscriptionPaymentStatus":"https://developer.roblox.com/en-us/api-reference/enum/SubscriptionPaymentStatus","SubscriptionPeriod":"https://developer.roblox.com/en-us/api-reference/enum/SubscriptionPeriod","SurfaceConstraint":"https://developer.roblox.com/en-us/api-reference/enum/SurfaceConstraint","SurfaceGuiShape":"https://developer.roblox.com/en-us/api-reference/enum/SurfaceGuiShape","SurfaceGuiSizingMode":"https://developer.roblox.com/en-us/api-reference/enum/SurfaceGuiSizingMode","SurfaceType":"https://developer.roblox.com/en-us/api-reference/enum/SurfaceType","SwipeDirection":"https://developer.roblox.com/en-us/api-reference/enum/SwipeDirection","TableMajorAxis":"https://developer.roblox.com/en-us/api-reference/enum/TableMajorAxis","Technology":"https://developer.roblox.com/en-us/api-reference/enum/Technology","TeleportMethod":"https://developer.roblox.com/en-us/api-reference/enum/TeleportMethod","TeleportResult":"https://developer.roblox.com/en-us/api-reference/enum/TeleportResult","TeleportState":"https://developer.roblox.com/en-us/api-reference/enum/TeleportState","TeleportType":"https://developer.roblox.com/en-us/api-reference/enum/TeleportType","TerrainAcquisitionMethod":"https://developer.roblox.com/en-us/api-reference/enum/TerrainAcquisitionMethod","TerrainFace":"https://developer.roblox.com/en-us/api-reference/enum/TerrainFace","TextChatMessageStatus":"https://developer.roblox.com/en-us/api-reference/enum/TextChatMessageStatus","TextDirection":"https://developer.roblox.com/en-us/api-reference/enum/TextDirection","TextFilterContext":"https://developer.roblox.com/en-us/api-reference/enum/TextFilterContext","TextInputType":"https://developer.roblox.com/en-us/api-reference/enum/TextInputType","TextTruncate":"https://developer.roblox.com/en-us/api-reference/enum/TextTruncate","TextXAlignment":"https://developer.roblox.com/en-us/api-reference/enum/TextXAlignment","TextYAlignment":"https://developer.roblox.com/en-us/api-reference/enum/TextYAlignment","TextureGenerationMeshHandlerUnwrapMode":"https://developer.roblox.com/en-us/api-reference/enum/TextureGenerationMeshHandlerUnwrapMode","TextureMode":"https://developer.roblox.com/en-us/api-reference/enum/TextureMode","TextureQueryType":"https://developer.roblox.com/en-us/api-reference/enum/TextureQueryType","ThreadPoolConfig":"https://developer.roblox.com/en-us/api-reference/enum/ThreadPoolConfig","ThrottlingPriority":"https://developer.roblox.com/en-us/api-reference/enum/ThrottlingPriority","ThumbnailSize":"https://developer.roblox.com/en-us/api-reference/enum/ThumbnailSize","ThumbnailType":"https://developer.roblox.com/en-us/api-reference/enum/ThumbnailType","TickCountSampleMethod":"https://developer.roblox.com/en-us/api-reference/enum/TickCountSampleMethod","TopBottom":"https://developer.roblox.com/en-us/api-reference/enum/TopBottom","TouchCameraMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/TouchCameraMovementMode","TouchMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/TouchMovementMode","TrackerError":"https://developer.roblox.com/en-us/api-reference/enum/TrackerError","TrackerExtrapolationFlagMode":"https://developer.roblox.com/en-us/api-reference/enum/TrackerExtrapolationFlagMode","TrackerFaceTrackingStatus":"https://developer.roblox.com/en-us/api-reference/enum/TrackerFaceTrackingStatus","TrackerLodFlagMode":"https://developer.roblox.com/en-us/api-reference/enum/TrackerLodFlagMode","TrackerLodValueMode":"https://developer.roblox.com/en-us/api-reference/enum/TrackerLodValueMode","TrackerMode":"https://developer.roblox.com/en-us/api-reference/enum/TrackerMode","TrackerPromptEvent":"https://developer.roblox.com/en-us/api-reference/enum/TrackerPromptEvent","TriStateBoolean":"https://developer.roblox.com/en-us/api-reference/enum/TriStateBoolean","TweenStatus":"https://developer.roblox.com/en-us/api-reference/enum/TweenStatus","UIFlexAlignment":"https://developer.roblox.com/en-us/api-reference/enum/UIFlexAlignment","UIFlexMode":"https://developer.roblox.com/en-us/api-reference/enum/UIFlexMode","UITheme":"https://developer.roblox.com/en-us/api-reference/enum/UITheme","UiMessageType":"https://developer.roblox.com/en-us/api-reference/enum/UiMessageType","UsageContext":"https://developer.roblox.com/en-us/api-reference/enum/UsageContext","UserCFrame":"https://developer.roblox.com/en-us/api-reference/enum/UserCFrame","UserInputState":"https://developer.roblox.com/en-us/api-reference/enum/UserInputState","UserInputType":"https://developer.roblox.com/en-us/api-reference/enum/UserInputType","VRComfortSetting":"https://developer.roblox.com/en-us/api-reference/enum/VRComfortSetting","VRSafetyBubbleMode":"https://developer.roblox.com/en-us/api-reference/enum/VRSafetyBubbleMode","VRScaling":"https://developer.roblox.com/en-us/api-reference/enum/VRScaling","VRSessionState":"https://developer.roblox.com/en-us/api-reference/enum/VRSessionState","VRTouchpad":"https://developer.roblox.com/en-us/api-reference/enum/VRTouchpad","VRTouchpadMode":"https://developer.roblox.com/en-us/api-reference/enum/VRTouchpadMode","VelocityConstraintMode":"https://developer.roblox.com/en-us/api-reference/enum/VelocityConstraintMode","VerticalAlignment":"https://developer.roblox.com/en-us/api-reference/enum/VerticalAlignment","VerticalScrollBarPosition":"https://developer.roblox.com/en-us/api-reference/enum/VerticalScrollBarPosition","VibrationMotor":"https://developer.roblox.com/en-us/api-reference/enum/VibrationMotor","ViewMode":"https://developer.roblox.com/en-us/api-reference/enum/ViewMode","VirtualCursorMode":"https://developer.roblox.com/en-us/api-reference/enum/VirtualCursorMode","VirtualInputMode":"https://developer.roblox.com/en-us/api-reference/enum/VirtualInputMode","VoiceChatState":"https://developer.roblox.com/en-us/api-reference/enum/VoiceChatState","VoiceControlPath":"https://developer.roblox.com/en-us/api-reference/enum/VoiceControlPath","VolumetricAudio":"https://developer.roblox.com/en-us/api-reference/enum/VolumetricAudio","WaterDirection":"https://developer.roblox.com/en-us/api-reference/enum/WaterDirection","WaterForce":"https://developer.roblox.com/en-us/api-reference/enum/WaterForce","WeldConstraintPreserve":"https://developer.roblox.com/en-us/api-reference/enum/WeldConstraintPreserve","WrapLayerAutoSkin":"https://developer.roblox.com/en-us/api-reference/enum/WrapLayerAutoSkin","WrapLayerDebugMode":"https://developer.roblox.com/en-us/api-reference/enum/WrapLayerDebugMode","WrapTargetDebugMode":"https://developer.roblox.com/en-us/api-reference/enum/WrapTargetDebugMode","ZIndexBehavior":"https://developer.roblox.com/en-us/api-reference/enum/ZIndexBehavior","Axes":"https://developer.roblox.com/en-us/api-reference/datatype/Axes","BrickColor":"https://developer.roblox.com/en-us/api-reference/datatype/BrickColor","CFrame":"https://developer.roblox.com/en-us/api-reference/datatype/CFrame","Color3":"https://developer.roblox.com/en-us/api-reference/datatype/Color3","ColorSequence":"https://developer.roblox.com/en-us/api-reference/datatype/ColorSequence","ColorSequenceKeypoint":"https://developer.roblox.com/en-us/api-reference/datatype/ColorSequenceKeypoint","DockWidgetPluginGuiInfo":"https://developer.roblox.com/en-us/api-reference/datatype/DockWidgetPluginGuiInfo","Enum":"https://developer.roblox.com/en-us/api-reference/datatype/Enum","EnumItem":"https://developer.roblox.com/en-us/api-reference/datatype/EnumItem","Enums":"https://developer.roblox.com/en-us/api-reference/datatype/Enums","Faces":"https://developer.roblox.com/en-us/api-reference/datatype/Faces","NumberRange":"https://developer.roblox.com/en-us/api-reference/datatype/NumberRange","NumberSequence":"https://developer.roblox.com/en-us/api-reference/datatype/NumberSequence","NumberSequenceKeypoint":"https://developer.roblox.com/en-us/api-reference/datatype/NumberSequenceKeypoint","PathWaypoint":"https://developer.roblox.com/en-us/api-reference/datatype/PathWaypoint","PhysicalProperties":"https://developer.roblox.com/en-us/api-reference/datatype/PhysicalProperties","Random":"https://developer.roblox.com/en-us/api-reference/datatype/Random","Ray":"https://developer.roblox.com/en-us/api-reference/datatype/Ray","RBXScriptConnection":"https://developer.roblox.com/en-us/api-reference/datatype/RBXScriptConnection","RBXScriptSignal":"https://developer.roblox.com/en-us/api-reference/datatype/RBXScriptSignal","Rect":"https://developer.roblox.com/en-us/api-reference/datatype/Rect","Region3":"https://developer.roblox.com/en-us/api-reference/datatype/Region3","Region3int16":"https://developer.roblox.com/en-us/api-reference/datatype/Region3int16","TweenInfo":"https://developer.roblox.com/en-us/api-reference/datatype/TweenInfo","UDim":"https://developer.roblox.com/en-us/api-reference/datatype/UDim","UDim2":"https://developer.roblox.com/en-us/api-reference/datatype/UDim2","Vector2":"https://developer.roblox.com/en-us/api-reference/datatype/Vector2","Vector2int16":"https://developer.roblox.com/en-us/api-reference/datatype/Vector2int16","Vector3":"https://developer.roblox.com/en-us/api-reference/datatype/Vector3","Vector3int16":"https://developer.roblox.com/en-us/api-reference/datatype/Vector3int16","KnitClient":"/Knit/api/KnitClient","KnitServer":"/Knit/api/KnitServer","Middleware":"/Knit/api/KnitServer#Middleware","ClientMiddlewareFn":"/Knit/api/KnitClient#ClientMiddlewareFn","ClientMiddleware":"/Knit/api/KnitClient#ClientMiddleware","PerServiceMiddleware":"/Knit/api/KnitClient#PerServiceMiddleware","ControllerDef":"/Knit/api/KnitClient#ControllerDef","Service":"/Knit/api/KnitServer#Service","KnitOptions":"/Knit/api/KnitServer#KnitOptions","ServerMiddlewareFn":"/Knit/api/KnitServer#ServerMiddlewareFn","ServerMiddleware":"/Knit/api/KnitServer#ServerMiddleware","ServiceDef":"/Knit/api/KnitServer#ServiceDef","ServiceClient":"/Knit/api/KnitServer#ServiceClient"}')}}]); \ No newline at end of file diff --git a/assets/js/d692d782.524015f4.js b/assets/js/d692d782.524015f4.js new file mode 100644 index 00000000..a7535638 --- /dev/null +++ b/assets/js/d692d782.524015f4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[801],{85492:e=>{e.exports=JSON.parse('{"Instance":"https://developer.roblox.com/en-us/api-reference/datatype/Instance","AccessoryDescription":"https://developer.roblox.com/en-us/api-reference/class/AccessoryDescription","AccountService":"https://developer.roblox.com/en-us/api-reference/class/AccountService","Accoutrement":"https://developer.roblox.com/en-us/api-reference/class/Accoutrement","Accessory":"https://developer.roblox.com/en-us/api-reference/class/Accessory","Hat":"https://developer.roblox.com/en-us/api-reference/class/Hat","AdPortal":"https://developer.roblox.com/en-us/api-reference/class/AdPortal","AdService":"https://developer.roblox.com/en-us/api-reference/class/AdService","AdvancedDragger":"https://developer.roblox.com/en-us/api-reference/class/AdvancedDragger","AnalyticsService":"https://developer.roblox.com/en-us/api-reference/class/AnalyticsService","Animation":"https://developer.roblox.com/en-us/api-reference/class/Animation","AnimationClip":"https://developer.roblox.com/en-us/api-reference/class/AnimationClip","CurveAnimation":"https://developer.roblox.com/en-us/api-reference/class/CurveAnimation","KeyframeSequence":"https://developer.roblox.com/en-us/api-reference/class/KeyframeSequence","AnimationClipProvider":"https://developer.roblox.com/en-us/api-reference/class/AnimationClipProvider","AnimationController":"https://developer.roblox.com/en-us/api-reference/class/AnimationController","AnimationFromVideoCreatorService":"https://developer.roblox.com/en-us/api-reference/class/AnimationFromVideoCreatorService","AnimationFromVideoCreatorStudioService":"https://developer.roblox.com/en-us/api-reference/class/AnimationFromVideoCreatorStudioService","AnimationRigData":"https://developer.roblox.com/en-us/api-reference/class/AnimationRigData","AnimationStreamTrack":"https://developer.roblox.com/en-us/api-reference/class/AnimationStreamTrack","AnimationTrack":"https://developer.roblox.com/en-us/api-reference/class/AnimationTrack","Animator":"https://developer.roblox.com/en-us/api-reference/class/Animator","AppUpdateService":"https://developer.roblox.com/en-us/api-reference/class/AppUpdateService","AssetCounterService":"https://developer.roblox.com/en-us/api-reference/class/AssetCounterService","AssetDeliveryProxy":"https://developer.roblox.com/en-us/api-reference/class/AssetDeliveryProxy","AssetImportService":"https://developer.roblox.com/en-us/api-reference/class/AssetImportService","AssetImportSession":"https://developer.roblox.com/en-us/api-reference/class/AssetImportSession","AssetManagerService":"https://developer.roblox.com/en-us/api-reference/class/AssetManagerService","AssetPatchSettings":"https://developer.roblox.com/en-us/api-reference/class/AssetPatchSettings","AssetService":"https://developer.roblox.com/en-us/api-reference/class/AssetService","Atmosphere":"https://developer.roblox.com/en-us/api-reference/class/Atmosphere","Attachment":"https://developer.roblox.com/en-us/api-reference/class/Attachment","Bone":"https://developer.roblox.com/en-us/api-reference/class/Bone","AudioAnalyzer":"https://developer.roblox.com/en-us/api-reference/class/AudioAnalyzer","AudioChorus":"https://developer.roblox.com/en-us/api-reference/class/AudioChorus","AudioCompressor":"https://developer.roblox.com/en-us/api-reference/class/AudioCompressor","AudioDeviceInput":"https://developer.roblox.com/en-us/api-reference/class/AudioDeviceInput","AudioDeviceOutput":"https://developer.roblox.com/en-us/api-reference/class/AudioDeviceOutput","AudioDistortion":"https://developer.roblox.com/en-us/api-reference/class/AudioDistortion","AudioEcho":"https://developer.roblox.com/en-us/api-reference/class/AudioEcho","AudioEmitter":"https://developer.roblox.com/en-us/api-reference/class/AudioEmitter","AudioEqualizer":"https://developer.roblox.com/en-us/api-reference/class/AudioEqualizer","AudioFader":"https://developer.roblox.com/en-us/api-reference/class/AudioFader","AudioFlanger":"https://developer.roblox.com/en-us/api-reference/class/AudioFlanger","AudioListener":"https://developer.roblox.com/en-us/api-reference/class/AudioListener","AudioPitchShifter":"https://developer.roblox.com/en-us/api-reference/class/AudioPitchShifter","AudioPlayer":"https://developer.roblox.com/en-us/api-reference/class/AudioPlayer","AudioReverb":"https://developer.roblox.com/en-us/api-reference/class/AudioReverb","AudioSearchParams":"https://developer.roblox.com/en-us/api-reference/class/AudioSearchParams","AvatarChatService":"https://developer.roblox.com/en-us/api-reference/class/AvatarChatService","AvatarCreationService":"https://developer.roblox.com/en-us/api-reference/class/AvatarCreationService","AvatarEditorService":"https://developer.roblox.com/en-us/api-reference/class/AvatarEditorService","AvatarImportService":"https://developer.roblox.com/en-us/api-reference/class/AvatarImportService","Backpack":"https://developer.roblox.com/en-us/api-reference/class/Backpack","BadgeService":"https://developer.roblox.com/en-us/api-reference/class/BadgeService","BaseImportData":"https://developer.roblox.com/en-us/api-reference/class/BaseImportData","AnimationImportData":"https://developer.roblox.com/en-us/api-reference/class/AnimationImportData","FacsImportData":"https://developer.roblox.com/en-us/api-reference/class/FacsImportData","GroupImportData":"https://developer.roblox.com/en-us/api-reference/class/GroupImportData","JointImportData":"https://developer.roblox.com/en-us/api-reference/class/JointImportData","MaterialImportData":"https://developer.roblox.com/en-us/api-reference/class/MaterialImportData","MeshImportData":"https://developer.roblox.com/en-us/api-reference/class/MeshImportData","RootImportData":"https://developer.roblox.com/en-us/api-reference/class/RootImportData","BasePlayerGui":"https://developer.roblox.com/en-us/api-reference/class/BasePlayerGui","CoreGui":"https://developer.roblox.com/en-us/api-reference/class/CoreGui","PlayerGui":"https://developer.roblox.com/en-us/api-reference/class/PlayerGui","StarterGui":"https://developer.roblox.com/en-us/api-reference/class/StarterGui","BaseRemoteEvent":"https://developer.roblox.com/en-us/api-reference/class/BaseRemoteEvent","RemoteEvent":"https://developer.roblox.com/en-us/api-reference/class/RemoteEvent","UnreliableRemoteEvent":"https://developer.roblox.com/en-us/api-reference/class/UnreliableRemoteEvent","BaseWrap":"https://developer.roblox.com/en-us/api-reference/class/BaseWrap","WrapLayer":"https://developer.roblox.com/en-us/api-reference/class/WrapLayer","WrapTarget":"https://developer.roblox.com/en-us/api-reference/class/WrapTarget","Beam":"https://developer.roblox.com/en-us/api-reference/class/Beam","BindableEvent":"https://developer.roblox.com/en-us/api-reference/class/BindableEvent","BindableFunction":"https://developer.roblox.com/en-us/api-reference/class/BindableFunction","BodyMover":"https://developer.roblox.com/en-us/api-reference/class/BodyMover","BodyAngularVelocity":"https://developer.roblox.com/en-us/api-reference/class/BodyAngularVelocity","BodyForce":"https://developer.roblox.com/en-us/api-reference/class/BodyForce","BodyGyro":"https://developer.roblox.com/en-us/api-reference/class/BodyGyro","BodyPosition":"https://developer.roblox.com/en-us/api-reference/class/BodyPosition","BodyThrust":"https://developer.roblox.com/en-us/api-reference/class/BodyThrust","BodyVelocity":"https://developer.roblox.com/en-us/api-reference/class/BodyVelocity","RocketPropulsion":"https://developer.roblox.com/en-us/api-reference/class/RocketPropulsion","BodyPartDescription":"https://developer.roblox.com/en-us/api-reference/class/BodyPartDescription","Breakpoint":"https://developer.roblox.com/en-us/api-reference/class/Breakpoint","BrowserService":"https://developer.roblox.com/en-us/api-reference/class/BrowserService","BubbleChatMessageProperties":"https://developer.roblox.com/en-us/api-reference/class/BubbleChatMessageProperties","BulkImportService":"https://developer.roblox.com/en-us/api-reference/class/BulkImportService","CacheableContentProvider":"https://developer.roblox.com/en-us/api-reference/class/CacheableContentProvider","HSRDataContentProvider":"https://developer.roblox.com/en-us/api-reference/class/HSRDataContentProvider","MeshContentProvider":"https://developer.roblox.com/en-us/api-reference/class/MeshContentProvider","SolidModelContentProvider":"https://developer.roblox.com/en-us/api-reference/class/SolidModelContentProvider","CalloutService":"https://developer.roblox.com/en-us/api-reference/class/CalloutService","Camera":"https://developer.roblox.com/en-us/api-reference/class/Camera","CaptureService":"https://developer.roblox.com/en-us/api-reference/class/CaptureService","ChangeHistoryService":"https://developer.roblox.com/en-us/api-reference/class/ChangeHistoryService","CharacterAppearance":"https://developer.roblox.com/en-us/api-reference/class/CharacterAppearance","BodyColors":"https://developer.roblox.com/en-us/api-reference/class/BodyColors","CharacterMesh":"https://developer.roblox.com/en-us/api-reference/class/CharacterMesh","Clothing":"https://developer.roblox.com/en-us/api-reference/class/Clothing","Pants":"https://developer.roblox.com/en-us/api-reference/class/Pants","Shirt":"https://developer.roblox.com/en-us/api-reference/class/Shirt","ShirtGraphic":"https://developer.roblox.com/en-us/api-reference/class/ShirtGraphic","Skin":"https://developer.roblox.com/en-us/api-reference/class/Skin","Chat":"https://developer.roblox.com/en-us/api-reference/class/Chat","ChatbotUIService":"https://developer.roblox.com/en-us/api-reference/class/ChatbotUIService","ClickDetector":"https://developer.roblox.com/en-us/api-reference/class/ClickDetector","DragDetector":"https://developer.roblox.com/en-us/api-reference/class/DragDetector","Clouds":"https://developer.roblox.com/en-us/api-reference/class/Clouds","ClusterPacketCache":"https://developer.roblox.com/en-us/api-reference/class/ClusterPacketCache","Collaborator":"https://developer.roblox.com/en-us/api-reference/class/Collaborator","CollaboratorsService":"https://developer.roblox.com/en-us/api-reference/class/CollaboratorsService","CollectionService":"https://developer.roblox.com/en-us/api-reference/class/CollectionService","CommandInstance":"https://developer.roblox.com/en-us/api-reference/class/CommandInstance","CommandService":"https://developer.roblox.com/en-us/api-reference/class/CommandService","Configuration":"https://developer.roblox.com/en-us/api-reference/class/Configuration","ConfigureServerService":"https://developer.roblox.com/en-us/api-reference/class/ConfigureServerService","ConnectivityService":"https://developer.roblox.com/en-us/api-reference/class/ConnectivityService","Constraint":"https://developer.roblox.com/en-us/api-reference/class/Constraint","AlignOrientation":"https://developer.roblox.com/en-us/api-reference/class/AlignOrientation","AlignPosition":"https://developer.roblox.com/en-us/api-reference/class/AlignPosition","AngularVelocity":"https://developer.roblox.com/en-us/api-reference/class/AngularVelocity","AnimationConstraint":"https://developer.roblox.com/en-us/api-reference/class/AnimationConstraint","BallSocketConstraint":"https://developer.roblox.com/en-us/api-reference/class/BallSocketConstraint","HingeConstraint":"https://developer.roblox.com/en-us/api-reference/class/HingeConstraint","LineForce":"https://developer.roblox.com/en-us/api-reference/class/LineForce","LinearVelocity":"https://developer.roblox.com/en-us/api-reference/class/LinearVelocity","PlaneConstraint":"https://developer.roblox.com/en-us/api-reference/class/PlaneConstraint","Plane":"https://developer.roblox.com/en-us/api-reference/class/Plane","RigidConstraint":"https://developer.roblox.com/en-us/api-reference/class/RigidConstraint","RodConstraint":"https://developer.roblox.com/en-us/api-reference/class/RodConstraint","RopeConstraint":"https://developer.roblox.com/en-us/api-reference/class/RopeConstraint","SlidingBallConstraint":"https://developer.roblox.com/en-us/api-reference/class/SlidingBallConstraint","CylindricalConstraint":"https://developer.roblox.com/en-us/api-reference/class/CylindricalConstraint","PrismaticConstraint":"https://developer.roblox.com/en-us/api-reference/class/PrismaticConstraint","SpringConstraint":"https://developer.roblox.com/en-us/api-reference/class/SpringConstraint","Torque":"https://developer.roblox.com/en-us/api-reference/class/Torque","TorsionSpringConstraint":"https://developer.roblox.com/en-us/api-reference/class/TorsionSpringConstraint","UniversalConstraint":"https://developer.roblox.com/en-us/api-reference/class/UniversalConstraint","VectorForce":"https://developer.roblox.com/en-us/api-reference/class/VectorForce","ContentProvider":"https://developer.roblox.com/en-us/api-reference/class/ContentProvider","ContextActionService":"https://developer.roblox.com/en-us/api-reference/class/ContextActionService","Controller":"/Knit/api/KnitClient#Controller","HumanoidController":"https://developer.roblox.com/en-us/api-reference/class/HumanoidController","SkateboardController":"https://developer.roblox.com/en-us/api-reference/class/SkateboardController","VehicleController":"https://developer.roblox.com/en-us/api-reference/class/VehicleController","ControllerBase":"https://developer.roblox.com/en-us/api-reference/class/ControllerBase","AirController":"https://developer.roblox.com/en-us/api-reference/class/AirController","ClimbController":"https://developer.roblox.com/en-us/api-reference/class/ClimbController","GroundController":"https://developer.roblox.com/en-us/api-reference/class/GroundController","SwimController":"https://developer.roblox.com/en-us/api-reference/class/SwimController","ControllerManager":"https://developer.roblox.com/en-us/api-reference/class/ControllerManager","ControllerService":"https://developer.roblox.com/en-us/api-reference/class/ControllerService","ConversationalAIAcceptanceService":"https://developer.roblox.com/en-us/api-reference/class/ConversationalAIAcceptanceService","CookiesService":"https://developer.roblox.com/en-us/api-reference/class/CookiesService","CorePackages":"https://developer.roblox.com/en-us/api-reference/class/CorePackages","CoreScriptDebuggingManagerHelper":"https://developer.roblox.com/en-us/api-reference/class/CoreScriptDebuggingManagerHelper","CoreScriptSyncService":"https://developer.roblox.com/en-us/api-reference/class/CoreScriptSyncService","CreationDBService":"https://developer.roblox.com/en-us/api-reference/class/CreationDBService","CrossDMScriptChangeListener":"https://developer.roblox.com/en-us/api-reference/class/CrossDMScriptChangeListener","CustomEvent":"https://developer.roblox.com/en-us/api-reference/class/CustomEvent","CustomEventReceiver":"https://developer.roblox.com/en-us/api-reference/class/CustomEventReceiver","DataModelMesh":"https://developer.roblox.com/en-us/api-reference/class/DataModelMesh","BevelMesh":"https://developer.roblox.com/en-us/api-reference/class/BevelMesh","BlockMesh":"https://developer.roblox.com/en-us/api-reference/class/BlockMesh","CylinderMesh":"https://developer.roblox.com/en-us/api-reference/class/CylinderMesh","EditableMesh":"https://developer.roblox.com/en-us/api-reference/class/EditableMesh","FileMesh":"https://developer.roblox.com/en-us/api-reference/class/FileMesh","SpecialMesh":"https://developer.roblox.com/en-us/api-reference/class/SpecialMesh","DataModelPatchService":"https://developer.roblox.com/en-us/api-reference/class/DataModelPatchService","DataModelSession":"https://developer.roblox.com/en-us/api-reference/class/DataModelSession","DataStoreGetOptions":"https://developer.roblox.com/en-us/api-reference/class/DataStoreGetOptions","DataStoreIncrementOptions":"https://developer.roblox.com/en-us/api-reference/class/DataStoreIncrementOptions","DataStoreInfo":"https://developer.roblox.com/en-us/api-reference/class/DataStoreInfo","DataStoreKey":"https://developer.roblox.com/en-us/api-reference/class/DataStoreKey","DataStoreKeyInfo":"https://developer.roblox.com/en-us/api-reference/class/DataStoreKeyInfo","DataStoreObjectVersionInfo":"https://developer.roblox.com/en-us/api-reference/class/DataStoreObjectVersionInfo","DataStoreOptions":"https://developer.roblox.com/en-us/api-reference/class/DataStoreOptions","DataStoreService":"https://developer.roblox.com/en-us/api-reference/class/DataStoreService","DataStoreSetOptions":"https://developer.roblox.com/en-us/api-reference/class/DataStoreSetOptions","Debris":"https://developer.roblox.com/en-us/api-reference/class/Debris","DebugSettings":"https://developer.roblox.com/en-us/api-reference/class/DebugSettings","DebuggablePluginWatcher":"https://developer.roblox.com/en-us/api-reference/class/DebuggablePluginWatcher","DebuggerBreakpoint":"https://developer.roblox.com/en-us/api-reference/class/DebuggerBreakpoint","DebuggerConnection":"https://developer.roblox.com/en-us/api-reference/class/DebuggerConnection","LocalDebuggerConnection":"https://developer.roblox.com/en-us/api-reference/class/LocalDebuggerConnection","DebuggerConnectionManager":"https://developer.roblox.com/en-us/api-reference/class/DebuggerConnectionManager","DebuggerLuaResponse":"https://developer.roblox.com/en-us/api-reference/class/DebuggerLuaResponse","DebuggerManager":"https://developer.roblox.com/en-us/api-reference/class/DebuggerManager","DebuggerUIService":"https://developer.roblox.com/en-us/api-reference/class/DebuggerUIService","DebuggerVariable":"https://developer.roblox.com/en-us/api-reference/class/DebuggerVariable","DebuggerWatch":"https://developer.roblox.com/en-us/api-reference/class/DebuggerWatch","DeviceIdService":"https://developer.roblox.com/en-us/api-reference/class/DeviceIdService","Dialog":"https://developer.roblox.com/en-us/api-reference/class/Dialog","DialogChoice":"https://developer.roblox.com/en-us/api-reference/class/DialogChoice","DraftsService":"https://developer.roblox.com/en-us/api-reference/class/DraftsService","Dragger":"https://developer.roblox.com/en-us/api-reference/class/Dragger","DraggerService":"https://developer.roblox.com/en-us/api-reference/class/DraggerService","EditableImage":"https://developer.roblox.com/en-us/api-reference/class/EditableImage","RobloxEditableImage":"https://developer.roblox.com/en-us/api-reference/class/RobloxEditableImage","EngineAPICloudProcessingService":"https://developer.roblox.com/en-us/api-reference/class/EngineAPICloudProcessingService","EulerRotationCurve":"https://developer.roblox.com/en-us/api-reference/class/EulerRotationCurve","EventIngestService":"https://developer.roblox.com/en-us/api-reference/class/EventIngestService","ExperienceAuthService":"https://developer.roblox.com/en-us/api-reference/class/ExperienceAuthService","ExperienceInviteOptions":"https://developer.roblox.com/en-us/api-reference/class/ExperienceInviteOptions","ExperienceNotificationService":"https://developer.roblox.com/en-us/api-reference/class/ExperienceNotificationService","ExperienceService":"https://developer.roblox.com/en-us/api-reference/class/ExperienceService","ExperienceStateCaptureService":"https://developer.roblox.com/en-us/api-reference/class/ExperienceStateCaptureService","Explosion":"https://developer.roblox.com/en-us/api-reference/class/Explosion","FaceAnimatorService":"https://developer.roblox.com/en-us/api-reference/class/FaceAnimatorService","FaceControls":"https://developer.roblox.com/en-us/api-reference/class/FaceControls","FaceInstance":"https://developer.roblox.com/en-us/api-reference/class/FaceInstance","Decal":"https://developer.roblox.com/en-us/api-reference/class/Decal","Texture":"https://developer.roblox.com/en-us/api-reference/class/Texture","FacialAnimationRecordingService":"https://developer.roblox.com/en-us/api-reference/class/FacialAnimationRecordingService","FacialAnimationStreamingServiceStats":"https://developer.roblox.com/en-us/api-reference/class/FacialAnimationStreamingServiceStats","FacialAnimationStreamingServiceV2":"https://developer.roblox.com/en-us/api-reference/class/FacialAnimationStreamingServiceV2","FacialAnimationStreamingSubsessionStats":"https://developer.roblox.com/en-us/api-reference/class/FacialAnimationStreamingSubsessionStats","Feature":"https://developer.roblox.com/en-us/api-reference/class/Feature","Hole":"https://developer.roblox.com/en-us/api-reference/class/Hole","MotorFeature":"https://developer.roblox.com/en-us/api-reference/class/MotorFeature","File":"https://developer.roblox.com/en-us/api-reference/class/File","Fire":"https://developer.roblox.com/en-us/api-reference/class/Fire","FlagStandService":"https://developer.roblox.com/en-us/api-reference/class/FlagStandService","FloatCurve":"https://developer.roblox.com/en-us/api-reference/class/FloatCurve","FlyweightService":"https://developer.roblox.com/en-us/api-reference/class/FlyweightService","CSGDictionaryService":"https://developer.roblox.com/en-us/api-reference/class/CSGDictionaryService","NonReplicatedCSGDictionaryService":"https://developer.roblox.com/en-us/api-reference/class/NonReplicatedCSGDictionaryService","Folder":"https://developer.roblox.com/en-us/api-reference/class/Folder","ForceField":"https://developer.roblox.com/en-us/api-reference/class/ForceField","FriendService":"https://developer.roblox.com/en-us/api-reference/class/FriendService","FunctionalTest":"https://developer.roblox.com/en-us/api-reference/class/FunctionalTest","GamePassService":"https://developer.roblox.com/en-us/api-reference/class/GamePassService","GameSettings":"https://developer.roblox.com/en-us/api-reference/class/GameSettings","GamepadService":"https://developer.roblox.com/en-us/api-reference/class/GamepadService","Geometry":"https://developer.roblox.com/en-us/api-reference/class/Geometry","GeometryService":"https://developer.roblox.com/en-us/api-reference/class/GeometryService","GetTextBoundsParams":"https://developer.roblox.com/en-us/api-reference/class/GetTextBoundsParams","GlobalDataStore":"https://developer.roblox.com/en-us/api-reference/class/GlobalDataStore","DataStore":"https://developer.roblox.com/en-us/api-reference/class/DataStore","OrderedDataStore":"https://developer.roblox.com/en-us/api-reference/class/OrderedDataStore","GoogleAnalyticsConfiguration":"https://developer.roblox.com/en-us/api-reference/class/GoogleAnalyticsConfiguration","GroupService":"https://developer.roblox.com/en-us/api-reference/class/GroupService","GuiBase":"https://developer.roblox.com/en-us/api-reference/class/GuiBase","GuiBase2d":"https://developer.roblox.com/en-us/api-reference/class/GuiBase2d","GuiObject":"https://developer.roblox.com/en-us/api-reference/class/GuiObject","CanvasGroup":"https://developer.roblox.com/en-us/api-reference/class/CanvasGroup","Frame":"https://developer.roblox.com/en-us/api-reference/class/Frame","GuiButton":"https://developer.roblox.com/en-us/api-reference/class/GuiButton","ImageButton":"https://developer.roblox.com/en-us/api-reference/class/ImageButton","TextButton":"https://developer.roblox.com/en-us/api-reference/class/TextButton","GuiLabel":"https://developer.roblox.com/en-us/api-reference/class/GuiLabel","ImageLabel":"https://developer.roblox.com/en-us/api-reference/class/ImageLabel","TextLabel":"https://developer.roblox.com/en-us/api-reference/class/TextLabel","ScrollingFrame":"https://developer.roblox.com/en-us/api-reference/class/ScrollingFrame","TextBox":"https://developer.roblox.com/en-us/api-reference/class/TextBox","VideoFrame":"https://developer.roblox.com/en-us/api-reference/class/VideoFrame","ViewportFrame":"https://developer.roblox.com/en-us/api-reference/class/ViewportFrame","LayerCollector":"https://developer.roblox.com/en-us/api-reference/class/LayerCollector","BillboardGui":"https://developer.roblox.com/en-us/api-reference/class/BillboardGui","PluginGui":"https://developer.roblox.com/en-us/api-reference/class/PluginGui","DockWidgetPluginGui":"https://developer.roblox.com/en-us/api-reference/class/DockWidgetPluginGui","QWidgetPluginGui":"https://developer.roblox.com/en-us/api-reference/class/QWidgetPluginGui","ScreenGui":"https://developer.roblox.com/en-us/api-reference/class/ScreenGui","GuiMain":"https://developer.roblox.com/en-us/api-reference/class/GuiMain","SurfaceGuiBase":"https://developer.roblox.com/en-us/api-reference/class/SurfaceGuiBase","AdGui":"https://developer.roblox.com/en-us/api-reference/class/AdGui","SurfaceGui":"https://developer.roblox.com/en-us/api-reference/class/SurfaceGui","GuiBase3d":"https://developer.roblox.com/en-us/api-reference/class/GuiBase3d","FloorWire":"https://developer.roblox.com/en-us/api-reference/class/FloorWire","InstanceAdornment":"https://developer.roblox.com/en-us/api-reference/class/InstanceAdornment","SelectionBox":"https://developer.roblox.com/en-us/api-reference/class/SelectionBox","PVAdornment":"https://developer.roblox.com/en-us/api-reference/class/PVAdornment","HandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/HandleAdornment","BoxHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/BoxHandleAdornment","ConeHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/ConeHandleAdornment","CylinderHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/CylinderHandleAdornment","ImageHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/ImageHandleAdornment","LineHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/LineHandleAdornment","SphereHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/SphereHandleAdornment","WireframeHandleAdornment":"https://developer.roblox.com/en-us/api-reference/class/WireframeHandleAdornment","ParabolaAdornment":"https://developer.roblox.com/en-us/api-reference/class/ParabolaAdornment","SelectionSphere":"https://developer.roblox.com/en-us/api-reference/class/SelectionSphere","PartAdornment":"https://developer.roblox.com/en-us/api-reference/class/PartAdornment","HandlesBase":"https://developer.roblox.com/en-us/api-reference/class/HandlesBase","ArcHandles":"https://developer.roblox.com/en-us/api-reference/class/ArcHandles","Handles":"https://developer.roblox.com/en-us/api-reference/class/Handles","SurfaceSelection":"https://developer.roblox.com/en-us/api-reference/class/SurfaceSelection","SelectionLasso":"https://developer.roblox.com/en-us/api-reference/class/SelectionLasso","SelectionPartLasso":"https://developer.roblox.com/en-us/api-reference/class/SelectionPartLasso","SelectionPointLasso":"https://developer.roblox.com/en-us/api-reference/class/SelectionPointLasso","Path2D":"https://developer.roblox.com/en-us/api-reference/class/Path2D","GuiService":"https://developer.roblox.com/en-us/api-reference/class/GuiService","GuidRegistryService":"https://developer.roblox.com/en-us/api-reference/class/GuidRegistryService","HapticService":"https://developer.roblox.com/en-us/api-reference/class/HapticService","HeightmapImporterService":"https://developer.roblox.com/en-us/api-reference/class/HeightmapImporterService","HiddenSurfaceRemovalAsset":"https://developer.roblox.com/en-us/api-reference/class/HiddenSurfaceRemovalAsset","Highlight":"https://developer.roblox.com/en-us/api-reference/class/Highlight","Hopper":"https://developer.roblox.com/en-us/api-reference/class/Hopper","HttpRbxApiService":"https://developer.roblox.com/en-us/api-reference/class/HttpRbxApiService","HttpRequest":"https://developer.roblox.com/en-us/api-reference/class/HttpRequest","HttpService":"https://developer.roblox.com/en-us/api-reference/class/HttpService","Humanoid":"https://developer.roblox.com/en-us/api-reference/class/Humanoid","HumanoidDescription":"https://developer.roblox.com/en-us/api-reference/class/HumanoidDescription","IKControl":"https://developer.roblox.com/en-us/api-reference/class/IKControl","ILegacyStudioBridge":"https://developer.roblox.com/en-us/api-reference/class/ILegacyStudioBridge","LegacyStudioBridge":"https://developer.roblox.com/en-us/api-reference/class/LegacyStudioBridge","IXPService":"https://developer.roblox.com/en-us/api-reference/class/IXPService","IncrementalPatchBuilder":"https://developer.roblox.com/en-us/api-reference/class/IncrementalPatchBuilder","InputObject":"https://developer.roblox.com/en-us/api-reference/class/InputObject","InsertService":"https://developer.roblox.com/en-us/api-reference/class/InsertService","JointInstance":"https://developer.roblox.com/en-us/api-reference/class/JointInstance","DynamicRotate":"https://developer.roblox.com/en-us/api-reference/class/DynamicRotate","RotateP":"https://developer.roblox.com/en-us/api-reference/class/RotateP","RotateV":"https://developer.roblox.com/en-us/api-reference/class/RotateV","Glue":"https://developer.roblox.com/en-us/api-reference/class/Glue","ManualSurfaceJointInstance":"https://developer.roblox.com/en-us/api-reference/class/ManualSurfaceJointInstance","ManualGlue":"https://developer.roblox.com/en-us/api-reference/class/ManualGlue","ManualWeld":"https://developer.roblox.com/en-us/api-reference/class/ManualWeld","Motor":"https://developer.roblox.com/en-us/api-reference/class/Motor","Motor6D":"https://developer.roblox.com/en-us/api-reference/class/Motor6D","Rotate":"https://developer.roblox.com/en-us/api-reference/class/Rotate","Snap":"https://developer.roblox.com/en-us/api-reference/class/Snap","VelocityMotor":"https://developer.roblox.com/en-us/api-reference/class/VelocityMotor","Weld":"https://developer.roblox.com/en-us/api-reference/class/Weld","JointsService":"https://developer.roblox.com/en-us/api-reference/class/JointsService","KeyboardService":"https://developer.roblox.com/en-us/api-reference/class/KeyboardService","Keyframe":"https://developer.roblox.com/en-us/api-reference/class/Keyframe","KeyframeMarker":"https://developer.roblox.com/en-us/api-reference/class/KeyframeMarker","KeyframeSequenceProvider":"https://developer.roblox.com/en-us/api-reference/class/KeyframeSequenceProvider","LSPFileSyncService":"https://developer.roblox.com/en-us/api-reference/class/LSPFileSyncService","LanguageService":"https://developer.roblox.com/en-us/api-reference/class/LanguageService","Light":"https://developer.roblox.com/en-us/api-reference/class/Light","PointLight":"https://developer.roblox.com/en-us/api-reference/class/PointLight","SpotLight":"https://developer.roblox.com/en-us/api-reference/class/SpotLight","SurfaceLight":"https://developer.roblox.com/en-us/api-reference/class/SurfaceLight","Lighting":"https://developer.roblox.com/en-us/api-reference/class/Lighting","LiveScriptingService":"https://developer.roblox.com/en-us/api-reference/class/LiveScriptingService","LocalStorageService":"https://developer.roblox.com/en-us/api-reference/class/LocalStorageService","AppStorageService":"https://developer.roblox.com/en-us/api-reference/class/AppStorageService","UserStorageService":"https://developer.roblox.com/en-us/api-reference/class/UserStorageService","LocalizationService":"https://developer.roblox.com/en-us/api-reference/class/LocalizationService","LocalizationTable":"https://developer.roblox.com/en-us/api-reference/class/LocalizationTable","CloudLocalizationTable":"https://developer.roblox.com/en-us/api-reference/class/CloudLocalizationTable","LodDataEntity":"https://developer.roblox.com/en-us/api-reference/class/LodDataEntity","LodDataService":"https://developer.roblox.com/en-us/api-reference/class/LodDataService","LogReporterService":"https://developer.roblox.com/en-us/api-reference/class/LogReporterService","LogService":"https://developer.roblox.com/en-us/api-reference/class/LogService","LoginService":"https://developer.roblox.com/en-us/api-reference/class/LoginService","LuaSettings":"https://developer.roblox.com/en-us/api-reference/class/LuaSettings","LuaSourceContainer":"https://developer.roblox.com/en-us/api-reference/class/LuaSourceContainer","BaseScript":"https://developer.roblox.com/en-us/api-reference/class/BaseScript","CoreScript":"https://developer.roblox.com/en-us/api-reference/class/CoreScript","Script":"https://developer.roblox.com/en-us/api-reference/class/Script","LocalScript":"https://developer.roblox.com/en-us/api-reference/class/LocalScript","ModuleScript":"https://developer.roblox.com/en-us/api-reference/class/ModuleScript","LuaWebService":"https://developer.roblox.com/en-us/api-reference/class/LuaWebService","LuauScriptAnalyzerService":"https://developer.roblox.com/en-us/api-reference/class/LuauScriptAnalyzerService","MarkerCurve":"https://developer.roblox.com/en-us/api-reference/class/MarkerCurve","MarketplaceService":"https://developer.roblox.com/en-us/api-reference/class/MarketplaceService","MaterialGenerationService":"https://developer.roblox.com/en-us/api-reference/class/MaterialGenerationService","MaterialGenerationSession":"https://developer.roblox.com/en-us/api-reference/class/MaterialGenerationSession","MaterialService":"https://developer.roblox.com/en-us/api-reference/class/MaterialService","MaterialVariant":"https://developer.roblox.com/en-us/api-reference/class/MaterialVariant","MemStorageConnection":"https://developer.roblox.com/en-us/api-reference/class/MemStorageConnection","MemStorageService":"https://developer.roblox.com/en-us/api-reference/class/MemStorageService","MemoryStoreHashMap":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreHashMap","MemoryStoreQueue":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreQueue","MemoryStoreService":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreService","MemoryStoreSortedMap":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreSortedMap","Message":"https://developer.roblox.com/en-us/api-reference/class/Message","Hint":"https://developer.roblox.com/en-us/api-reference/class/Hint","MessageBusConnection":"https://developer.roblox.com/en-us/api-reference/class/MessageBusConnection","MessageBusService":"https://developer.roblox.com/en-us/api-reference/class/MessageBusService","MessagingService":"https://developer.roblox.com/en-us/api-reference/class/MessagingService","MetaBreakpoint":"https://developer.roblox.com/en-us/api-reference/class/MetaBreakpoint","MetaBreakpointContext":"https://developer.roblox.com/en-us/api-reference/class/MetaBreakpointContext","MetaBreakpointManager":"https://developer.roblox.com/en-us/api-reference/class/MetaBreakpointManager","Mouse":"https://developer.roblox.com/en-us/api-reference/class/Mouse","PlayerMouse":"https://developer.roblox.com/en-us/api-reference/class/PlayerMouse","PluginMouse":"https://developer.roblox.com/en-us/api-reference/class/PluginMouse","MouseService":"https://developer.roblox.com/en-us/api-reference/class/MouseService","MultipleDocumentInterfaceInstance":"https://developer.roblox.com/en-us/api-reference/class/MultipleDocumentInterfaceInstance","NetworkMarker":"https://developer.roblox.com/en-us/api-reference/class/NetworkMarker","NetworkPeer":"https://developer.roblox.com/en-us/api-reference/class/NetworkPeer","NetworkClient":"https://developer.roblox.com/en-us/api-reference/class/NetworkClient","NetworkServer":"https://developer.roblox.com/en-us/api-reference/class/NetworkServer","NetworkReplicator":"https://developer.roblox.com/en-us/api-reference/class/NetworkReplicator","ClientReplicator":"https://developer.roblox.com/en-us/api-reference/class/ClientReplicator","ServerReplicator":"https://developer.roblox.com/en-us/api-reference/class/ServerReplicator","NetworkSettings":"https://developer.roblox.com/en-us/api-reference/class/NetworkSettings","NoCollisionConstraint":"https://developer.roblox.com/en-us/api-reference/class/NoCollisionConstraint","NotificationService":"https://developer.roblox.com/en-us/api-reference/class/NotificationService","OmniRecommendationsService":"https://developer.roblox.com/en-us/api-reference/class/OmniRecommendationsService","OpenCloudApiV1":"https://developer.roblox.com/en-us/api-reference/class/OpenCloudApiV1","OpenCloudService":"https://developer.roblox.com/en-us/api-reference/class/OpenCloudService","OperationGraph":"https://developer.roblox.com/en-us/api-reference/class/OperationGraph","PVInstance":"https://developer.roblox.com/en-us/api-reference/class/PVInstance","BasePart":"https://developer.roblox.com/en-us/api-reference/class/BasePart","CornerWedgePart":"https://developer.roblox.com/en-us/api-reference/class/CornerWedgePart","FormFactorPart":"https://developer.roblox.com/en-us/api-reference/class/FormFactorPart","Part":"https://developer.roblox.com/en-us/api-reference/class/Part","FlagStand":"https://developer.roblox.com/en-us/api-reference/class/FlagStand","Platform":"https://developer.roblox.com/en-us/api-reference/enum/Platform","Seat":"https://developer.roblox.com/en-us/api-reference/class/Seat","SkateboardPlatform":"https://developer.roblox.com/en-us/api-reference/class/SkateboardPlatform","SpawnLocation":"https://developer.roblox.com/en-us/api-reference/class/SpawnLocation","WedgePart":"https://developer.roblox.com/en-us/api-reference/class/WedgePart","Terrain":"https://developer.roblox.com/en-us/api-reference/class/Terrain","TriangleMeshPart":"https://developer.roblox.com/en-us/api-reference/class/TriangleMeshPart","MeshPart":"https://developer.roblox.com/en-us/api-reference/class/MeshPart","PartOperation":"https://developer.roblox.com/en-us/api-reference/class/PartOperation","IntersectOperation":"https://developer.roblox.com/en-us/api-reference/class/IntersectOperation","NegateOperation":"https://developer.roblox.com/en-us/api-reference/class/NegateOperation","UnionOperation":"https://developer.roblox.com/en-us/api-reference/class/UnionOperation","TrussPart":"https://developer.roblox.com/en-us/api-reference/class/TrussPart","VehicleSeat":"https://developer.roblox.com/en-us/api-reference/class/VehicleSeat","Model":"https://developer.roblox.com/en-us/api-reference/class/Model","Actor":"https://developer.roblox.com/en-us/api-reference/class/Actor","BackpackItem":"https://developer.roblox.com/en-us/api-reference/class/BackpackItem","HopperBin":"https://developer.roblox.com/en-us/api-reference/class/HopperBin","Tool":"https://developer.roblox.com/en-us/api-reference/class/Tool","Flag":"https://developer.roblox.com/en-us/api-reference/class/Flag","Status":"https://developer.roblox.com/en-us/api-reference/enum/Status","WorldRoot":"https://developer.roblox.com/en-us/api-reference/class/WorldRoot","Workspace":"https://developer.roblox.com/en-us/api-reference/class/Workspace","WorldModel":"https://developer.roblox.com/en-us/api-reference/class/WorldModel","PackageLink":"https://developer.roblox.com/en-us/api-reference/class/PackageLink","PackageService":"https://developer.roblox.com/en-us/api-reference/class/PackageService","PackageUIService":"https://developer.roblox.com/en-us/api-reference/class/PackageUIService","Pages":"https://developer.roblox.com/en-us/api-reference/class/Pages","AudioPages":"https://developer.roblox.com/en-us/api-reference/class/AudioPages","CatalogPages":"https://developer.roblox.com/en-us/api-reference/class/CatalogPages","DataStoreKeyPages":"https://developer.roblox.com/en-us/api-reference/class/DataStoreKeyPages","DataStoreListingPages":"https://developer.roblox.com/en-us/api-reference/class/DataStoreListingPages","DataStorePages":"https://developer.roblox.com/en-us/api-reference/class/DataStorePages","DataStoreVersionPages":"https://developer.roblox.com/en-us/api-reference/class/DataStoreVersionPages","FriendPages":"https://developer.roblox.com/en-us/api-reference/class/FriendPages","InventoryPages":"https://developer.roblox.com/en-us/api-reference/class/InventoryPages","EmotesPages":"https://developer.roblox.com/en-us/api-reference/class/EmotesPages","MemoryStoreHashMapPages":"https://developer.roblox.com/en-us/api-reference/class/MemoryStoreHashMapPages","OutfitPages":"https://developer.roblox.com/en-us/api-reference/class/OutfitPages","StandardPages":"https://developer.roblox.com/en-us/api-reference/class/StandardPages","PartOperationAsset":"https://developer.roblox.com/en-us/api-reference/class/PartOperationAsset","ParticleEmitter":"https://developer.roblox.com/en-us/api-reference/class/ParticleEmitter","PatchBundlerFileWatch":"https://developer.roblox.com/en-us/api-reference/class/PatchBundlerFileWatch","PatchMapping":"https://developer.roblox.com/en-us/api-reference/class/PatchMapping","Path":"https://developer.roblox.com/en-us/api-reference/class/Path","PathfindingLink":"https://developer.roblox.com/en-us/api-reference/class/PathfindingLink","PathfindingModifier":"https://developer.roblox.com/en-us/api-reference/class/PathfindingModifier","PathfindingService":"https://developer.roblox.com/en-us/api-reference/class/PathfindingService","PausedState":"https://developer.roblox.com/en-us/api-reference/class/PausedState","PausedStateBreakpoint":"https://developer.roblox.com/en-us/api-reference/class/PausedStateBreakpoint","PausedStateException":"https://developer.roblox.com/en-us/api-reference/class/PausedStateException","PermissionsService":"https://developer.roblox.com/en-us/api-reference/class/PermissionsService","PhysicsService":"https://developer.roblox.com/en-us/api-reference/class/PhysicsService","PhysicsSettings":"https://developer.roblox.com/en-us/api-reference/class/PhysicsSettings","PlaceStatsService":"https://developer.roblox.com/en-us/api-reference/class/PlaceStatsService","PlacesService":"https://developer.roblox.com/en-us/api-reference/class/PlacesService","PlatformCloudStorageService":"https://developer.roblox.com/en-us/api-reference/class/PlatformCloudStorageService","PlatformFriendsService":"https://developer.roblox.com/en-us/api-reference/class/PlatformFriendsService","Player":"https://developer.roblox.com/en-us/api-reference/class/Player","PlayerEmulatorService":"https://developer.roblox.com/en-us/api-reference/class/PlayerEmulatorService","PlayerScripts":"https://developer.roblox.com/en-us/api-reference/class/PlayerScripts","PlayerViewService":"https://developer.roblox.com/en-us/api-reference/class/PlayerViewService","Players":"https://developer.roblox.com/en-us/api-reference/class/Players","Plugin":"https://developer.roblox.com/en-us/api-reference/class/Plugin","PluginAction":"https://developer.roblox.com/en-us/api-reference/class/PluginAction","PluginCapabilities":"https://developer.roblox.com/en-us/api-reference/class/PluginCapabilities","PluginDebugService":"https://developer.roblox.com/en-us/api-reference/class/PluginDebugService","PluginDragEvent":"https://developer.roblox.com/en-us/api-reference/class/PluginDragEvent","PluginGuiService":"https://developer.roblox.com/en-us/api-reference/class/PluginGuiService","PluginManagementService":"https://developer.roblox.com/en-us/api-reference/class/PluginManagementService","PluginManager":"https://developer.roblox.com/en-us/api-reference/class/PluginManager","PluginManagerInterface":"https://developer.roblox.com/en-us/api-reference/class/PluginManagerInterface","PluginMenu":"https://developer.roblox.com/en-us/api-reference/class/PluginMenu","PluginPolicyService":"https://developer.roblox.com/en-us/api-reference/class/PluginPolicyService","PluginToolbar":"https://developer.roblox.com/en-us/api-reference/class/PluginToolbar","PluginToolbarButton":"https://developer.roblox.com/en-us/api-reference/class/PluginToolbarButton","PointsService":"https://developer.roblox.com/en-us/api-reference/class/PointsService","PolicyService":"https://developer.roblox.com/en-us/api-reference/class/PolicyService","PoseBase":"https://developer.roblox.com/en-us/api-reference/class/PoseBase","NumberPose":"https://developer.roblox.com/en-us/api-reference/class/NumberPose","Pose":"https://developer.roblox.com/en-us/api-reference/class/Pose","PostEffect":"https://developer.roblox.com/en-us/api-reference/class/PostEffect","BloomEffect":"https://developer.roblox.com/en-us/api-reference/class/BloomEffect","BlurEffect":"https://developer.roblox.com/en-us/api-reference/class/BlurEffect","ColorCorrectionEffect":"https://developer.roblox.com/en-us/api-reference/class/ColorCorrectionEffect","DepthOfFieldEffect":"https://developer.roblox.com/en-us/api-reference/class/DepthOfFieldEffect","SunRaysEffect":"https://developer.roblox.com/en-us/api-reference/class/SunRaysEffect","ProcessInstancePhysicsService":"https://developer.roblox.com/en-us/api-reference/class/ProcessInstancePhysicsService","ProximityPrompt":"https://developer.roblox.com/en-us/api-reference/class/ProximityPrompt","ProximityPromptService":"https://developer.roblox.com/en-us/api-reference/class/ProximityPromptService","PublishService":"https://developer.roblox.com/en-us/api-reference/class/PublishService","RbxAnalyticsService":"https://developer.roblox.com/en-us/api-reference/class/RbxAnalyticsService","ReflectionMetadata":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadata","ReflectionMetadataCallbacks":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataCallbacks","ReflectionMetadataClasses":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataClasses","ReflectionMetadataEnums":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataEnums","ReflectionMetadataEvents":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataEvents","ReflectionMetadataFunctions":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataFunctions","ReflectionMetadataItem":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataItem","ReflectionMetadataClass":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataClass","ReflectionMetadataEnum":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataEnum","ReflectionMetadataEnumItem":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataEnumItem","ReflectionMetadataMember":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataMember","ReflectionMetadataProperties":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataProperties","ReflectionMetadataYieldFunctions":"https://developer.roblox.com/en-us/api-reference/class/ReflectionMetadataYieldFunctions","ReflectionService":"https://developer.roblox.com/en-us/api-reference/class/ReflectionService","RemoteCursorService":"https://developer.roblox.com/en-us/api-reference/class/RemoteCursorService","RemoteDebuggerServer":"https://developer.roblox.com/en-us/api-reference/class/RemoteDebuggerServer","RemoteFunction":"https://developer.roblox.com/en-us/api-reference/class/RemoteFunction","RenderSettings":"https://developer.roblox.com/en-us/api-reference/class/RenderSettings","RenderingTest":"https://developer.roblox.com/en-us/api-reference/class/RenderingTest","ReplicatedFirst":"https://developer.roblox.com/en-us/api-reference/class/ReplicatedFirst","ReplicatedStorage":"https://developer.roblox.com/en-us/api-reference/class/ReplicatedStorage","RibbonNotificationService":"https://developer.roblox.com/en-us/api-reference/class/RibbonNotificationService","RobloxPluginGuiService":"https://developer.roblox.com/en-us/api-reference/class/RobloxPluginGuiService","RobloxReplicatedStorage":"https://developer.roblox.com/en-us/api-reference/class/RobloxReplicatedStorage","RobloxServerStorage":"https://developer.roblox.com/en-us/api-reference/class/RobloxServerStorage","RomarkService":"https://developer.roblox.com/en-us/api-reference/class/RomarkService","RotationCurve":"https://developer.roblox.com/en-us/api-reference/class/RotationCurve","RtMessagingService":"https://developer.roblox.com/en-us/api-reference/class/RtMessagingService","RunService":"https://developer.roblox.com/en-us/api-reference/class/RunService","RuntimeScriptService":"https://developer.roblox.com/en-us/api-reference/class/RuntimeScriptService","SafetyService":"https://developer.roblox.com/en-us/api-reference/class/SafetyService","ScreenshotHud":"https://developer.roblox.com/en-us/api-reference/class/ScreenshotHud","ScriptBuilder":"https://developer.roblox.com/en-us/api-reference/class/ScriptBuilder","SyncScriptBuilder":"https://developer.roblox.com/en-us/api-reference/class/SyncScriptBuilder","ScriptChangeService":"https://developer.roblox.com/en-us/api-reference/class/ScriptChangeService","ScriptCloneWatcher":"https://developer.roblox.com/en-us/api-reference/class/ScriptCloneWatcher","ScriptCloneWatcherHelper":"https://developer.roblox.com/en-us/api-reference/class/ScriptCloneWatcherHelper","ScriptCommitService":"https://developer.roblox.com/en-us/api-reference/class/ScriptCommitService","ScriptContext":"https://developer.roblox.com/en-us/api-reference/class/ScriptContext","ScriptDebugger":"https://developer.roblox.com/en-us/api-reference/class/ScriptDebugger","ScriptDocument":"https://developer.roblox.com/en-us/api-reference/class/ScriptDocument","ScriptEditorService":"https://developer.roblox.com/en-us/api-reference/class/ScriptEditorService","ScriptRegistrationService":"https://developer.roblox.com/en-us/api-reference/class/ScriptRegistrationService","ScriptRuntime":"https://developer.roblox.com/en-us/api-reference/class/ScriptRuntime","ScriptService":"https://developer.roblox.com/en-us/api-reference/class/ScriptService","Selection":"https://developer.roblox.com/en-us/api-reference/class/Selection","SelectionHighlightManager":"https://developer.roblox.com/en-us/api-reference/class/SelectionHighlightManager","SensorBase":"https://developer.roblox.com/en-us/api-reference/class/SensorBase","BuoyancySensor":"https://developer.roblox.com/en-us/api-reference/class/BuoyancySensor","ControllerSensor":"https://developer.roblox.com/en-us/api-reference/class/ControllerSensor","ControllerPartSensor":"https://developer.roblox.com/en-us/api-reference/class/ControllerPartSensor","ServerScriptService":"https://developer.roblox.com/en-us/api-reference/class/ServerScriptService","ServerStorage":"https://developer.roblox.com/en-us/api-reference/class/ServerStorage","ServiceProvider":"https://developer.roblox.com/en-us/api-reference/class/ServiceProvider","DataModel":"https://developer.roblox.com/en-us/api-reference/class/DataModel","GenericSettings":"https://developer.roblox.com/en-us/api-reference/class/GenericSettings","AnalysticsSettings":"https://developer.roblox.com/en-us/api-reference/class/AnalysticsSettings","GlobalSettings":"https://developer.roblox.com/en-us/api-reference/class/GlobalSettings","UserSettings":"https://developer.roblox.com/en-us/api-reference/class/UserSettings","ServiceVisibilityService":"https://developer.roblox.com/en-us/api-reference/class/ServiceVisibilityService","SessionService":"https://developer.roblox.com/en-us/api-reference/class/SessionService","SharedTableRegistry":"https://developer.roblox.com/en-us/api-reference/class/SharedTableRegistry","ShorelineUpgraderService":"https://developer.roblox.com/en-us/api-reference/class/ShorelineUpgraderService","Sky":"https://developer.roblox.com/en-us/api-reference/class/Sky","Smoke":"https://developer.roblox.com/en-us/api-reference/class/Smoke","SmoothVoxelsUpgraderService":"https://developer.roblox.com/en-us/api-reference/class/SmoothVoxelsUpgraderService","SnippetService":"https://developer.roblox.com/en-us/api-reference/class/SnippetService","SocialService":"https://developer.roblox.com/en-us/api-reference/class/SocialService","Sound":"https://developer.roblox.com/en-us/api-reference/class/Sound","SoundEffect":"https://developer.roblox.com/en-us/api-reference/class/SoundEffect","ChorusSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/ChorusSoundEffect","CompressorSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/CompressorSoundEffect","CustomSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/CustomSoundEffect","AssetSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/AssetSoundEffect","ChannelSelectorSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/ChannelSelectorSoundEffect","DistortionSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/DistortionSoundEffect","EchoSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/EchoSoundEffect","EqualizerSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/EqualizerSoundEffect","FlangeSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/FlangeSoundEffect","PitchShiftSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/PitchShiftSoundEffect","ReverbSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/ReverbSoundEffect","TremoloSoundEffect":"https://developer.roblox.com/en-us/api-reference/class/TremoloSoundEffect","SoundGroup":"https://developer.roblox.com/en-us/api-reference/class/SoundGroup","SoundService":"https://developer.roblox.com/en-us/api-reference/class/SoundService","Sparkles":"https://developer.roblox.com/en-us/api-reference/class/Sparkles","SpawnerService":"https://developer.roblox.com/en-us/api-reference/class/SpawnerService","StackFrame":"https://developer.roblox.com/en-us/api-reference/class/StackFrame","StandalonePluginScripts":"https://developer.roblox.com/en-us/api-reference/class/StandalonePluginScripts","StarterGear":"https://developer.roblox.com/en-us/api-reference/class/StarterGear","StarterPack":"https://developer.roblox.com/en-us/api-reference/class/StarterPack","StarterPlayer":"https://developer.roblox.com/en-us/api-reference/class/StarterPlayer","StarterPlayerScripts":"https://developer.roblox.com/en-us/api-reference/class/StarterPlayerScripts","StarterCharacterScripts":"https://developer.roblox.com/en-us/api-reference/class/StarterCharacterScripts","StartupMessageService":"https://developer.roblox.com/en-us/api-reference/class/StartupMessageService","Stats":"https://developer.roblox.com/en-us/api-reference/class/Stats","StatsItem":"https://developer.roblox.com/en-us/api-reference/class/StatsItem","RunningAverageItemDouble":"https://developer.roblox.com/en-us/api-reference/class/RunningAverageItemDouble","RunningAverageItemInt":"https://developer.roblox.com/en-us/api-reference/class/RunningAverageItemInt","RunningAverageTimeIntervalItem":"https://developer.roblox.com/en-us/api-reference/class/RunningAverageTimeIntervalItem","TotalCountTimeIntervalItem":"https://developer.roblox.com/en-us/api-reference/class/TotalCountTimeIntervalItem","StopWatchReporter":"https://developer.roblox.com/en-us/api-reference/class/StopWatchReporter","StreamingService":"https://developer.roblox.com/en-us/api-reference/class/StreamingService","Studio":"https://developer.roblox.com/en-us/api-reference/class/Studio","StudioAssetService":"https://developer.roblox.com/en-us/api-reference/class/StudioAssetService","StudioAttachment":"https://developer.roblox.com/en-us/api-reference/class/StudioAttachment","StudioCallout":"https://developer.roblox.com/en-us/api-reference/class/StudioCallout","StudioData":"https://developer.roblox.com/en-us/api-reference/class/StudioData","StudioDeviceEmulatorService":"https://developer.roblox.com/en-us/api-reference/class/StudioDeviceEmulatorService","StudioObjectBase":"https://developer.roblox.com/en-us/api-reference/class/StudioObjectBase","StudioWidget":"https://developer.roblox.com/en-us/api-reference/class/StudioWidget","StudioPublishService":"https://developer.roblox.com/en-us/api-reference/class/StudioPublishService","StudioScriptDebugEventListener":"https://developer.roblox.com/en-us/api-reference/class/StudioScriptDebugEventListener","StudioSdkService":"https://developer.roblox.com/en-us/api-reference/class/StudioSdkService","StudioService":"https://developer.roblox.com/en-us/api-reference/class/StudioService","StudioTheme":"https://developer.roblox.com/en-us/api-reference/class/StudioTheme","StudioWidgetsService":"https://developer.roblox.com/en-us/api-reference/class/StudioWidgetsService","StyleBase":"https://developer.roblox.com/en-us/api-reference/class/StyleBase","StyleRule":"https://developer.roblox.com/en-us/api-reference/class/StyleRule","StyleSheet":"https://developer.roblox.com/en-us/api-reference/class/StyleSheet","StyleDerive":"https://developer.roblox.com/en-us/api-reference/class/StyleDerive","StyleLink":"https://developer.roblox.com/en-us/api-reference/class/StyleLink","StylingService":"https://developer.roblox.com/en-us/api-reference/class/StylingService","SurfaceAppearance":"https://developer.roblox.com/en-us/api-reference/class/SurfaceAppearance","TaskScheduler":"https://developer.roblox.com/en-us/api-reference/class/TaskScheduler","Team":"https://developer.roblox.com/en-us/api-reference/class/Team","TeamCreateData":"https://developer.roblox.com/en-us/api-reference/class/TeamCreateData","TeamCreatePublishService":"https://developer.roblox.com/en-us/api-reference/class/TeamCreatePublishService","TeamCreateService":"https://developer.roblox.com/en-us/api-reference/class/TeamCreateService","Teams":"https://developer.roblox.com/en-us/api-reference/class/Teams","TeleportAsyncResult":"https://developer.roblox.com/en-us/api-reference/class/TeleportAsyncResult","TeleportOptions":"https://developer.roblox.com/en-us/api-reference/class/TeleportOptions","TeleportService":"https://developer.roblox.com/en-us/api-reference/class/TeleportService","TemporaryCageMeshProvider":"https://developer.roblox.com/en-us/api-reference/class/TemporaryCageMeshProvider","TemporaryScriptService":"https://developer.roblox.com/en-us/api-reference/class/TemporaryScriptService","TerrainDetail":"https://developer.roblox.com/en-us/api-reference/class/TerrainDetail","TerrainRegion":"https://developer.roblox.com/en-us/api-reference/class/TerrainRegion","TestService":"https://developer.roblox.com/en-us/api-reference/class/TestService","TextBoxService":"https://developer.roblox.com/en-us/api-reference/class/TextBoxService","TextChannel":"https://developer.roblox.com/en-us/api-reference/class/TextChannel","TextChatCommand":"https://developer.roblox.com/en-us/api-reference/class/TextChatCommand","TextChatConfigurations":"https://developer.roblox.com/en-us/api-reference/class/TextChatConfigurations","BubbleChatConfiguration":"https://developer.roblox.com/en-us/api-reference/class/BubbleChatConfiguration","ChatInputBarConfiguration":"https://developer.roblox.com/en-us/api-reference/class/ChatInputBarConfiguration","ChatWindowConfiguration":"https://developer.roblox.com/en-us/api-reference/class/ChatWindowConfiguration","TextChatMessage":"https://developer.roblox.com/en-us/api-reference/class/TextChatMessage","TextChatMessageProperties":"https://developer.roblox.com/en-us/api-reference/class/TextChatMessageProperties","TextChatService":"https://developer.roblox.com/en-us/api-reference/class/TextChatService","TextFilterResult":"https://developer.roblox.com/en-us/api-reference/class/TextFilterResult","TextFilterTranslatedResult":"https://developer.roblox.com/en-us/api-reference/class/TextFilterTranslatedResult","TextService":"https://developer.roblox.com/en-us/api-reference/class/TextService","TextSource":"https://developer.roblox.com/en-us/api-reference/class/TextSource","TextureGenerationMeshHandler":"https://developer.roblox.com/en-us/api-reference/class/TextureGenerationMeshHandler","TextureGenerationService":"https://developer.roblox.com/en-us/api-reference/class/TextureGenerationService","ThirdPartyUserService":"https://developer.roblox.com/en-us/api-reference/class/ThirdPartyUserService","ThreadState":"https://developer.roblox.com/en-us/api-reference/class/ThreadState","TimerService":"https://developer.roblox.com/en-us/api-reference/class/TimerService","ToastNotificationService":"https://developer.roblox.com/en-us/api-reference/class/ToastNotificationService","TouchInputService":"https://developer.roblox.com/en-us/api-reference/class/TouchInputService","TouchTransmitter":"https://developer.roblox.com/en-us/api-reference/class/TouchTransmitter","TracerService":"https://developer.roblox.com/en-us/api-reference/class/TracerService","TrackerLodController":"https://developer.roblox.com/en-us/api-reference/class/TrackerLodController","TrackerStreamAnimation":"https://developer.roblox.com/en-us/api-reference/class/TrackerStreamAnimation","Trail":"https://developer.roblox.com/en-us/api-reference/class/Trail","Translator":"https://developer.roblox.com/en-us/api-reference/class/Translator","TutorialService":"https://developer.roblox.com/en-us/api-reference/class/TutorialService","TweenBase":"https://developer.roblox.com/en-us/api-reference/class/TweenBase","Tween":"https://developer.roblox.com/en-us/api-reference/class/Tween","TweenService":"https://developer.roblox.com/en-us/api-reference/class/TweenService","UGCAvatarService":"https://developer.roblox.com/en-us/api-reference/class/UGCAvatarService","UGCValidationService":"https://developer.roblox.com/en-us/api-reference/class/UGCValidationService","UIBase":"https://developer.roblox.com/en-us/api-reference/class/UIBase","UIComponent":"https://developer.roblox.com/en-us/api-reference/class/UIComponent","UIConstraint":"https://developer.roblox.com/en-us/api-reference/class/UIConstraint","UIAspectRatioConstraint":"https://developer.roblox.com/en-us/api-reference/class/UIAspectRatioConstraint","UISizeConstraint":"https://developer.roblox.com/en-us/api-reference/class/UISizeConstraint","UITextSizeConstraint":"https://developer.roblox.com/en-us/api-reference/class/UITextSizeConstraint","UICorner":"https://developer.roblox.com/en-us/api-reference/class/UICorner","UIFlexItem":"https://developer.roblox.com/en-us/api-reference/class/UIFlexItem","UIGradient":"https://developer.roblox.com/en-us/api-reference/class/UIGradient","UILayout":"https://developer.roblox.com/en-us/api-reference/class/UILayout","UIGridStyleLayout":"https://developer.roblox.com/en-us/api-reference/class/UIGridStyleLayout","UIGridLayout":"https://developer.roblox.com/en-us/api-reference/class/UIGridLayout","UIListLayout":"https://developer.roblox.com/en-us/api-reference/class/UIListLayout","UIPageLayout":"https://developer.roblox.com/en-us/api-reference/class/UIPageLayout","UITableLayout":"https://developer.roblox.com/en-us/api-reference/class/UITableLayout","UIPadding":"https://developer.roblox.com/en-us/api-reference/class/UIPadding","UIScale":"https://developer.roblox.com/en-us/api-reference/class/UIScale","UIStroke":"https://developer.roblox.com/en-us/api-reference/class/UIStroke","UnvalidatedAssetService":"https://developer.roblox.com/en-us/api-reference/class/UnvalidatedAssetService","UserGameSettings":"https://developer.roblox.com/en-us/api-reference/class/UserGameSettings","UserInputService":"https://developer.roblox.com/en-us/api-reference/class/UserInputService","UserNotification":"https://developer.roblox.com/en-us/api-reference/class/UserNotification","UserNotificationPayload":"https://developer.roblox.com/en-us/api-reference/class/UserNotificationPayload","UserNotificationPayloadAnalyticsData":"https://developer.roblox.com/en-us/api-reference/class/UserNotificationPayloadAnalyticsData","UserNotificationPayloadJoinExperience":"https://developer.roblox.com/en-us/api-reference/class/UserNotificationPayloadJoinExperience","UserNotificationPayloadParameterValue":"https://developer.roblox.com/en-us/api-reference/class/UserNotificationPayloadParameterValue","UserService":"https://developer.roblox.com/en-us/api-reference/class/UserService","VRService":"https://developer.roblox.com/en-us/api-reference/class/VRService","VRStatusService":"https://developer.roblox.com/en-us/api-reference/class/VRStatusService","ValueBase":"https://developer.roblox.com/en-us/api-reference/class/ValueBase","BinaryStringValue":"https://developer.roblox.com/en-us/api-reference/class/BinaryStringValue","BoolValue":"https://developer.roblox.com/en-us/api-reference/class/BoolValue","BrickColorValue":"https://developer.roblox.com/en-us/api-reference/class/BrickColorValue","CFrameValue":"https://developer.roblox.com/en-us/api-reference/class/CFrameValue","Color3Value":"https://developer.roblox.com/en-us/api-reference/class/Color3Value","DoubleConstrainedValue":"https://developer.roblox.com/en-us/api-reference/class/DoubleConstrainedValue","IntConstrainedValue":"https://developer.roblox.com/en-us/api-reference/class/IntConstrainedValue","IntValue":"https://developer.roblox.com/en-us/api-reference/class/IntValue","NumberValue":"https://developer.roblox.com/en-us/api-reference/class/NumberValue","ObjectValue":"https://developer.roblox.com/en-us/api-reference/class/ObjectValue","RayValue":"https://developer.roblox.com/en-us/api-reference/class/RayValue","StringValue":"https://developer.roblox.com/en-us/api-reference/class/StringValue","Vector3Value":"https://developer.roblox.com/en-us/api-reference/class/Vector3Value","Vector3Curve":"https://developer.roblox.com/en-us/api-reference/class/Vector3Curve","VersionControlService":"https://developer.roblox.com/en-us/api-reference/class/VersionControlService","VideoCaptureService":"https://developer.roblox.com/en-us/api-reference/class/VideoCaptureService","VideoService":"https://developer.roblox.com/en-us/api-reference/class/VideoService","VirtualInputManager":"https://developer.roblox.com/en-us/api-reference/class/VirtualInputManager","VirtualUser":"https://developer.roblox.com/en-us/api-reference/class/VirtualUser","VisibilityCheckDispatcher":"https://developer.roblox.com/en-us/api-reference/class/VisibilityCheckDispatcher","VisibilityService":"https://developer.roblox.com/en-us/api-reference/class/VisibilityService","Visit":"https://developer.roblox.com/en-us/api-reference/class/Visit","VoiceChatInternal":"https://developer.roblox.com/en-us/api-reference/class/VoiceChatInternal","VoiceChatService":"https://developer.roblox.com/en-us/api-reference/class/VoiceChatService","WeldConstraint":"https://developer.roblox.com/en-us/api-reference/class/WeldConstraint","Wire":"https://developer.roblox.com/en-us/api-reference/class/Wire","AccessModifierType":"https://developer.roblox.com/en-us/api-reference/enum/AccessModifierType","AccessoryType":"https://developer.roblox.com/en-us/api-reference/enum/AccessoryType","ActionType":"https://developer.roblox.com/en-us/api-reference/enum/ActionType","ActuatorRelativeTo":"https://developer.roblox.com/en-us/api-reference/enum/ActuatorRelativeTo","ActuatorType":"https://developer.roblox.com/en-us/api-reference/enum/ActuatorType","AdEventType":"https://developer.roblox.com/en-us/api-reference/enum/AdEventType","AdShape":"https://developer.roblox.com/en-us/api-reference/enum/AdShape","AdTeleportMethod":"https://developer.roblox.com/en-us/api-reference/enum/AdTeleportMethod","AdUnitStatus":"https://developer.roblox.com/en-us/api-reference/enum/AdUnitStatus","AdornCullingMode":"https://developer.roblox.com/en-us/api-reference/enum/AdornCullingMode","AlignType":"https://developer.roblox.com/en-us/api-reference/enum/AlignType","AlphaMode":"https://developer.roblox.com/en-us/api-reference/enum/AlphaMode","AnalyticsEconomyAction":"https://developer.roblox.com/en-us/api-reference/enum/AnalyticsEconomyAction","AnalyticsLogLevel":"https://developer.roblox.com/en-us/api-reference/enum/AnalyticsLogLevel","AnalyticsProgressionStatus":"https://developer.roblox.com/en-us/api-reference/enum/AnalyticsProgressionStatus","AnimationClipFromVideoStatus":"https://developer.roblox.com/en-us/api-reference/enum/AnimationClipFromVideoStatus","AnimationPriority":"https://developer.roblox.com/en-us/api-reference/enum/AnimationPriority","AnimatorRetargetingMode":"https://developer.roblox.com/en-us/api-reference/enum/AnimatorRetargetingMode","AppShellActionType":"https://developer.roblox.com/en-us/api-reference/enum/AppShellActionType","AppShellFeature":"https://developer.roblox.com/en-us/api-reference/enum/AppShellFeature","AppUpdateStatus":"https://developer.roblox.com/en-us/api-reference/enum/AppUpdateStatus","ApplyStrokeMode":"https://developer.roblox.com/en-us/api-reference/enum/ApplyStrokeMode","AspectType":"https://developer.roblox.com/en-us/api-reference/enum/AspectType","AssetCreatorType":"https://developer.roblox.com/en-us/api-reference/enum/AssetCreatorType","AssetFetchStatus":"https://developer.roblox.com/en-us/api-reference/enum/AssetFetchStatus","AssetType":"https://developer.roblox.com/en-us/api-reference/enum/AssetType","AssetTypeVerification":"https://developer.roblox.com/en-us/api-reference/enum/AssetTypeVerification","AudioApiRollout":"https://developer.roblox.com/en-us/api-reference/enum/AudioApiRollout","AudioSubType":"https://developer.roblox.com/en-us/api-reference/enum/AudioSubType","AudioWindowSize":"https://developer.roblox.com/en-us/api-reference/enum/AudioWindowSize","AutoIndentRule":"https://developer.roblox.com/en-us/api-reference/enum/AutoIndentRule","AutomaticSize":"https://developer.roblox.com/en-us/api-reference/enum/AutomaticSize","AvatarAssetType":"https://developer.roblox.com/en-us/api-reference/enum/AvatarAssetType","AvatarChatServiceFeature":"https://developer.roblox.com/en-us/api-reference/enum/AvatarChatServiceFeature","AvatarContextMenuOption":"https://developer.roblox.com/en-us/api-reference/enum/AvatarContextMenuOption","AvatarItemType":"https://developer.roblox.com/en-us/api-reference/enum/AvatarItemType","AvatarJointUpgrade":"https://developer.roblox.com/en-us/api-reference/enum/AvatarJointUpgrade","AvatarPromptResult":"https://developer.roblox.com/en-us/api-reference/enum/AvatarPromptResult","AvatarThumbnailCustomizationType":"https://developer.roblox.com/en-us/api-reference/enum/AvatarThumbnailCustomizationType","AvatarUnificationMode":"https://developer.roblox.com/en-us/api-reference/enum/AvatarUnificationMode","Axis":"https://developer.roblox.com/en-us/api-reference/enum/Axis","BinType":"https://developer.roblox.com/en-us/api-reference/enum/BinType","BodyPart":"https://developer.roblox.com/en-us/api-reference/enum/BodyPart","BodyPartR15":"https://developer.roblox.com/en-us/api-reference/enum/BodyPartR15","BorderMode":"https://developer.roblox.com/en-us/api-reference/enum/BorderMode","BreakReason":"https://developer.roblox.com/en-us/api-reference/enum/BreakReason","BreakpointRemoveReason":"https://developer.roblox.com/en-us/api-reference/enum/BreakpointRemoveReason","BulkMoveMode":"https://developer.roblox.com/en-us/api-reference/enum/BulkMoveMode","BundleType":"https://developer.roblox.com/en-us/api-reference/enum/BundleType","Button":"https://developer.roblox.com/en-us/api-reference/enum/Button","ButtonStyle":"https://developer.roblox.com/en-us/api-reference/enum/ButtonStyle","CageType":"https://developer.roblox.com/en-us/api-reference/enum/CageType","CameraMode":"https://developer.roblox.com/en-us/api-reference/enum/CameraMode","CameraPanMode":"https://developer.roblox.com/en-us/api-reference/enum/CameraPanMode","CameraSpeedAdjustBinding":"https://developer.roblox.com/en-us/api-reference/enum/CameraSpeedAdjustBinding","CameraType":"https://developer.roblox.com/en-us/api-reference/enum/CameraType","CatalogCategoryFilter":"https://developer.roblox.com/en-us/api-reference/enum/CatalogCategoryFilter","CatalogSortAggregation":"https://developer.roblox.com/en-us/api-reference/enum/CatalogSortAggregation","CatalogSortType":"https://developer.roblox.com/en-us/api-reference/enum/CatalogSortType","CellBlock":"https://developer.roblox.com/en-us/api-reference/enum/CellBlock","CellMaterial":"https://developer.roblox.com/en-us/api-reference/enum/CellMaterial","CellOrientation":"https://developer.roblox.com/en-us/api-reference/enum/CellOrientation","CenterDialogType":"https://developer.roblox.com/en-us/api-reference/enum/CenterDialogType","CharacterControlMode":"https://developer.roblox.com/en-us/api-reference/enum/CharacterControlMode","ChatCallbackType":"https://developer.roblox.com/en-us/api-reference/enum/ChatCallbackType","ChatColor":"https://developer.roblox.com/en-us/api-reference/enum/ChatColor","ChatMode":"https://developer.roblox.com/en-us/api-reference/enum/ChatMode","ChatPrivacyMode":"https://developer.roblox.com/en-us/api-reference/enum/ChatPrivacyMode","ChatStyle":"https://developer.roblox.com/en-us/api-reference/enum/ChatStyle","ChatVersion":"https://developer.roblox.com/en-us/api-reference/enum/ChatVersion","ClientAnimatorThrottlingMode":"https://developer.roblox.com/en-us/api-reference/enum/ClientAnimatorThrottlingMode","CollaboratorStatus":"https://developer.roblox.com/en-us/api-reference/enum/CollaboratorStatus","CollisionFidelity":"https://developer.roblox.com/en-us/api-reference/enum/CollisionFidelity","CommandPermission":"https://developer.roblox.com/en-us/api-reference/enum/CommandPermission","CompileTarget":"https://developer.roblox.com/en-us/api-reference/enum/CompileTarget","CompletionItemKind":"https://developer.roblox.com/en-us/api-reference/enum/CompletionItemKind","CompletionItemTag":"https://developer.roblox.com/en-us/api-reference/enum/CompletionItemTag","CompletionTriggerKind":"https://developer.roblox.com/en-us/api-reference/enum/CompletionTriggerKind","ComputerCameraMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/ComputerCameraMovementMode","ComputerMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/ComputerMovementMode","ConnectionError":"https://developer.roblox.com/en-us/api-reference/enum/ConnectionError","ConnectionState":"https://developer.roblox.com/en-us/api-reference/enum/ConnectionState","ContextActionPriority":"https://developer.roblox.com/en-us/api-reference/enum/ContextActionPriority","ContextActionResult":"https://developer.roblox.com/en-us/api-reference/enum/ContextActionResult","ControlMode":"https://developer.roblox.com/en-us/api-reference/enum/ControlMode","CoreGuiType":"https://developer.roblox.com/en-us/api-reference/enum/CoreGuiType","CreateOutfitFailure":"https://developer.roblox.com/en-us/api-reference/enum/CreateOutfitFailure","CreatorType":"https://developer.roblox.com/en-us/api-reference/enum/CreatorType","CreatorTypeFilter":"https://developer.roblox.com/en-us/api-reference/enum/CreatorTypeFilter","CurrencyType":"https://developer.roblox.com/en-us/api-reference/enum/CurrencyType","CustomCameraMode":"https://developer.roblox.com/en-us/api-reference/enum/CustomCameraMode","DataStoreRequestType":"https://developer.roblox.com/en-us/api-reference/enum/DataStoreRequestType","DeathStyle":"https://developer.roblox.com/en-us/api-reference/enum/DeathStyle","DebuggerEndReason":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerEndReason","DebuggerExceptionBreakMode":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerExceptionBreakMode","DebuggerFrameType":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerFrameType","DebuggerPauseReason":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerPauseReason","DebuggerStatus":"https://developer.roblox.com/en-us/api-reference/enum/DebuggerStatus","DevCameraOcclusionMode":"https://developer.roblox.com/en-us/api-reference/enum/DevCameraOcclusionMode","DevComputerCameraMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DevComputerCameraMovementMode","DevComputerMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DevComputerMovementMode","DevTouchCameraMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DevTouchCameraMovementMode","DevTouchMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DevTouchMovementMode","DeveloperMemoryTag":"https://developer.roblox.com/en-us/api-reference/enum/DeveloperMemoryTag","DeviceType":"https://developer.roblox.com/en-us/api-reference/enum/DeviceType","DialogBehaviorType":"https://developer.roblox.com/en-us/api-reference/enum/DialogBehaviorType","DialogPurpose":"https://developer.roblox.com/en-us/api-reference/enum/DialogPurpose","DialogTone":"https://developer.roblox.com/en-us/api-reference/enum/DialogTone","DominantAxis":"https://developer.roblox.com/en-us/api-reference/enum/DominantAxis","DraftStatusCode":"https://developer.roblox.com/en-us/api-reference/enum/DraftStatusCode","DragDetectorDragStyle":"https://developer.roblox.com/en-us/api-reference/enum/DragDetectorDragStyle","DragDetectorResponseStyle":"https://developer.roblox.com/en-us/api-reference/enum/DragDetectorResponseStyle","DraggerCoordinateSpace":"https://developer.roblox.com/en-us/api-reference/enum/DraggerCoordinateSpace","DraggerMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/DraggerMovementMode","EasingDirection":"https://developer.roblox.com/en-us/api-reference/enum/EasingDirection","EasingStyle":"https://developer.roblox.com/en-us/api-reference/enum/EasingStyle","EditorLiveScripting":"https://developer.roblox.com/en-us/api-reference/enum/EditorLiveScripting","ElasticBehavior":"https://developer.roblox.com/en-us/api-reference/enum/ElasticBehavior","EnviromentalPhysicsThrottle":"https://developer.roblox.com/en-us/api-reference/enum/EnviromentalPhysicsThrottle","ExperienceAuthScope":"https://developer.roblox.com/en-us/api-reference/enum/ExperienceAuthScope","ExplosionType":"https://developer.roblox.com/en-us/api-reference/enum/ExplosionType","FACSDataLod":"https://developer.roblox.com/en-us/api-reference/enum/FACSDataLod","FacialAnimationStreamingState":"https://developer.roblox.com/en-us/api-reference/enum/FacialAnimationStreamingState","FieldOfViewMode":"https://developer.roblox.com/en-us/api-reference/enum/FieldOfViewMode","FillDirection":"https://developer.roblox.com/en-us/api-reference/enum/FillDirection","FilterResult":"https://developer.roblox.com/en-us/api-reference/enum/FilterResult","FinishRecordingOperation":"https://developer.roblox.com/en-us/api-reference/enum/FinishRecordingOperation","FluidFidelity":"https://developer.roblox.com/en-us/api-reference/enum/FluidFidelity","FluidForces":"https://developer.roblox.com/en-us/api-reference/enum/FluidForces","Font":"https://developer.roblox.com/en-us/api-reference/enum/Font","FontSize":"https://developer.roblox.com/en-us/api-reference/enum/FontSize","FontStyle":"https://developer.roblox.com/en-us/api-reference/enum/FontStyle","FontWeight":"https://developer.roblox.com/en-us/api-reference/enum/FontWeight","ForceLimitMode":"https://developer.roblox.com/en-us/api-reference/enum/ForceLimitMode","FormFactor":"https://developer.roblox.com/en-us/api-reference/enum/FormFactor","FrameStyle":"https://developer.roblox.com/en-us/api-reference/enum/FrameStyle","FramerateManagerMode":"https://developer.roblox.com/en-us/api-reference/enum/FramerateManagerMode","FriendRequestEvent":"https://developer.roblox.com/en-us/api-reference/enum/FriendRequestEvent","FriendStatus":"https://developer.roblox.com/en-us/api-reference/enum/FriendStatus","FunctionalTestResult":"https://developer.roblox.com/en-us/api-reference/enum/FunctionalTestResult","GameAvatarType":"https://developer.roblox.com/en-us/api-reference/enum/GameAvatarType","GearGenreSetting":"https://developer.roblox.com/en-us/api-reference/enum/GearGenreSetting","GearType":"https://developer.roblox.com/en-us/api-reference/enum/GearType","Genre":"https://developer.roblox.com/en-us/api-reference/enum/Genre","GraphicsMode":"https://developer.roblox.com/en-us/api-reference/enum/GraphicsMode","GuiState":"https://developer.roblox.com/en-us/api-reference/enum/GuiState","GuiType":"https://developer.roblox.com/en-us/api-reference/enum/GuiType","HandlesStyle":"https://developer.roblox.com/en-us/api-reference/enum/HandlesStyle","HighlightDepthMode":"https://developer.roblox.com/en-us/api-reference/enum/HighlightDepthMode","HorizontalAlignment":"https://developer.roblox.com/en-us/api-reference/enum/HorizontalAlignment","HoverAnimateSpeed":"https://developer.roblox.com/en-us/api-reference/enum/HoverAnimateSpeed","HttpCachePolicy":"https://developer.roblox.com/en-us/api-reference/enum/HttpCachePolicy","HttpCompression":"https://developer.roblox.com/en-us/api-reference/enum/HttpCompression","HttpContentType":"https://developer.roblox.com/en-us/api-reference/enum/HttpContentType","HttpError":"https://developer.roblox.com/en-us/api-reference/enum/HttpError","HttpRequestType":"https://developer.roblox.com/en-us/api-reference/enum/HttpRequestType","HumanoidCollisionType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidCollisionType","HumanoidDisplayDistanceType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidDisplayDistanceType","HumanoidHealthDisplayType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidHealthDisplayType","HumanoidRigType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidRigType","HumanoidStateType":"https://developer.roblox.com/en-us/api-reference/enum/HumanoidStateType","IKCollisionsMode":"https://developer.roblox.com/en-us/api-reference/enum/IKCollisionsMode","IKControlConstraintSupport":"https://developer.roblox.com/en-us/api-reference/enum/IKControlConstraintSupport","IKControlType":"https://developer.roblox.com/en-us/api-reference/enum/IKControlType","IXPLoadingStatus":"https://developer.roblox.com/en-us/api-reference/enum/IXPLoadingStatus","ImageCombineType":"https://developer.roblox.com/en-us/api-reference/enum/ImageCombineType","InOut":"https://developer.roblox.com/en-us/api-reference/enum/InOut","InfoType":"https://developer.roblox.com/en-us/api-reference/enum/InfoType","InitialDockState":"https://developer.roblox.com/en-us/api-reference/enum/InitialDockState","InputType":"https://developer.roblox.com/en-us/api-reference/enum/InputType","InterpolationThrottlingMode":"https://developer.roblox.com/en-us/api-reference/enum/InterpolationThrottlingMode","InviteState":"https://developer.roblox.com/en-us/api-reference/enum/InviteState","ItemLineAlignment":"https://developer.roblox.com/en-us/api-reference/enum/ItemLineAlignment","JointCreationMode":"https://developer.roblox.com/en-us/api-reference/enum/JointCreationMode","KeyCode":"https://developer.roblox.com/en-us/api-reference/enum/KeyCode","KeyInterpolationMode":"https://developer.roblox.com/en-us/api-reference/enum/KeyInterpolationMode","KeywordFilterType":"https://developer.roblox.com/en-us/api-reference/enum/KeywordFilterType","Language":"https://developer.roblox.com/en-us/api-reference/enum/Language","LeftRight":"https://developer.roblox.com/en-us/api-reference/enum/LeftRight","Limb":"https://developer.roblox.com/en-us/api-reference/enum/Limb","LineJoinMode":"https://developer.roblox.com/en-us/api-reference/enum/LineJoinMode","ListDisplayMode":"https://developer.roblox.com/en-us/api-reference/enum/ListDisplayMode","ListenerType":"https://developer.roblox.com/en-us/api-reference/enum/ListenerType","LiveEditingAtomicUpdateResponse":"https://developer.roblox.com/en-us/api-reference/enum/LiveEditingAtomicUpdateResponse","LiveEditingBroadcastMessageType":"https://developer.roblox.com/en-us/api-reference/enum/LiveEditingBroadcastMessageType","LoadCharacterLayeredClothing":"https://developer.roblox.com/en-us/api-reference/enum/LoadCharacterLayeredClothing","LoadDynamicHeads":"https://developer.roblox.com/en-us/api-reference/enum/LoadDynamicHeads","MarkupKind":"https://developer.roblox.com/en-us/api-reference/enum/MarkupKind","Material":"https://developer.roblox.com/en-us/api-reference/enum/Material","MaterialPattern":"https://developer.roblox.com/en-us/api-reference/enum/MaterialPattern","MembershipType":"https://developer.roblox.com/en-us/api-reference/enum/MembershipType","MeshPartDetailLevel":"https://developer.roblox.com/en-us/api-reference/enum/MeshPartDetailLevel","MeshPartHeadsAndAccessories":"https://developer.roblox.com/en-us/api-reference/enum/MeshPartHeadsAndAccessories","MeshScaleUnit":"https://developer.roblox.com/en-us/api-reference/enum/MeshScaleUnit","MeshType":"https://developer.roblox.com/en-us/api-reference/enum/MeshType","MessageType":"https://developer.roblox.com/en-us/api-reference/enum/MessageType","ModelLevelOfDetail":"https://developer.roblox.com/en-us/api-reference/enum/ModelLevelOfDetail","ModelStreamingBehavior":"https://developer.roblox.com/en-us/api-reference/enum/ModelStreamingBehavior","ModelStreamingMode":"https://developer.roblox.com/en-us/api-reference/enum/ModelStreamingMode","ModerationStatus":"https://developer.roblox.com/en-us/api-reference/enum/ModerationStatus","ModifierKey":"https://developer.roblox.com/en-us/api-reference/enum/ModifierKey","MouseBehavior":"https://developer.roblox.com/en-us/api-reference/enum/MouseBehavior","MoveState":"https://developer.roblox.com/en-us/api-reference/enum/MoveState","MuteState":"https://developer.roblox.com/en-us/api-reference/enum/MuteState","NameOcclusion":"https://developer.roblox.com/en-us/api-reference/enum/NameOcclusion","NetworkOwnership":"https://developer.roblox.com/en-us/api-reference/enum/NetworkOwnership","NetworkStatus":"https://developer.roblox.com/en-us/api-reference/enum/NetworkStatus","NormalId":"https://developer.roblox.com/en-us/api-reference/enum/NormalId","OperationType":"https://developer.roblox.com/en-us/api-reference/enum/OperationType","OrientationAlignmentMode":"https://developer.roblox.com/en-us/api-reference/enum/OrientationAlignmentMode","OutfitSource":"https://developer.roblox.com/en-us/api-reference/enum/OutfitSource","OutfitType":"https://developer.roblox.com/en-us/api-reference/enum/OutfitType","OutputLayoutMode":"https://developer.roblox.com/en-us/api-reference/enum/OutputLayoutMode","OverrideMouseIconBehavior":"https://developer.roblox.com/en-us/api-reference/enum/OverrideMouseIconBehavior","PackagePermission":"https://developer.roblox.com/en-us/api-reference/enum/PackagePermission","PartType":"https://developer.roblox.com/en-us/api-reference/enum/PartType","ParticleEmitterShape":"https://developer.roblox.com/en-us/api-reference/enum/ParticleEmitterShape","ParticleEmitterShapeInOut":"https://developer.roblox.com/en-us/api-reference/enum/ParticleEmitterShapeInOut","ParticleEmitterShapeStyle":"https://developer.roblox.com/en-us/api-reference/enum/ParticleEmitterShapeStyle","ParticleFlipbookLayout":"https://developer.roblox.com/en-us/api-reference/enum/ParticleFlipbookLayout","ParticleFlipbookMode":"https://developer.roblox.com/en-us/api-reference/enum/ParticleFlipbookMode","ParticleFlipbookTextureCompatible":"https://developer.roblox.com/en-us/api-reference/enum/ParticleFlipbookTextureCompatible","ParticleOrientation":"https://developer.roblox.com/en-us/api-reference/enum/ParticleOrientation","PathStatus":"https://developer.roblox.com/en-us/api-reference/enum/PathStatus","PathWaypointAction":"https://developer.roblox.com/en-us/api-reference/enum/PathWaypointAction","PermissionLevelShown":"https://developer.roblox.com/en-us/api-reference/enum/PermissionLevelShown","PhysicsSimulationRate":"https://developer.roblox.com/en-us/api-reference/enum/PhysicsSimulationRate","PhysicsSteppingMethod":"https://developer.roblox.com/en-us/api-reference/enum/PhysicsSteppingMethod","PlaybackState":"https://developer.roblox.com/en-us/api-reference/enum/PlaybackState","PlayerActions":"https://developer.roblox.com/en-us/api-reference/enum/PlayerActions","PlayerCharacterDestroyBehavior":"https://developer.roblox.com/en-us/api-reference/enum/PlayerCharacterDestroyBehavior","PlayerChatType":"https://developer.roblox.com/en-us/api-reference/enum/PlayerChatType","PoseEasingDirection":"https://developer.roblox.com/en-us/api-reference/enum/PoseEasingDirection","PoseEasingStyle":"https://developer.roblox.com/en-us/api-reference/enum/PoseEasingStyle","PositionAlignmentMode":"https://developer.roblox.com/en-us/api-reference/enum/PositionAlignmentMode","PrimalPhysicsSolver":"https://developer.roblox.com/en-us/api-reference/enum/PrimalPhysicsSolver","PrimitiveType":"https://developer.roblox.com/en-us/api-reference/enum/PrimitiveType","PrivilegeType":"https://developer.roblox.com/en-us/api-reference/enum/PrivilegeType","ProductLocationRestriction":"https://developer.roblox.com/en-us/api-reference/enum/ProductLocationRestriction","ProductPurchaseDecision":"https://developer.roblox.com/en-us/api-reference/enum/ProductPurchaseDecision","PromptCreateAssetResult":"https://developer.roblox.com/en-us/api-reference/enum/PromptCreateAssetResult","PromptCreateAvatarResult":"https://developer.roblox.com/en-us/api-reference/enum/PromptCreateAvatarResult","PromptPublishAssetResult":"https://developer.roblox.com/en-us/api-reference/enum/PromptPublishAssetResult","PropertyStatus":"https://developer.roblox.com/en-us/api-reference/enum/PropertyStatus","ProximityPromptExclusivity":"https://developer.roblox.com/en-us/api-reference/enum/ProximityPromptExclusivity","ProximityPromptInputType":"https://developer.roblox.com/en-us/api-reference/enum/ProximityPromptInputType","ProximityPromptStyle":"https://developer.roblox.com/en-us/api-reference/enum/ProximityPromptStyle","QualityLevel":"https://developer.roblox.com/en-us/api-reference/enum/QualityLevel","R15CollisionType":"https://developer.roblox.com/en-us/api-reference/enum/R15CollisionType","RaycastFilterType":"https://developer.roblox.com/en-us/api-reference/enum/RaycastFilterType","RejectCharacterDeletions":"https://developer.roblox.com/en-us/api-reference/enum/RejectCharacterDeletions","RenderFidelity":"https://developer.roblox.com/en-us/api-reference/enum/RenderFidelity","RenderPriority":"https://developer.roblox.com/en-us/api-reference/enum/RenderPriority","RenderingTestComparisonMethod":"https://developer.roblox.com/en-us/api-reference/enum/RenderingTestComparisonMethod","ReplicateInstanceDestroySetting":"https://developer.roblox.com/en-us/api-reference/enum/ReplicateInstanceDestroySetting","ResamplerMode":"https://developer.roblox.com/en-us/api-reference/enum/ResamplerMode","ReservedHighlightId":"https://developer.roblox.com/en-us/api-reference/enum/ReservedHighlightId","RestPose":"https://developer.roblox.com/en-us/api-reference/enum/RestPose","ReturnKeyType":"https://developer.roblox.com/en-us/api-reference/enum/ReturnKeyType","ReverbType":"https://developer.roblox.com/en-us/api-reference/enum/ReverbType","RibbonTool":"https://developer.roblox.com/en-us/api-reference/enum/RibbonTool","RigScale":"https://developer.roblox.com/en-us/api-reference/enum/RigScale","RigType":"https://developer.roblox.com/en-us/api-reference/enum/RigType","RollOffMode":"https://developer.roblox.com/en-us/api-reference/enum/RollOffMode","RotationOrder":"https://developer.roblox.com/en-us/api-reference/enum/RotationOrder","RotationType":"https://developer.roblox.com/en-us/api-reference/enum/RotationType","RtlTextSupport":"https://developer.roblox.com/en-us/api-reference/enum/RtlTextSupport","RunContext":"https://developer.roblox.com/en-us/api-reference/enum/RunContext","RuntimeUndoBehavior":"https://developer.roblox.com/en-us/api-reference/enum/RuntimeUndoBehavior","SafeAreaCompatibility":"https://developer.roblox.com/en-us/api-reference/enum/SafeAreaCompatibility","SalesTypeFilter":"https://developer.roblox.com/en-us/api-reference/enum/SalesTypeFilter","SaveAvatarThumbnailCustomizationFailure":"https://developer.roblox.com/en-us/api-reference/enum/SaveAvatarThumbnailCustomizationFailure","SaveFilter":"https://developer.roblox.com/en-us/api-reference/enum/SaveFilter","SavedQualitySetting":"https://developer.roblox.com/en-us/api-reference/enum/SavedQualitySetting","ScaleType":"https://developer.roblox.com/en-us/api-reference/enum/ScaleType","ScopeCheckResult":"https://developer.roblox.com/en-us/api-reference/enum/ScopeCheckResult","ScreenInsets":"https://developer.roblox.com/en-us/api-reference/enum/ScreenInsets","ScreenOrientation":"https://developer.roblox.com/en-us/api-reference/enum/ScreenOrientation","ScrollBarInset":"https://developer.roblox.com/en-us/api-reference/enum/ScrollBarInset","ScrollingDirection":"https://developer.roblox.com/en-us/api-reference/enum/ScrollingDirection","SelectionBehavior":"https://developer.roblox.com/en-us/api-reference/enum/SelectionBehavior","SelectionRenderMode":"https://developer.roblox.com/en-us/api-reference/enum/SelectionRenderMode","SelfViewPosition":"https://developer.roblox.com/en-us/api-reference/enum/SelfViewPosition","SensorMode":"https://developer.roblox.com/en-us/api-reference/enum/SensorMode","SensorUpdateType":"https://developer.roblox.com/en-us/api-reference/enum/SensorUpdateType","ServerAudioBehavior":"https://developer.roblox.com/en-us/api-reference/enum/ServerAudioBehavior","ServerLiveEditingMode":"https://developer.roblox.com/en-us/api-reference/enum/ServerLiveEditingMode","ServiceVisibility":"https://developer.roblox.com/en-us/api-reference/enum/ServiceVisibility","Severity":"https://developer.roblox.com/en-us/api-reference/enum/Severity","SignalBehavior":"https://developer.roblox.com/en-us/api-reference/enum/SignalBehavior","SizeConstraint":"https://developer.roblox.com/en-us/api-reference/enum/SizeConstraint","SolverConvergenceMetricType":"https://developer.roblox.com/en-us/api-reference/enum/SolverConvergenceMetricType","SolverConvergenceVisualizationMode":"https://developer.roblox.com/en-us/api-reference/enum/SolverConvergenceVisualizationMode","SortDirection":"https://developer.roblox.com/en-us/api-reference/enum/SortDirection","SortOrder":"https://developer.roblox.com/en-us/api-reference/enum/SortOrder","SpecialKey":"https://developer.roblox.com/en-us/api-reference/enum/SpecialKey","StartCorner":"https://developer.roblox.com/en-us/api-reference/enum/StartCorner","StreamOutBehavior":"https://developer.roblox.com/en-us/api-reference/enum/StreamOutBehavior","StreamingIntegrityMode":"https://developer.roblox.com/en-us/api-reference/enum/StreamingIntegrityMode","StreamingPauseMode":"https://developer.roblox.com/en-us/api-reference/enum/StreamingPauseMode","StudioCloseMode":"https://developer.roblox.com/en-us/api-reference/enum/StudioCloseMode","StudioDataModelType":"https://developer.roblox.com/en-us/api-reference/enum/StudioDataModelType","StudioPlaceUpdateFailureReason":"https://developer.roblox.com/en-us/api-reference/enum/StudioPlaceUpdateFailureReason","StudioScriptEditorColorCategories":"https://developer.roblox.com/en-us/api-reference/enum/StudioScriptEditorColorCategories","StudioScriptEditorColorPresets":"https://developer.roblox.com/en-us/api-reference/enum/StudioScriptEditorColorPresets","StudioStyleGuideColor":"https://developer.roblox.com/en-us/api-reference/enum/StudioStyleGuideColor","StudioStyleGuideModifier":"https://developer.roblox.com/en-us/api-reference/enum/StudioStyleGuideModifier","Style":"https://developer.roblox.com/en-us/api-reference/enum/Style","SubscriptionPaymentStatus":"https://developer.roblox.com/en-us/api-reference/enum/SubscriptionPaymentStatus","SubscriptionPeriod":"https://developer.roblox.com/en-us/api-reference/enum/SubscriptionPeriod","SurfaceConstraint":"https://developer.roblox.com/en-us/api-reference/enum/SurfaceConstraint","SurfaceGuiShape":"https://developer.roblox.com/en-us/api-reference/enum/SurfaceGuiShape","SurfaceGuiSizingMode":"https://developer.roblox.com/en-us/api-reference/enum/SurfaceGuiSizingMode","SurfaceType":"https://developer.roblox.com/en-us/api-reference/enum/SurfaceType","SwipeDirection":"https://developer.roblox.com/en-us/api-reference/enum/SwipeDirection","TableMajorAxis":"https://developer.roblox.com/en-us/api-reference/enum/TableMajorAxis","Technology":"https://developer.roblox.com/en-us/api-reference/enum/Technology","TeleportMethod":"https://developer.roblox.com/en-us/api-reference/enum/TeleportMethod","TeleportResult":"https://developer.roblox.com/en-us/api-reference/enum/TeleportResult","TeleportState":"https://developer.roblox.com/en-us/api-reference/enum/TeleportState","TeleportType":"https://developer.roblox.com/en-us/api-reference/enum/TeleportType","TerrainAcquisitionMethod":"https://developer.roblox.com/en-us/api-reference/enum/TerrainAcquisitionMethod","TerrainFace":"https://developer.roblox.com/en-us/api-reference/enum/TerrainFace","TextChatMessageStatus":"https://developer.roblox.com/en-us/api-reference/enum/TextChatMessageStatus","TextDirection":"https://developer.roblox.com/en-us/api-reference/enum/TextDirection","TextFilterContext":"https://developer.roblox.com/en-us/api-reference/enum/TextFilterContext","TextInputType":"https://developer.roblox.com/en-us/api-reference/enum/TextInputType","TextTruncate":"https://developer.roblox.com/en-us/api-reference/enum/TextTruncate","TextXAlignment":"https://developer.roblox.com/en-us/api-reference/enum/TextXAlignment","TextYAlignment":"https://developer.roblox.com/en-us/api-reference/enum/TextYAlignment","TextureGenerationMeshHandlerUnwrapMode":"https://developer.roblox.com/en-us/api-reference/enum/TextureGenerationMeshHandlerUnwrapMode","TextureMode":"https://developer.roblox.com/en-us/api-reference/enum/TextureMode","TextureQueryType":"https://developer.roblox.com/en-us/api-reference/enum/TextureQueryType","ThreadPoolConfig":"https://developer.roblox.com/en-us/api-reference/enum/ThreadPoolConfig","ThrottlingPriority":"https://developer.roblox.com/en-us/api-reference/enum/ThrottlingPriority","ThumbnailSize":"https://developer.roblox.com/en-us/api-reference/enum/ThumbnailSize","ThumbnailType":"https://developer.roblox.com/en-us/api-reference/enum/ThumbnailType","TickCountSampleMethod":"https://developer.roblox.com/en-us/api-reference/enum/TickCountSampleMethod","TopBottom":"https://developer.roblox.com/en-us/api-reference/enum/TopBottom","TouchCameraMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/TouchCameraMovementMode","TouchMovementMode":"https://developer.roblox.com/en-us/api-reference/enum/TouchMovementMode","TrackerError":"https://developer.roblox.com/en-us/api-reference/enum/TrackerError","TrackerExtrapolationFlagMode":"https://developer.roblox.com/en-us/api-reference/enum/TrackerExtrapolationFlagMode","TrackerFaceTrackingStatus":"https://developer.roblox.com/en-us/api-reference/enum/TrackerFaceTrackingStatus","TrackerLodFlagMode":"https://developer.roblox.com/en-us/api-reference/enum/TrackerLodFlagMode","TrackerLodValueMode":"https://developer.roblox.com/en-us/api-reference/enum/TrackerLodValueMode","TrackerMode":"https://developer.roblox.com/en-us/api-reference/enum/TrackerMode","TrackerPromptEvent":"https://developer.roblox.com/en-us/api-reference/enum/TrackerPromptEvent","TriStateBoolean":"https://developer.roblox.com/en-us/api-reference/enum/TriStateBoolean","TweenStatus":"https://developer.roblox.com/en-us/api-reference/enum/TweenStatus","UIFlexAlignment":"https://developer.roblox.com/en-us/api-reference/enum/UIFlexAlignment","UIFlexMode":"https://developer.roblox.com/en-us/api-reference/enum/UIFlexMode","UITheme":"https://developer.roblox.com/en-us/api-reference/enum/UITheme","UiMessageType":"https://developer.roblox.com/en-us/api-reference/enum/UiMessageType","UsageContext":"https://developer.roblox.com/en-us/api-reference/enum/UsageContext","UserCFrame":"https://developer.roblox.com/en-us/api-reference/enum/UserCFrame","UserInputState":"https://developer.roblox.com/en-us/api-reference/enum/UserInputState","UserInputType":"https://developer.roblox.com/en-us/api-reference/enum/UserInputType","VRComfortSetting":"https://developer.roblox.com/en-us/api-reference/enum/VRComfortSetting","VRSafetyBubbleMode":"https://developer.roblox.com/en-us/api-reference/enum/VRSafetyBubbleMode","VRScaling":"https://developer.roblox.com/en-us/api-reference/enum/VRScaling","VRSessionState":"https://developer.roblox.com/en-us/api-reference/enum/VRSessionState","VRTouchpad":"https://developer.roblox.com/en-us/api-reference/enum/VRTouchpad","VRTouchpadMode":"https://developer.roblox.com/en-us/api-reference/enum/VRTouchpadMode","VelocityConstraintMode":"https://developer.roblox.com/en-us/api-reference/enum/VelocityConstraintMode","VerticalAlignment":"https://developer.roblox.com/en-us/api-reference/enum/VerticalAlignment","VerticalScrollBarPosition":"https://developer.roblox.com/en-us/api-reference/enum/VerticalScrollBarPosition","VibrationMotor":"https://developer.roblox.com/en-us/api-reference/enum/VibrationMotor","ViewMode":"https://developer.roblox.com/en-us/api-reference/enum/ViewMode","VirtualCursorMode":"https://developer.roblox.com/en-us/api-reference/enum/VirtualCursorMode","VirtualInputMode":"https://developer.roblox.com/en-us/api-reference/enum/VirtualInputMode","VoiceChatState":"https://developer.roblox.com/en-us/api-reference/enum/VoiceChatState","VoiceControlPath":"https://developer.roblox.com/en-us/api-reference/enum/VoiceControlPath","VolumetricAudio":"https://developer.roblox.com/en-us/api-reference/enum/VolumetricAudio","WaterDirection":"https://developer.roblox.com/en-us/api-reference/enum/WaterDirection","WaterForce":"https://developer.roblox.com/en-us/api-reference/enum/WaterForce","WeldConstraintPreserve":"https://developer.roblox.com/en-us/api-reference/enum/WeldConstraintPreserve","WrapLayerAutoSkin":"https://developer.roblox.com/en-us/api-reference/enum/WrapLayerAutoSkin","WrapLayerDebugMode":"https://developer.roblox.com/en-us/api-reference/enum/WrapLayerDebugMode","WrapTargetDebugMode":"https://developer.roblox.com/en-us/api-reference/enum/WrapTargetDebugMode","ZIndexBehavior":"https://developer.roblox.com/en-us/api-reference/enum/ZIndexBehavior","Axes":"https://developer.roblox.com/en-us/api-reference/datatype/Axes","BrickColor":"https://developer.roblox.com/en-us/api-reference/datatype/BrickColor","CFrame":"https://developer.roblox.com/en-us/api-reference/datatype/CFrame","Color3":"https://developer.roblox.com/en-us/api-reference/datatype/Color3","ColorSequence":"https://developer.roblox.com/en-us/api-reference/datatype/ColorSequence","ColorSequenceKeypoint":"https://developer.roblox.com/en-us/api-reference/datatype/ColorSequenceKeypoint","DockWidgetPluginGuiInfo":"https://developer.roblox.com/en-us/api-reference/datatype/DockWidgetPluginGuiInfo","Enum":"https://developer.roblox.com/en-us/api-reference/datatype/Enum","EnumItem":"https://developer.roblox.com/en-us/api-reference/datatype/EnumItem","Enums":"https://developer.roblox.com/en-us/api-reference/datatype/Enums","Faces":"https://developer.roblox.com/en-us/api-reference/datatype/Faces","NumberRange":"https://developer.roblox.com/en-us/api-reference/datatype/NumberRange","NumberSequence":"https://developer.roblox.com/en-us/api-reference/datatype/NumberSequence","NumberSequenceKeypoint":"https://developer.roblox.com/en-us/api-reference/datatype/NumberSequenceKeypoint","PathWaypoint":"https://developer.roblox.com/en-us/api-reference/datatype/PathWaypoint","PhysicalProperties":"https://developer.roblox.com/en-us/api-reference/datatype/PhysicalProperties","Random":"https://developer.roblox.com/en-us/api-reference/datatype/Random","Ray":"https://developer.roblox.com/en-us/api-reference/datatype/Ray","RBXScriptConnection":"https://developer.roblox.com/en-us/api-reference/datatype/RBXScriptConnection","RBXScriptSignal":"https://developer.roblox.com/en-us/api-reference/datatype/RBXScriptSignal","Rect":"https://developer.roblox.com/en-us/api-reference/datatype/Rect","Region3":"https://developer.roblox.com/en-us/api-reference/datatype/Region3","Region3int16":"https://developer.roblox.com/en-us/api-reference/datatype/Region3int16","TweenInfo":"https://developer.roblox.com/en-us/api-reference/datatype/TweenInfo","UDim":"https://developer.roblox.com/en-us/api-reference/datatype/UDim","UDim2":"https://developer.roblox.com/en-us/api-reference/datatype/UDim2","Vector2":"https://developer.roblox.com/en-us/api-reference/datatype/Vector2","Vector2int16":"https://developer.roblox.com/en-us/api-reference/datatype/Vector2int16","Vector3":"https://developer.roblox.com/en-us/api-reference/datatype/Vector3","Vector3int16":"https://developer.roblox.com/en-us/api-reference/datatype/Vector3int16","KnitClient":"/Knit/api/KnitClient","KnitServer":"/Knit/api/KnitServer","Middleware":"/Knit/api/KnitServer#Middleware","ClientMiddlewareFn":"/Knit/api/KnitClient#ClientMiddlewareFn","ClientMiddleware":"/Knit/api/KnitClient#ClientMiddleware","PerServiceMiddleware":"/Knit/api/KnitClient#PerServiceMiddleware","ControllerDef":"/Knit/api/KnitClient#ControllerDef","Service":"/Knit/api/KnitServer#Service","KnitOptions":"/Knit/api/KnitServer#KnitOptions","ServerMiddlewareFn":"/Knit/api/KnitServer#ServerMiddlewareFn","ServerMiddleware":"/Knit/api/KnitServer#ServerMiddleware","ServiceDef":"/Knit/api/KnitServer#ServiceDef","ServiceClient":"/Knit/api/KnitServer#ServiceClient"}')}}]); \ No newline at end of file diff --git a/assets/js/da7e18d7.210a448f.js b/assets/js/da7e18d7.918d6a36.js similarity index 99% rename from assets/js/da7e18d7.210a448f.js rename to assets/js/da7e18d7.918d6a36.js index d27809ec..dc5bf81b 100644 --- a/assets/js/da7e18d7.210a448f.js +++ b/assets/js/da7e18d7.918d6a36.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[391],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(n),d=a,h=u["".concat(s,".").concat(d)]||u[d]||m[d]||o;return n?r.createElement(h,i(i({ref:t},p),{},{components:n})):r.createElement(h,i({ref:t},p))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={sidebar_position:2},i="Getting Started",l={unversionedId:"gettingstarted",id:"gettingstarted",title:"Getting Started",description:"Tutorial Videos",source:"@site/docs/gettingstarted.md",sourceDirName:".",slug:"/gettingstarted",permalink:"/Knit/docs/gettingstarted",draft:!1,editUrl:"https://github.com/Sleitnick/Knit/edit/master/docs/gettingstarted.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"defaultSidebar",previous:{title:"About",permalink:"/Knit/docs/intro"},next:{title:"Services",permalink:"/Knit/docs/services"}},s={},c=[{value:"Tutorial Videos",id:"tutorial-videos",level:2},{value:"Install",id:"install",level:2},{value:"Basic Usage",id:"basic-usage",level:2},{value:"A Simple Service",id:"a-simple-service",level:3}],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"getting-started"},"Getting Started"),(0,a.kt)("h2",{id:"tutorial-videos"},"Tutorial Videos"),(0,a.kt)("p",null,"Knit can be used via two workflows: Roblox Studio and externally with Rojo and Wally. To help explain how Knit is used through both workflows, check out the tutorial videos for each:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://youtu.be/0Ty2ojfdOnA"},"Knit Tutorial for Studio")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://youtu.be/tgndvNQ5agA"},"Knit Tutorial for Rojo/Wally"))),(0,a.kt)("h2",{id:"install"},"Install"),(0,a.kt)("p",null,"Installing Knit is very simple. Just drop the module into ReplicatedStorage. Knit can also be used within a Rojo project."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Roblox Studio workflow:")),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Get ",(0,a.kt)("a",{parentName:"li",href:"https://www.roblox.com/library/5530714855/Knit"},"Knit")," from the Roblox library."),(0,a.kt)("li",{parentName:"ul"},"Place Knit directly within ReplicatedStorage.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Rojo/Wally workflow:")),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Add Knit to your ",(0,a.kt)("inlineCode",{parentName:"p"},"wally.toml")," dependency list (e.g. ",(0,a.kt)("inlineCode",{parentName:"p"},'Knit = "sleitnick/knit@^1.6"'),")")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Require Knit like any other module grabbed from Wally"),(0,a.kt)("admonition",{parentName:"li",title:"Wally",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"Not familiar with Wally? Wally is a package manager (like NPM) for the Roblox ecosystem.\nTo get started, check out the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/UpliftGames/wally"},"Wally repository"),".")))),(0,a.kt)("h2",{id:"basic-usage"},"Basic Usage"),(0,a.kt)("p",null,"The core usage of Knit is the same from the server and the client. The general pattern is to create a single script on the server and a single script on the client. These scripts will load Knit, create services/controllers, and then start Knit."),(0,a.kt)("p",null,"The most basic usage would look as such:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-lua"},"local Knit = require(game:GetService(\"ReplicatedStorage\").Packages.Knit)\n\nKnit.Start():catch(warn)\n-- Knit.Start() returns a Promise, so we are catching any errors and feeding it to the built-in 'warn' function\n-- You could also chain 'await()' to the end to yield until the whole sequence is completed:\n-- Knit.Start():catch(warn):await()\n")),(0,a.kt)("p",null,"That would be the necessary code on both the server and the client. However, nothing interesting is going to happen. Let's dive into some more examples."),(0,a.kt)("h3",{id:"a-simple-service"},"A Simple Service"),(0,a.kt)("p",null,"A service is simply a structure that ",(0,a.kt)("em",{parentName:"p"},"serves")," some specific purpose. For instance, a game might have a MoneyService, which manages in-game currency for players. Let's look at a simple example:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-lua"},'local Knit = require(game:GetService("ReplicatedStorage").Packages.Knit)\n\n-- Create the service:\nlocal MoneyService = Knit.CreateService {\n Name = "MoneyService",\n}\n\n-- Add some methods to the service:\n\nfunction MoneyService:GetMoney(player)\n -- Do some sort of data fetch\n local money = someDataStore:GetAsync("money")\n return money\nend\n\nfunction MoneyService:GiveMoney(player, amount)\n -- Do some sort of data fetch\n local money = self:GetMoney(player)\n money += amount\n someDataStore:SetAsync("money", money)\nend\n\nKnit.Start():catch(warn)\n')),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"It's better practice to put services and controllers within their own ModuleScript and then require them from your main script. For the sake of simplicity, they are all in one script for these examples.")),(0,a.kt)("p",null,"Now we have a little MoneyService that can get and give money to a player. However, only the server can use this at the moment. What if we want clients to fetch how much money they have? To do this, we have to create some client-side code to consume our service. We ",(0,a.kt)("em",{parentName:"p"},"could")," create a controller, but it's not necessary for this example."),(0,a.kt)("p",null,"First, we need to expose a method to the client. We can do this by writing methods on the service's Client table:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-lua"},"-- Money service on the server\n...\nfunction MoneyService.Client:GetMoney(player)\n -- We already wrote this method, so we can just call the other one.\n -- 'self.Server' will reference back to the root MoneyService.\n return self.Server:GetMoney(player)\nend\n...\n")),(0,a.kt)("p",null,"We can write client-side code to fetch money from the service:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-lua"},'-- Client-side code\nlocal Knit = require(game:GetService("ReplicatedStorage").Packages.Knit)\nKnit.Start():catch(warn):await()\n\nlocal MoneyService = Knit.GetService("MoneyService")\n\nMoneyService:GetMoney():andThen(function(money)\n print(money)\nend)\n\n-- Don\'t want to use promises? When you start Knit on the client,\n-- set the ServicePromises option to false:\n')),(0,a.kt)("admonition",{title:"Turn Off Promises",type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"Don't want to use promises when the client calls a service method? Set the ",(0,a.kt)("inlineCode",{parentName:"p"},"ServicePromises")," option to ",(0,a.kt)("inlineCode",{parentName:"p"},"false")," when you start Knit on the client:"),(0,a.kt)("pre",{parentName:"admonition"},(0,a.kt)("code",{parentName:"pre",className:"language-lua"},'Knit.Start({ServicePromises = false}):catch(warn):await()\n\nlocal MoneyService = Knit.GetService("MoneyService")\n\nlocal money = MoneyService:GetMoney()\n'))),(0,a.kt)("p",null,"Under the hood, Knit is creating a RemoteFunction bound to the service's GetMoney method. Knit keeps RemoteFunctions and RemoteEvents out of the way so that developers can focus on writing code and not building communication infrastructure."),(0,a.kt)("p",null,"Check out the ",(0,a.kt)("a",{parentName:"p",href:"/Knit/docs/services"},"Services")," documentation for more info on services."))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[391],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var r=n(67294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=c(n),d=a,h=u["".concat(s,".").concat(d)]||u[d]||m[d]||o;return n?r.createElement(h,i(i({ref:t},p),{},{components:n})):r.createElement(h,i({ref:t},p))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[u]="string"==typeof e?e:a,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=n(87462),a=(n(67294),n(3905));const o={sidebar_position:2},i="Getting Started",l={unversionedId:"gettingstarted",id:"gettingstarted",title:"Getting Started",description:"Tutorial Videos",source:"@site/docs/gettingstarted.md",sourceDirName:".",slug:"/gettingstarted",permalink:"/Knit/docs/gettingstarted",draft:!1,editUrl:"https://github.com/Sleitnick/Knit/edit/master/docs/gettingstarted.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"defaultSidebar",previous:{title:"About",permalink:"/Knit/docs/intro"},next:{title:"Services",permalink:"/Knit/docs/services"}},s={},c=[{value:"Tutorial Videos",id:"tutorial-videos",level:2},{value:"Install",id:"install",level:2},{value:"Basic Usage",id:"basic-usage",level:2},{value:"A Simple Service",id:"a-simple-service",level:3}],p={toc:c},u="wrapper";function m(e){let{components:t,...n}=e;return(0,a.kt)(u,(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"getting-started"},"Getting Started"),(0,a.kt)("h2",{id:"tutorial-videos"},"Tutorial Videos"),(0,a.kt)("p",null,"Knit can be used via two workflows: Roblox Studio and externally with Rojo and Wally. To help explain how Knit is used through both workflows, check out the tutorial videos for each:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://youtu.be/0Ty2ojfdOnA"},"Knit Tutorial for Studio")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://youtu.be/tgndvNQ5agA"},"Knit Tutorial for Rojo/Wally"))),(0,a.kt)("h2",{id:"install"},"Install"),(0,a.kt)("p",null,"Installing Knit is very simple. Just drop the module into ReplicatedStorage. Knit can also be used within a Rojo project."),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Roblox Studio workflow:")),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Get ",(0,a.kt)("a",{parentName:"li",href:"https://www.roblox.com/library/5530714855/Knit"},"Knit")," from the Roblox library."),(0,a.kt)("li",{parentName:"ul"},"Place Knit directly within ReplicatedStorage.")),(0,a.kt)("p",null,(0,a.kt)("strong",{parentName:"p"},"Rojo/Wally workflow:")),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Add Knit to your ",(0,a.kt)("inlineCode",{parentName:"p"},"wally.toml")," dependency list (e.g. ",(0,a.kt)("inlineCode",{parentName:"p"},'Knit = "sleitnick/knit@^1.7"'),")")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Require Knit like any other module grabbed from Wally"),(0,a.kt)("admonition",{parentName:"li",title:"Wally",type:"note"},(0,a.kt)("p",{parentName:"admonition"},"Not familiar with Wally? Wally is a package manager (like NPM) for the Roblox ecosystem.\nTo get started, check out the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/UpliftGames/wally"},"Wally repository"),".")))),(0,a.kt)("h2",{id:"basic-usage"},"Basic Usage"),(0,a.kt)("p",null,"The core usage of Knit is the same from the server and the client. The general pattern is to create a single script on the server and a single script on the client. These scripts will load Knit, create services/controllers, and then start Knit."),(0,a.kt)("p",null,"The most basic usage would look as such:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-lua"},"local Knit = require(game:GetService(\"ReplicatedStorage\").Packages.Knit)\n\nKnit.Start():catch(warn)\n-- Knit.Start() returns a Promise, so we are catching any errors and feeding it to the built-in 'warn' function\n-- You could also chain 'await()' to the end to yield until the whole sequence is completed:\n-- Knit.Start():catch(warn):await()\n")),(0,a.kt)("p",null,"That would be the necessary code on both the server and the client. However, nothing interesting is going to happen. Let's dive into some more examples."),(0,a.kt)("h3",{id:"a-simple-service"},"A Simple Service"),(0,a.kt)("p",null,"A service is simply a structure that ",(0,a.kt)("em",{parentName:"p"},"serves")," some specific purpose. For instance, a game might have a MoneyService, which manages in-game currency for players. Let's look at a simple example:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-lua"},'local Knit = require(game:GetService("ReplicatedStorage").Packages.Knit)\n\n-- Create the service:\nlocal MoneyService = Knit.CreateService {\n Name = "MoneyService",\n}\n\n-- Add some methods to the service:\n\nfunction MoneyService:GetMoney(player)\n -- Do some sort of data fetch\n local money = someDataStore:GetAsync("money")\n return money\nend\n\nfunction MoneyService:GiveMoney(player, amount)\n -- Do some sort of data fetch\n local money = self:GetMoney(player)\n money += amount\n someDataStore:SetAsync("money", money)\nend\n\nKnit.Start():catch(warn)\n')),(0,a.kt)("admonition",{type:"note"},(0,a.kt)("p",{parentName:"admonition"},"It's better practice to put services and controllers within their own ModuleScript and then require them from your main script. For the sake of simplicity, they are all in one script for these examples.")),(0,a.kt)("p",null,"Now we have a little MoneyService that can get and give money to a player. However, only the server can use this at the moment. What if we want clients to fetch how much money they have? To do this, we have to create some client-side code to consume our service. We ",(0,a.kt)("em",{parentName:"p"},"could")," create a controller, but it's not necessary for this example."),(0,a.kt)("p",null,"First, we need to expose a method to the client. We can do this by writing methods on the service's Client table:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-lua"},"-- Money service on the server\n...\nfunction MoneyService.Client:GetMoney(player)\n -- We already wrote this method, so we can just call the other one.\n -- 'self.Server' will reference back to the root MoneyService.\n return self.Server:GetMoney(player)\nend\n...\n")),(0,a.kt)("p",null,"We can write client-side code to fetch money from the service:"),(0,a.kt)("pre",null,(0,a.kt)("code",{parentName:"pre",className:"language-lua"},'-- Client-side code\nlocal Knit = require(game:GetService("ReplicatedStorage").Packages.Knit)\nKnit.Start():catch(warn):await()\n\nlocal MoneyService = Knit.GetService("MoneyService")\n\nMoneyService:GetMoney():andThen(function(money)\n print(money)\nend)\n\n-- Don\'t want to use promises? When you start Knit on the client,\n-- set the ServicePromises option to false:\n')),(0,a.kt)("admonition",{title:"Turn Off Promises",type:"tip"},(0,a.kt)("p",{parentName:"admonition"},"Don't want to use promises when the client calls a service method? Set the ",(0,a.kt)("inlineCode",{parentName:"p"},"ServicePromises")," option to ",(0,a.kt)("inlineCode",{parentName:"p"},"false")," when you start Knit on the client:"),(0,a.kt)("pre",{parentName:"admonition"},(0,a.kt)("code",{parentName:"pre",className:"language-lua"},'Knit.Start({ServicePromises = false}):catch(warn):await()\n\nlocal MoneyService = Knit.GetService("MoneyService")\n\nlocal money = MoneyService:GetMoney()\n'))),(0,a.kt)("p",null,"Under the hood, Knit is creating a RemoteFunction bound to the service's GetMoney method. Knit keeps RemoteFunctions and RemoteEvents out of the way so that developers can focus on writing code and not building communication infrastructure."),(0,a.kt)("p",null,"Check out the ",(0,a.kt)("a",{parentName:"p",href:"/Knit/docs/services"},"Services")," documentation for more info on services."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.68faddb6.js b/assets/js/main.adf1fc9e.js similarity index 99% rename from assets/js/main.68faddb6.js rename to assets/js/main.adf1fc9e.js index 0a2c27fe..cdbfd9ec 100644 --- a/assets/js/main.68faddb6.js +++ b/assets/js/main.adf1fc9e.js @@ -1,2 +1,2 @@ -/*! For license information please see main.68faddb6.js.LICENSE.txt */ -(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(67294),a=n(87462),o=n(68356),i=n.n(o),l=n(16887);const s={"09d5ad39":[()=>n.e(30).then(n.bind(n,84381)),"@site/docs/examples.md",84381],"0e384e19":[()=>n.e(671).then(n.bind(n,59881)),"@site/docs/intro.md",59881],17896441:[()=>Promise.all([n.e(532),n.e(272),n.e(918)]).then(n.bind(n,15462)),"@theme/DocItem",15462],"1baa5254":[()=>n.e(25).then(n.t.bind(n,40088,19)),"/home/runner/.cache/moonwave/Knit/.docusaurus/docusaurus-plugin-moonwave/moonwave/KnitServer-toc.json",40088],"1be78505":[()=>Promise.all([n.e(532),n.e(514)]).then(n.bind(n,90606)),"@theme/DocPage",90606],"1c0701dd":[()=>n.e(235).then(n.bind(n,72350)),"@site/docs/middleware.md",72350],"1e7d6217":[()=>n.e(350).then(n.bind(n,59355)),"@site/docs/util.md",59355],"1f391b9e":[()=>Promise.all([n.e(532),n.e(272),n.e(85)]).then(n.bind(n,14247)),"@theme/MDXPage",14247],29467324:[()=>n.e(553).then(n.t.bind(n,15745,19)),"/home/runner/.cache/moonwave/Knit/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",15745],"30b9a677":[()=>n.e(955).then(n.t.bind(n,7636,19)),"/home/runner/.cache/moonwave/Knit/.docusaurus/docusaurus-plugin-moonwave/moonwave/sidebar.json",7636],53167645:[()=>n.e(615).then(n.bind(n,63365)),"@site/docs/executionmodel.md",63365],"5506604c":[()=>n.e(662).then(n.t.bind(n,63193,19)),"/home/runner/.cache/moonwave/Knit/.docusaurus/docusaurus-plugin-moonwave/moonwave/KnitServer.json",63193],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,36809)),"@generated/docusaurus.config",36809],"6b4df72d":[()=>n.e(318).then(n.t.bind(n,88303,19)),"/home/runner/.cache/moonwave/Knit/.docusaurus/docusaurus-plugin-moonwave/moonwave/plugin-route-context-module-100.json",88303],78105565:[()=>n.e(370).then(n.bind(n,23424)),"/home/runner/.cache/moonwave/Knit/node_modules/docusaurus-plugin-moonwave/src/components/Redirect.js",23424],"85d6f832":[()=>n.e(390).then(n.t.bind(n,63891,19)),"/home/runner/.cache/moonwave/Knit/.docusaurus/docusaurus-plugin-moonwave/moonwave/options.json",63891],"8deedfb8":[()=>n.e(556).then(n.bind(n,26437)),"@site/pages/CHANGELOG.md",26437],"92857ad5":[()=>Promise.all([n.e(532),n.e(38)]).then(n.bind(n,81117)),"/home/runner/.cache/moonwave/Knit/node_modules/docusaurus-plugin-moonwave/src/components/LuaClass.js",81117],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"989ae605":[()=>n.e(895).then(n.bind(n,39820)),"@site/docs/services.md",39820],"9ee14c80":[()=>n.e(11).then(n.t.bind(n,83769,19)),"/home/runner/.cache/moonwave/Knit/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",83769],ad6f44fb:[()=>n.e(113).then(n.t.bind(n,65306,19)),"/home/runner/.cache/moonwave/Knit/.docusaurus/docusaurus-plugin-moonwave/moonwave/KnitClient-toc.json",65306],ba6452ef:[()=>n.e(334).then(n.t.bind(n,8230,19)),"/home/runner/.cache/moonwave/Knit/.docusaurus/docusaurus-plugin-moonwave/moonwave/KnitClient.json",8230],c0dc4050:[()=>n.e(201).then(n.bind(n,47790)),"@site/docs/vscodesnippets.md",47790],d3874e59:[()=>Promise.all([n.e(532),n.e(374)]).then(n.bind(n,52897)),"@site/pages/index.js",52897],d692d782:[()=>n.e(801).then(n.t.bind(n,85492,19)),"/home/runner/.cache/moonwave/Knit/.docusaurus/docusaurus-plugin-moonwave/moonwave/typeLinks.json",85492],da7e18d7:[()=>n.e(391).then(n.bind(n,85787)),"@site/docs/gettingstarted.md",85787],ebf2795f:[()=>n.e(274).then(n.bind(n,42487)),"@site/docs/controllers.md",42487]};function u(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 c=n(99670),d=n(30226);function f(e,t){if("*"===e)return i()({loading:u,loader:()=>n.e(972).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=l[`${e}-${t}`],f={},p=[],m=[],h=(0,c.Z)(o);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=s[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:u,loader:f,modules:p,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,a.Z)({},i,n)))}})}const p=[{path:"/Knit/api/",component:f("/Knit/api/","fe4"),exact:!0},{path:"/Knit/api/KnitClient",component:f("/Knit/api/KnitClient","684"),exact:!0},{path:"/Knit/api/KnitServer",component:f("/Knit/api/KnitServer","32a"),exact:!0},{path:"/Knit/CHANGELOG",component:f("/Knit/CHANGELOG","626"),exact:!0},{path:"/Knit/docs",component:f("/Knit/docs","066"),routes:[{path:"/Knit/docs/controllers",component:f("/Knit/docs/controllers","874"),exact:!0,sidebar:"defaultSidebar"},{path:"/Knit/docs/examples",component:f("/Knit/docs/examples","9db"),exact:!0,sidebar:"defaultSidebar"},{path:"/Knit/docs/executionmodel",component:f("/Knit/docs/executionmodel","e6f"),exact:!0,sidebar:"defaultSidebar"},{path:"/Knit/docs/gettingstarted",component:f("/Knit/docs/gettingstarted","15b"),exact:!0,sidebar:"defaultSidebar"},{path:"/Knit/docs/intro",component:f("/Knit/docs/intro","6a1"),exact:!0,sidebar:"defaultSidebar"},{path:"/Knit/docs/middleware",component:f("/Knit/docs/middleware","7ce"),exact:!0,sidebar:"defaultSidebar"},{path:"/Knit/docs/services",component:f("/Knit/docs/services","c51"),exact:!0,sidebar:"defaultSidebar"},{path:"/Knit/docs/util",component:f("/Knit/docs/util","123"),exact:!0,sidebar:"defaultSidebar"},{path:"/Knit/docs/vscodesnippets",component:f("/Knit/docs/vscodesnippets","4dc"),exact:!0,sidebar:"defaultSidebar"}]},{path:"/Knit/",component:f("/Knit/","9e0"),exact:!0},{path:"*",component:f("*")}]},98934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(67294);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)}},49383:(e,t,n)=>{"use strict";var r=n(67294),a=n(73935),o=n(73727),i=n(70405),l=n(10412);const s=[n(32497),n(3310),n(18320),n(34197)];var u=n(723),c=n(16550),d=n(18790);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(87462),m=n(35742),h=n(52263),g=n(44996),v=n(86668),b=n(1944),y=n(94711),w=n(19727),E=n(43320),k=n(90197);function S(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,h.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),a=function(){const{siteConfig:{url:e}}=(0,h.Z)(),{pathname:t}=(0,c.TH)();return e+(0,g.Z)(t)}(),o=t?`${n}${t}`:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function _(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,v.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(b.d,{image:n}),r.createElement(x,null),r.createElement(S,null),r.createElement(k.Z,{tag:E.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const C=new Map;function T(e){if(C.has(e.pathname))return{...e,pathname:C.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return C.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return C.set(e.pathname,t),{...e,pathname:t}}var L=n(98934),A=n(58940);function N(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 O=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}),N("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function P(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{constructor(e){super(e),this.previousLocation=void 0,this.routeUpdateCleanupCb=void 0,this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?N("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=N("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),P(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(O,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const R=I,M="docusaurus-base-url-issue-banner-container",D="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('${M}');\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,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,$(e))),r.createElement("div",{id:M}))}function z(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(U,null):null}function j(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,h.Z)(),i=(0,g.Z)(e),{htmlLang:l,direction:s}=o[a];return r.createElement(m.Z,null,r.createElement("html",{lang:l,dir:s}),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(44763);function H(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement(Z.Z,null,r.createElement(A.M,null,r.createElement(L.t,null,r.createElement(f,null,r.createElement(j,null),r.createElement(_,null),r.createElement(z,null),r.createElement(R,{location:T(t)},e)))))}var V=n(16887);const K=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const 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 G=n(99670);const W=new Set,q=new Set,Y=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,X={prefetch(e){if(!(e=>!Y()&&!q.has(e)&&!W.has(e))(e))return!1;W.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(V).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,G.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?K(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!Y()&&!q.has(e))(e)&&(q.add(e),P(e))},Q=Object.freeze(X);if(l.Z.canUseDOM){window.docusaurus=Q;const e=a.hydrate;P(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(H,null))),document.getElementById("__docusaurus"))}))}},58940:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>d});var r=n(67294),a=n(36809);const o=JSON.parse('{"docusaurus-lunr-search":{"default":{"fileNames":{"searchDoc":"search-doc-1703427410909.json","lunrIndex":"lunr-index-1703427410909.json"}}},"docusaurus-plugin-content-docs":{"default":{"path":"/Knit/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/Knit/docs","mainDocId":"intro","docs":[{"id":"controllers","path":"/Knit/docs/controllers","sidebar":"defaultSidebar"},{"id":"examples","path":"/Knit/docs/examples","sidebar":"defaultSidebar"},{"id":"executionmodel","path":"/Knit/docs/executionmodel","sidebar":"defaultSidebar"},{"id":"gettingstarted","path":"/Knit/docs/gettingstarted","sidebar":"defaultSidebar"},{"id":"intro","path":"/Knit/docs/intro","sidebar":"defaultSidebar"},{"id":"middleware","path":"/Knit/docs/middleware","sidebar":"defaultSidebar"},{"id":"services","path":"/Knit/docs/services","sidebar":"defaultSidebar"},{"id":"util","path":"/Knit/docs/util","sidebar":"defaultSidebar"},{"id":"vscodesnippets","path":"/Knit/docs/vscodesnippets","sidebar":"defaultSidebar"}],"draftIds":[],"sidebars":{"defaultSidebar":{"link":{"path":"/Knit/docs/intro","label":"intro"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(57529);const s=JSON.parse('{"docusaurusVersion":"2.3.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.3.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.3.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.3.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.3.1"},"docusaurus-plugin-moonwave":{"type":"package","name":"docusaurus-plugin-moonwave","version":"1.1.2"},"docusaurus-lunr-search":{"type":"package","name":"docusaurus-lunr-search","version":"2.3.2"}}}'),u={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},44763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(67294),a=n(10412),o=n(35742),i=n(34510);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",height:"50vh",width:"100%",fontSize:"20px"}},r.createElement("h1",null,"This page crashed."),r.createElement("p",null,t.message),r.createElement("button",{type:"button",onClick:n},"Try again"))}function s(e){let{error:t,tryAgain:n}=e;return r.createElement(c,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(i.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const u=e=>r.createElement(s,e);class c extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??u)(e)}return e??null}}},10412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},35742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(70405);function o(e){return r.createElement(a.ql,e)}},39960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>h});var r=n(87462),a=n(67294),o=n(73727),i=n(18780),l=n(52263),s=n(13919),u=n(10412);const c=a.createContext({collectLink:()=>{}}),d=()=>(0,a.useContext)(c);var f=n(44996);const p=e=>e.startsWith("/");function m(e,t){let{isNavLink:n,to:c,href:m,activeClassName:h,isActive:g,"data-noBrokenLinkCheck":v,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:{trailingSlash:w,baseUrl:E}}=(0,l.Z)(),{withBaseUrl:k}=(0,f.C)(),S=d(),x=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>x.current));const _=c||m;const C=(0,s.Z)(_),T=_?.replace("pathname://","");let L=void 0!==T?(A=T,b&&p(A)?k(A):A):void 0;var A;L&&C&&(L=(0,i.applyTrailingSlash)(L,{trailingSlash:w,baseUrl:E}));const N=(0,a.useRef)(!1),O=n?o.OL:o.rU,P=u.Z.canUseIntersectionObserver,I=(0,a.useRef)(),R=()=>{N.current||null==L||(window.docusaurus.preload(L),N.current=!0)};(0,a.useEffect)((()=>(!P&&C&&null!=L&&window.docusaurus.prefetch(L),()=>{P&&I.current&&I.current.disconnect()})),[I,L,P,C]);const M=L?.startsWith("#")??!1,D=!L||!C||M;return D||v||S.collectLink(L),D?a.createElement("a",(0,r.Z)({ref:x,href:L},_&&!C&&{target:"_blank",rel:"noopener noreferrer"},y)):a.createElement(O,(0,r.Z)({},y,{onMouseEnter:R,onTouchStart:R,innerRef:e=>{x.current=e,P&&e&&C&&(I.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(I.current.unobserve(e),I.current.disconnect(),null!=L&&window.docusaurus.prefetch(L))}))})),I.current.observe(e))},to:L},n&&{isActive:g,activeClassName:h}))}const h=a.forwardRef(m)},95999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(67294);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(57529);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 l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},29935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},13919:(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})},44996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var r=n(67294),a=n(52263),o=n(13919);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 l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},52263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(58940);function o(){return(0,r.useContext)(a._)}},28084:(e,t,n)=>{"use strict";n.d(t,{OD:()=>o,eZ:()=>i});var r=n(52263),a=n(29935);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}},72389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(98934);function o(){return(0,r.useContext)(a._)}},99670:(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=".",n={};return function e(a,o){Object.entries(a).forEach((a=>{let[i,l]=a;const s=o?`${o}${t}${i}`:i;r(l)?e(l,s):n[s]=l}))}(e),n}},30226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(67294);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)}},94104:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>p,gA:()=>c,_r:()=>s,Jo:()=>m,zh:()=>u,yW:()=>f,gB:()=>d});var r=n(16550),a=n(28084);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 l={},s=()=>(0,a.OD)("docusaurus-plugin-content-docs")??l,u=e=>(0,a.eZ)("docusaurus-plugin-content-docs",e,{failfast:!0});function c(e){void 0===e&&(e={});const t=s(),{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 u(e).versions}function f(e){const t=u(e);return o(t)}function p(e){const t=u(e),{pathname:n}=(0,r.TH)();return i(t,n)}function m(e){const t=u(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)}},18320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(74865),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(87410),a=n(36809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(33003)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},39471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294);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"}))}},34510:(e,t,n)=>{"use strict";n.d(t,{Z:()=>ut});var r=n(67294),a=n(86010),o=n(44763),i=n(1944),l=n(87462),s=n(16550),u=n(95999),c=n(85936);const d="docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const m=(0,u.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}=p();return r.createElement("div",{ref:n,role:"region","aria-label":m},r.createElement("a",(0,l.Z)({},e,{href:`#${d}`,onClick:a}),t))}var g=n(35281),v=n(19727);const b={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(h,{className:b.skipToContent})}var w=n(86668),E=n(59689);function k(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...s}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 15 15",width:t,height:n},s),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const S={closeButton:"closeButton_CVFx"};function x(e){return r.createElement("button",(0,l.Z)({type:"button","aria-label":(0,u.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",S.closeButton,e.className)}),r.createElement(k,{width:14,height:14,strokeWidth:3.1}))}const _={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,l.Z)({},e,{className:(0,a.Z)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function L(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,E.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(x,{onClick:n,className:T.announcementBarClose}))}var A=n(72961),N=n(12466);var O=n(902),P=n(13102);const I=r.createContext(null);function R(e){let{children:t}=e;const n=function(){const e=(0,A.e)(),t=(0,P.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,O.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(I.Provider,{value:n},t)}function M(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function D(){const e=(0,r.useContext)(I);if(!e)throw new O.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,P.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:M(o)})),[a,o,t])}function F(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 B=n(92949),$=n(72389);function U(e){return r.createElement("svg",(0,l.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 z(e){return r.createElement("svg",(0,l.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 j={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function Z(e){let{className:t,value:n,onChange:o}=e;const i=(0,$.Z)(),l=(0,u.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===n?(0,u.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.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)(j.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",j.toggleButton,!i&&j.toggleButtonDisabled),type:"button",onClick:()=>o("dark"===n?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite"},r.createElement(U,{className:(0,a.Z)(j.toggleIcon,j.lightToggleIcon)}),r.createElement(z,{className:(0,a.Z)(j.toggleIcon,j.darkToggleIcon)})))}const H=r.memo(Z);function V(e){let{className:t}=e;const n=(0,w.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,B.I)();return n?null:r.createElement(H,{className:t,value:a,onChange:o})}var K=n(21327);function G(){return r.createElement(K.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function W(){const e=(0,A.e)();return r.createElement("button",{type:"button","aria-label":(0,u.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(k,{color:"var(--ifm-color-emphasis-600)"}))}function q(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(G,null),r.createElement(V,{className:"margin-right--md"}),r.createElement(W,null))}var Y=n(39960),X=n(44996),Q=n(13919);function J(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var ee=n(39471);function te(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:s,isDropdownLink:u,prependBaseUrlToHref:c,...d}=e;const f=(0,X.Z)(a),p=(0,X.Z)(t),m=(0,X.Z)(o,{forcePrependBaseUrl:!0}),h=i&&o&&!(0,Q.Z)(o),g=s?{dangerouslySetInnerHTML:{__html:s}}:{children:r.createElement(r.Fragment,null,i,h&&r.createElement(ee.Z,u&&{width:12,height:12}))};return o?r.createElement(Y.Z,(0,l.Z)({href:c?m:o},d,g)):r.createElement(Y.Z,(0,l.Z)({to:f,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?J(n,t.pathname):t.pathname.startsWith(p)},d,g))}function ne(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(te,(0,l.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 re(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(te,(0,l.Z)({className:(0,a.Z)("menu__link",t)},o)))}function ae(e){let{mobile:t=!1,position:n,...a}=e;const o=t?re:ne;return r.createElement(o,(0,l.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var oe=n(86043),ie=n(48596),le=n(52263);function se(e,t){return e.some((e=>function(e,t){return!!(0,ie.Mg)(e.to,t)||!!J(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ue(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const u=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[u]),r.createElement("div",{ref:u,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c})},r.createElement(te,(0,l.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",o)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))}}),s.children??s.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,n)=>r.createElement(Te,(0,l.Z)({isDropdownItem:!0,onKeyDown:e=>{if(n===t.length-1&&"Tab"===e.key){e.preventDefault(),d(!1);const t=u.current.nextElementSibling;if(t){(t instanceof HTMLAnchorElement?t:t.querySelector("a")).focus()}}},activeClassName:"dropdown__link--active"},e,{key:n}))))))}function ce(e){let{items:t,className:n,position:o,onClick:i,...u}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=se(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,oe.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(te,(0,l.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},u,{onClick:e=>{e.preventDefault(),p()}}),u.children??u.label),r.createElement(oe.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},t.map(((e,t)=>r.createElement(Te,(0,l.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function de(e){let{mobile:t=!1,...n}=e;const a=t?ce:ue;return r.createElement(a,n)}var fe=n(94711);function pe(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,l.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 me={iconLanguage:"iconLanguage_nlXk"};var he=n(94184),ge=n.n(he),ve=n(28084);const be=e=>{const t=(0,r.useRef)(!1),a=(0,r.useRef)(null),[o,i]=(0,r.useState)(!1),l=(0,s.k6)(),{siteConfig:u={}}=(0,le.Z)(),c=(0,$.Z)(),{baseUrl:d}=u,f=(0,ve.eZ)("docusaurus-lunr-search"),p=()=>{t.current||(Promise.all([fetch(`${d}${f.fileNames.searchDoc}`).then((e=>e.json())),fetch(`${d}${f.fileNames.lunrIndex}`).then((e=>e.json())),Promise.all([n.e(878),n.e(339)]).then(n.bind(n,30894)),Promise.all([n.e(532),n.e(343)]).then(n.bind(n,53343))]).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,l.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 c&&p(),r.createElement("div",{className:"navbar__search",key:"search-box"},r.createElement("span",{"aria-label":"expand searchbar",role:"button",className:ge()("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:ge()("navbar__search-input",{"search-bar-expanded":e.isSearchBarExpanded},{"search-bar":!e.isSearchBarExpanded}),onClick:p,onMouseOver:p,onFocus:m,onBlur:m,ref:a,disabled:!o}))},ye={searchBox:"searchBox_ZlJk"};function we(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,ye.searchBox)},t)}var Ee=n(94104),ke=n(52802);const Se=e=>e.docs.find((t=>t.id===e.mainDocId));var xe=n(60373);const _e=e=>e.docs.find((t=>t.id===e.mainDocId));const Ce={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.Z)(),f=(0,fe.l)(),{search:p,hash:m}=(0,s.TH)(),h=[...n,...c.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${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,u.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return r.createElement(de,(0,l.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(pe,{className:me.iconLanguage}),g),items:h}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(we,{className:n},r.createElement(be,null))},dropdown:de,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Ee.Iw)(a),s=(0,ke.vY)(t,a);return null===s?null:r.createElement(ae,(0,l.Z)({exact:!0},o,{isActive:()=>i?.path===s.path||!!i?.sidebar&&i.sidebar===s.sidebar,label:n??s.id,to:s.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Ee.Iw)(a),s=(0,ke.oz)(t,a).link;if(!s)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(ae,(0,l.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??s.label,to:s.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,ke.lO)(a)[0],s=t??i.label,u=n??Se(i).path;return r.createElement(ae,(0,l.Z)({},o,{label:s,to:u}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...c}=e;const{search:d,hash:f}=(0,s.TH)(),p=(0,Ee.Iw)(n),m=(0,Ee.gB)(n),{savePreferredVersionName:h}=(0,xe.J)(n),g=[...o,...m.map((e=>{const t=p.alternateDocVersions[e.name]??_e(e);return{label:e.label,to:`${t.path}${d}${f}`,isActive:()=>e===p.activeVersion,onClick:()=>h(e.name)}})),...i],v=(0,ke.lO)(n)[0],b=t&&g.length>1?(0,u.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):v.label,y=t&&g.length>1?void 0:_e(v).path;return g.length<=1?r.createElement(ae,(0,l.Z)({},c,{mobile:t,label:b,to:y,isActive:a?()=>!1:void 0})):r.createElement(de,(0,l.Z)({},c,{mobile:t,label:b,to:y,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 Le(){const e=(0,A.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(Te,(0,l.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Ae(e){return r.createElement("button",(0,l.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.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 Ne(){const e=0===(0,w.L)().navbar.items.length,t=D();return r.createElement(r.Fragment,null,!e&&r.createElement(Ae,{onClick:()=>t.hide()}),t.content)}function Oe(){const e=(0,A.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(F,{header:r.createElement(q,null),primaryMenu:r.createElement(Le,null),secondaryMenu:r.createElement(Ne,null)}):null}const Pe={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ie(e){return r.createElement("div",(0,l.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Re(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,A.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,N.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{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:l,"aria-label":(0,u.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Pe.navbarHideable,!s&&Pe.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Ie,{onClick:i.toggle}),r.createElement(Oe,null))}const Me="right";function De(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,l.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 Fe(){const{toggle:e,shown:t}=(0,A.e)();return r.createElement("button",{onClick:e,"aria-label":(0,u.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(De,null))}const Be={colorModeToggle:"colorModeToggle_DEke"};function $e(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(Te,(0,l.Z)({},e,{key:t})))))}function Ue(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 ze(){const e=(0,A.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??Me)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(Ue,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(Fe,null),r.createElement(G,null),r.createElement($e,{items:n})),right:r.createElement(r.Fragment,null,r.createElement($e,{items:a}),r.createElement(V,{className:Be.colorModeToggle}),!o&&r.createElement(we,null,r.createElement(be,null)))})}function je(){return r.createElement(Re,null,r.createElement(ze,null))}function Ze(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...s}=t,u=(0,X.Z)(n),c=(0,X.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(Y.Z,(0,l.Z)({className:"footer__link-item"},a?{href:i?c:a}:{to:u},s),o,a&&!(0,Q.Z)(a)&&r.createElement(ee.Z,null))}function He(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(Ze,{item:t}))}function Ve(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(He,{key:t,item:e})))))}function Ke(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(Ve,{key:t,column:e}))))}function Ge(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function We(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(Ze,{item:t})}function qe(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(We,{item:e}),t.length!==n+1&&r.createElement(Ge,null))))))}function Ye(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(Ke,{columns:t}):r.createElement(qe,{links:t})}var Xe=n(50941);const Qe={footerLogoLink:"footerLogoLink_BH7S"};function Je(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(Xe.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function et(e){let{logo:t}=e;return t.href?r.createElement(Y.Z,{href:t.href,className:Qe.footerLogoLink,target:t.target},r.createElement(Je,{logo:t})):r.createElement(Je,{logo:t})}function tt(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function nt(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 rt(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(nt,{style:o,links:n&&n.length>0&&r.createElement(Ye,{links:n}),logo:a&&r.createElement(et,{logo:a}),copyright:t&&r.createElement(tt,{copyright:t})})}const at=r.memo(rt),ot=(0,O.Qc)([B.S,E.pl,N.OC,xe.L5,i.VC,function(e){let{children:t}=e;return r.createElement(P.n2,null,r.createElement(A.M,null,r.createElement(R,null,t)))}]);function it(e){let{children:t}=e;return r.createElement(ot,null,t)}function lt(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(u.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("p",null,t.message),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},r.createElement(u.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}const st={mainWrapper:"mainWrapper_z2l0"};function ut(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:u}=e;return(0,v.t)(),r.createElement(it,null,r.createElement(i.d,{title:s,description:u}),r.createElement(y,null),r.createElement(L,null),r.createElement(je,null),r.createElement("div",{id:d,className:(0,a.Z)(g.k.wrapper.main,st.mainWrapper,l)},r.createElement(o.Z,{fallback:e=>r.createElement(lt,e)},t)),!n&&r.createElement(at,null))}},21327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(87462),a=n(67294),o=n(39960),i=n(44996),l=n(52263),s=n(86668),u=n(50941);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=a.createElement(u.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){const{siteConfig:{title:t}}=(0,l.Z)(),{navbar:{title:n,logo:u}}=(0,s.L)(),{imageClassName:d,titleClassName:f,...p}=e,m=(0,i.Z)(u?.href||"/"),h=n?"":t,g=u?.alt??h;return a.createElement(o.Z,(0,r.Z)({to:m},p,u?.target&&{target:u.target}),u&&a.createElement(c,{logo:u,alt:g,imageClassName:d}),null!=n&&a.createElement("b",{className:f},n))}},90197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(35742);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}))}},50941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(87462),a=n(67294),o=n(86010),i=n(72389),l=n(92949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:u,className:c,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.Z)({key:e,src:u[e],alt:d,className:(0,o.Z)(s.themedImage,s[`themedImage--${e}`],c)},f)))))}},86043:(e,t,n)=>{"use strict";n.d(t,{u:()=>l,z:()=>h});var r=n(87462),a=n(67294),o=n(10412);const i="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 s={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function c(e,t){const n=t?s:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function d(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){const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??i}`,height:`${t}px`}}function l(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return c(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=s.height,e.style.overflow=s.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function f(e){if(!o.Z.canUseDOM)return e?s:u}function p(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const u=(0,a.useRef)(null);return d({collapsibleRef:u,collapsed:n,animation:o}),a.createElement(t,{ref:u,style:s?void 0:f(n),onTransitionEnd:e=>{"height"===e.propertyName&&(c(u.current,n),i?.(n))},className:l},r)}function m(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(p,(0,r.Z)({},n,{collapsed:l})):null}function h(e){let{lazy:t,...n}=e;const r=t?m:p;return a.createElement(r,n)}},59689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(67294),a=n(72389),o=n(50012),i=n(902),l=n(86668);const s=(0,o.WA)("docusaurus.announcement.dismiss"),u=(0,o.WA)("docusaurus.announcement.id"),c=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{o(c())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&d(!1),!r&&c()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},92949:(e,t,n)=>{"use strict";n.d(t,{I:()=>g,S:()=>h});var r=n(67294),a=n(10412),o=n(902),i=n(50012),l=n(86668);const s=r.createContext(void 0),u="theme",c=(0,i.WA)(u),d={light:"light",dark:"dark"},f=e=>e===d.dark?d.dark:d.light,p=e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{c.set(f(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[a,o]=(0,r.useState)(p(e));(0,r.useEffect)((()=>{t&&c.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),c.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=c.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(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||s.current?s.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(s.Provider,{value:n},t)}function g(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},60373:(e,t,n)=>{"use strict";n.d(t,{J:()=>b,L5:()=>g});var r=n(67294),a=n(94104),o=n(29935),i=n(86668),l=n(52802),s=n(902),u=n(50012);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,u.WA)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.WA)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.WA)(c(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=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,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(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),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=m();return r.createElement(p.Provider,{value:n},t)}function g(e){let{children:t}=e;return l.cE?r.createElement(h,null,t):r.createElement(r.Fragment,null,t)}function v(){const e=(0,r.useContext)(p);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function b(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=v(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(67294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},72961:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(67294),a=n(13102),o=n(87524),i=n(16550),l=(n(61688),n(902));function s(e){!function(e){const t=(0,i.k6)(),n=(0,l.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var u=n(86668);const c=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,u.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const c=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:i})),[e,n,c,i])}function f(e){let{children:t}=e;const n=d();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}},13102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(67294),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 l(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},19727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(67294);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)}}),[])}},87524:(e,t,n)=>{"use strict";n.d(t,{i:()=>u});var r=n(67294),a=n(10412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(){return a.Z.canUseDOM?window.innerWidth>i?o.desktop:o.mobile:o.ssr}const s=!1;function u(){const[e,t]=(0,r.useState)((()=>s?"ssr":l()));return(0,r.useEffect)((()=>{function e(){t(l())}const n=s?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},35281:(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:{}}},52802:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>f,_F:()=>h,cE:()=>d,hI:()=>E,lO:()=>b,vY:()=>w,oz:()=>y,s1:()=>v});var r=n(67294),a=n(16550),o=n(18790),i=n(94104),l=n(60373),s=n(1116);function u(e){return Array.from(new Set(e))}var c=n(48596);const d=!!i._r;function f(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=f(t);if(e)return e}}}const p=(e,t)=>void 0!==e&&(0,c.Mg)(e,t),m=(e,t)=>e.some((e=>h(e,t)));function h(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(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,c.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,c.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function v(){const e=(0,s.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?g({sidebarItems:e.items,pathname:t}):null}function b(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>u([t,n,a].filter(Boolean))),[t,n,a])}function y(e,t){const n=b(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\n Available sidebar ids are:\n - ${Object.keys(t).join("\n- ")}`);return r[1]}),[e,n])}function w(e,t){const n=b(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`DocNavbarItem: couldn't find any doc with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,l=i.find((e=>(0,a.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,u=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:u}}},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>c,VC:()=>p});var r=n(67294),a=n(86010),o=n(35742),i=n(30226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(44996),u=n(52263);function c(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const c=function(e){const{siteConfig:t}=(0,u.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,s.C)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(f,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>u,Ql:()=>s,i6:()=>l,zX:()=>o});var r=n(67294);const a=n(10412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){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 s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},48596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(67294),a=n(723),o=n(52263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},12466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>s,RF:()=>d});var r=n(67294),a=n(10412),o=n(72389),i=n(902);const l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(l.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const c=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(c()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},43320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>a});n(52263);const r="default";function a(e,t){return`docs-${e}-${t}`}},50012:(e,t,n)=>{"use strict";n.d(t,{WA:()=>s});n(67294),n(61688);const r="localStorage";function a(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 o(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,i||(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),i=!0),null}var t}let i=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function s(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=o(t?.persistence);return null===n?l:{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),a({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),a({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),()=>{}}}}}},94711:(e,t,n)=>{"use strict";n.d(t,{l:()=>o});var r=n(52263),a=n(16550);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.Z)(),{pathname:i}=(0,a.TH)(),l=o===n?e:e.replace(`/${o}/`,"/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return`${a?t:""}${function(e){return e===n?`${l}`:`${l}${e}/`}(r)}${s}`}}}},85936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(67294),a=n(16550),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])}},86668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(52263);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)}},18780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}})},94184:(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:()=>S,q_:()=>A,ob:()=>h,PP:()=>O,Ep:()=>m,Hp:()=>g});var r=n(87462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};function l(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}const s=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,r){return e(t,n[r])}));if("object"==typeof t||"object"==typeof n){var r=l(t),a=l(n);return r!==t||a!==n?e(r,a):Object.keys(Object.assign({},t,n)).every((function(r){return e(t[r],n[r])}))}return!1};var u=n(38776);function c(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function f(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 p(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function m(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 h(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function g(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&s(e.state,t.state)}function v(){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=h(e,t,f(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(59864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},32497:(e,t,n)=>{"use strict";n.r(t)},34197:(e,t,n)=>{"use strict";n.r(t)},74865: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),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),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");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},27418: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,l=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),s=1;s{var r=n(5826);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",c=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[1];else{var m=e[i],h=n[2],g=n[3],v=n[4],b=n[5],y=n[6],w=n[7];l&&(r.push(l),l="");var E=null!=h&&null!=m&&m!==h,k="+"===y||"*"===y,S="?"===y||"*"===y,x=n[2]||c,_=v||b;r.push({name:g||o++,prefix:h||"",delimiter:x,optional:S,repeat:k,partial:E,asterisk:!!w,pattern:_?u(_):w?".*":"[^"+s(x)+"]+?"})}}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);S+=k.value.length,k=k.next){var x=k.value;if(t.length>e.length)return;if(!(x instanceof a)){var _,C=1;if(b){if(!(_=o(E,S,e,v))||_.index>=e.length)break;var T=_.index,L=_.index+_[0].length,A=S;for(A+=k.value.length;T>=A;)A+=(k=k.next).value.length;if(S=A-=k.value.length,k.value instanceof a)continue;for(var N=k;N!==t.tail&&(Ad.reach&&(d.reach=R);var M=k.prev;if(P&&(M=s(t,M,P),S+=P.length),u(t,M,C),k=s(t,M,new a(f,g?r.tokenize(O,g):O,y,O)),I&&s(t,k,I),C>1){var D={cause:f+","+m,reach:R};i(e,t,n,k.prev,S,D),d&&D.reach>d.reach&&(d.reach=D.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function u(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&p(u,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function u(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function c(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,c={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return c[n]=a,n})).join(""),n,r),f=Object.keys(c);return i=0,function e(t){for(var n=0;n=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=u(c[a]),p=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),p){var h=[p];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 f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),m=f.indexOf(p);if(m>-1){++a;var h=f.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),v=f.substring(m+p.length),b=[];h&&b.push.apply(b,i([h])),b.push(g),v&&b.push.apply(b,i([v])),"string"==typeof u?l.splice.apply(l,[s,1].concat(b)):u.content=b}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},66841:()=>{Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,function:/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}},33003:(e,t,n)=>{var r={"./prism-lua":66841};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=33003},92703:(e,t,n)=>{"use strict";var r=n(50414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},45697:(e,t,n)=>{e.exports=n(92703)()},50414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},64448:(e,t,n)=>{"use strict";var r=n(67294),a=n(27418),o=n(63840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n