diff --git a/404.html b/404.html index 789f443f..98c51f7f 100644 --- a/404.html +++ b/404.html @@ -5,13 +5,13 @@ Page Not Found | Functionland - - + +
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/RFCs/document-syncing.html b/RFCs/document-syncing.html index 03c85019..3169907f 100644 --- a/RFCs/document-syncing.html +++ b/RFCs/document-syncing.html @@ -5,13 +5,13 @@ Document Syncing | Functionland - - + +
Skip to main content

Document Syncing

Summary​

This RFC proposes usage of IPFS-Cluster in conjunction with a Correspondant and Newsroom component to sync files and folders across several devices.

Use Case​

A Box owner would like to sync the meeting notes on their desktop with other meeting participants in real time.

They run a command and provide instructions for other participants to download the document.

Each participant is able to download and edit the meeting notes and see updates from others in real time.

Out of Scope​

  • high-frequency updates to documents which might be encountered with multi-tenancy or recording streaming video

  • data persisted by orbit db or any other dbs

Pre-conditions​

  • each participant's device in the meeting is accessible from the others

    EITHER

    * they have a public static IP

    OR

    * NAT hole punching works AND there are relays available to help establish connectivity

Design Considerations​

IPFS-Cluster​

A properly configured ipfs-cluster provides most of the properties required to implement this use case including.

  • a private network of trusted peers

  • conflict resolution

  • notifying peers of changes

  • efficient transmission of data

  • providing peer pinning status

Conflict Resolution​

IPFS Cluster provides two choices for conflict resolution.

CRDT will be used because:

  • it utilizes 'GossipSub' which will probably be useful for future use cases related to replication.

  • it does not require > 50% of peers to be online in order to operate

  • 'follower' peers might be used in the future to provide 'read-only' access

  • 'trusted peers' might be used in the future to provide access control

  • peers will probably come and go frequently (ie/ someone needs to drop from the meeting)

  • since we have full control over the document store, we can ensure the DAG is shallow (based on limitations of number of files in a directory)

  • less stable / tested conflict resolution can be tolerated for this use case

Design​

Box System Architecture​

The following diagram illustrates how various components on the Box will work together to implement data syncing.

There are two new components introduced:

  • correspondant

  • newsroom

Box System Architecture

Box System Architecture

System Properties​

  • peers should not enter a recursive loop with each other by notifying authors of updates that originated from them

  • each program should be reentrant in the sense that they can be aborted at any point during execution then restarted

    • the shared state will be updated to reflect the latest changes to the file system

Correspondant​

The role of the correspondant is to ensure IPFS-Cluster is pinning the latest files created and updated on the author's file system.

When the root CID of the file system changes it should also unpin the old one so that the garbage collector can remove deleted files.

A watch (with debounce) of the filesystem is used instead of an interval timer for the event loop since it will enable changes to be corresponded immediately without consuming resources unnecessarily.

Correspondant Flow State​

Correspondant Flow Chart Implementation

Correspondant Flow Chart Implementation

Newsroom Flow State​

Newsroom FLow Chart Implementation

Newsroom FLow Chart Implementation

Docker-Compose​

In order to access ipfs-cluster-ctl and ipfs from the command line, the correspondant and newsroom will be bundled in the same image as ipfs-cluster-ctl and IPFS.

A separate service will be defined for:

  • newsroom

  • correspondant

  • IPFS

  • ipfs-cluster-ctl

  • ipfs-cluster-service

The docker setup for the IPFS components can be followed from the IPFS-Cluster documentation.

The IPFS components should be listed as a dependency of the correspondant and newsroom.

Future​

Performance Optimizations​

  • a scheduler might be used to prioritize fula-api latency over syncing

  • since the correspondant knows what file/folder changed, it might rebuild the DAG bottom up instead of top down

  • further research needs to be put into how ipfs get works to see if entire contents of the DAG are copied to /fx or only the parts that change

    • if the former is true, since we know the old DAG, we could walk them both ourselves skipping the CIDs that are the same

    • this may be necessary for handling removal of files anyway

Connectivity Research​

The main goal is to remove the connectivity pre-condition from this use case so it will work from any device over the vast majority of network topologies.

The following issues are related to this:

Possibilities​

Data types​

Although this use case is focused on syncing plaintext (eg/ UTF-8 encoded) files it could also cover other documents that IPFS and IPFS-Cluster handles well out of the box such as photos and video.

Person-person Collaboration​

With the addition of an authentication and ACL layer:

  • two different Box owners could share a document with each other and perform real-time edits on it. They might add a third person as reviewer with read-only access

  • a group of people might create a shared album where certain members have the ability to upload photos and others are only allowed to view them (or vice versa)

- - + + \ No newline at end of file diff --git a/RFCs/fula-sec.html b/RFCs/fula-sec.html index b1d48cbf..d7fe205d 100644 --- a/RFCs/fula-sec.html +++ b/RFCs/fula-sec.html @@ -5,13 +5,13 @@ FULA Security Layer | Functionland - - + +
Skip to main content

FULA Security Layer

Overview​

Authentication and encrypted data storage are the main structural elements for decentralized networks and Web3 applications. By default, IPFS does not encrypt the data persisted to it. This means that if someone has a CID, they can access the data without the author's permission. The fula-sec layer aims to solve this, so that data owners can have full control over how their data is accessed.

The fula-sec layer is broken down into the following fundamental building blocks:

What Security Protocols Implemented​

We aim not only to encrypt the data, but also to verify its valid data and use a key exchange mechanism. The key exchange mechanism remains the DID (Decentrilized Identity) mechanism. In the table below, you can see which algorithm was used for what purpose.

KeywordObjectiveDescription
Ed25519Used to obtain user IdentityEdwards-curve Digital Signature Algorithm(EdDSA)
AESUsed by the client side to encrypt each content. The keys are shared only by authorized audience. The keys are not given to audience in a straightforward manner, of course.Advanced Encryption Standard Algorithm (AES)
JWSJWS includes the Signing option. It has two method sign the payload and verify a signed data. A JSON Web Signature (abbreviated JWS) is an IETF-proposed standard (RFC 7515) for signing arbitrary data.
JWEAn encrypted JWE object for one or multiple DIDs.JSON Web Encryption (JWE) is an IETF standard providing a standardised syntax for the exchange of encrypted data, based on JSON and Base64.
RSARSA involves a public key and a private key. The public key can be known by everyone and is used for encrypting messages. The intention is that messages encrypted with the public key can only be decrypted by using the private key.Rivest–Shamir–Adleman.

Unresolved questions​

  • Content Access Revoke
  • Storing DID document in L3 blockchain

Future possibilities​

  • A box owner can associate multiple peer addresses with a DID.
- - + + \ No newline at end of file diff --git a/RFCs/fula-sec/did.html b/RFCs/fula-sec/did.html index 056d045a..6346d212 100644 --- a/RFCs/fula-sec/did.html +++ b/RFCs/fula-sec/did.html @@ -5,14 +5,14 @@ Decentralized Identity (DID) | Functionland - - + +
Skip to main content

Decentralized Identity (DID)

Why DID in FULA?​

DID enables agents to assert their identity so that they can establish trust, privacy and security with other agents in the network without a centralized authority.

What is Required?​

Setting up decentralized identity with providers(blockchain/distributed ledger) usually consists of the following elements:

  1. Identity owner: The user who creates their decentralized identity using the identity wallet.
  2. Issuer/Verifier: An entity that issues and verifies identification information. They sign the transaction with their private key.
  3. Blockchain/Distributed Ledger: A decentralized and distributed ledger that provides the mechanism and functions for DID and operation.
  4. DID (Decentralized Identifier): A unique identifier that contains details such as public key, verification information, documents.

Can we achieve creating DID without any providers?​

Yes, but with some flaws. As long as we do not store all operations with DID on a ledger verified by an acceptable number of other nodes, security of the data will be lost. Moreover, data storage in blockchain/distributed ledger mechanism is immutable and permanent, and hence, modification and deletion are not possible. The decentralized identity systems use this mechanism so that no external entity can tamper or modify the data.

How does it work?​

  1. Create DID identity - With Create DID, we will have a DID identity and two secret keys options for backup.

create-did

Create DID identity flow


  1. Recover DID identity - We need a mnemonic or private key to restore identity.

recover-did

Recover DID identity flow

See here for DID reference implementation.

- - + + \ No newline at end of file diff --git a/RFCs/fula-sec/encryption.html b/RFCs/fula-sec/encryption.html index 57d453ef..5809ab68 100644 --- a/RFCs/fula-sec/encryption.html +++ b/RFCs/fula-sec/encryption.html @@ -5,13 +5,13 @@ Two-way Encryption Mechanism | Functionland - - + +
Skip to main content

Two-way Encryption Mechanism

Summary​

There are two scenarios that require encryption

  1. Tagged DID encryption
  2. Asymmetric Encryption - Encrypt the subscriber/audience's public key.

Tagged Encryption​

Encrypt data by adding a DID.

Tagged encryption works according to the following steps:

  1. Each agent must have a generated DID address.

  2. Alice uses a unique symmetric key (sKn) for encrypting each piece of content and each file while streaming to the Box.

  3. After the file has been successfully stored to the IPFS node, it returns the CID for each encrypted file to Alice.

  4. Alice now gives Bob access to the file by issuing him a JWE Doc with BOB`s DID address, symmetric key (sK1) and CID

  5. Bob decrypts the document using his own DID address and then obtains the symmetric key (sK1) to get the file that belongs to Alice. As a result, BOB gets the CID and sends a request to the Box.

  6. Bob decrypts the data with sK1 while streaming it from the Box.

tagged-encryption

Tagged Encryption Sequence Diagram

See here for tagged encryption sample code.

Asymmetric Encryption​

With assymetric encryption, no one needs to share DID identity with others, they just need to know a PubKey.

Asymmetric Encryption works according to the following steps:

  1. First, each application must have a generated DID address and PublicKey.

  2. Alice uses a unique symmetric key (sKn) for encrypting each piece of content and each file while streaming to the Box.

  3. After the file has been successfully stored to the IPFS node, it returns the CID for each encrypted file to Alice.

  4. Alice now gives Bob access to the file by issuing him a JWE Doc with BOB`s PubKey, symmetric key (sK1) and CID.

  5. Bob decrypts the document using his own PrivateKey and then obtains the symmetric key (sK1) to get the file that belongs to Alice. As a result, BOB gets the CID and sends a request to the Box.

  6. Bob decrypts data with sK1 while streaming it from the Box.

Assymetric Encryption Sequence Diagram

Tagged Encryption Sequence Diagram

See here for assymetric encryption sample code.

References​

- - + + \ No newline at end of file diff --git a/RFCs/personal-data-reserve.html b/RFCs/personal-data-reserve.html index 68106114..cbeb66f9 100644 --- a/RFCs/personal-data-reserve.html +++ b/RFCs/personal-data-reserve.html @@ -5,13 +5,13 @@ Personal Data Reserve | Functionland - - + +
Skip to main content

Personal Data Reserve

Summary​

This RFC covers how a Box customer's data can be replicated across a group of Boxes physically separated from each other to help prevent unwanted loss.

Use Case​

A person owns 3-5 Boxes (eg/ one in their home, one at their office and one at a friend's house).

Their basement floods bricking the one located in their home.

They are still able to access all of the data that was uploaded to their bricked home Box from one of their other Boxes or a brand new Box provisioned with factory settings.

The following scenarios are handled:

  • adding a new Box to the reserve

  • removing a Box from the reserve

  • data becomes corrupted on a Box

Terminology​

NameDefinition
reservea group of keepers collaboratively working together to back up a snapshot
snapshota collection of data that represents the entire file system being backed up at a given moment in time
chunka portion of a data set
keepera Box process responsible for backing up a file system to the reserve
retrievera Box process given the task of rebuilding a usable file system from a snapshot
authorthe Box where the backed up data set was created
peera member of the reserve
replication factorhow many keepers a chunk of data is stored on; a greater replication factor means greater resilience
data seta file, directory, or data from a database
warning time windowhow much time should be given to send an alert before an imminent limitation is encountered and a system failure occurs

Pre-conditions​

  • the owner has already authenticated themselves with each Box

  • the fula-api is persisting data to a disk accessible by the keeper

  • each Box is already provisioned with the necessary configuration info required to operate a reserve

Assumptions​

  • each keeper in a reserve can be trusted to not operate maliciously by performing unwanted delete operations

  • the data being backed up is:

    • multimedia files such as photos and video
    • orbit db metadata
    • plain text files for shared configuration data

Out of Scope​

  • high-frequency updates to data sets which might be encountered with multi-tenancy or recording streaming video

  • syncing of data between Boxes so that it is usable on each Box (eg/ CRUD operations on them in real time)

  • conflicts arising from concurrent updates initiated by a user on several different Boxes

  • heuristics used to minimize bandwidth and improve availability

Limitations​

The following limitations may be encountered while operating a reserve:

  • file size
  • number of files in a directory
  • snapshot size
  • number of keepers in a reserve

Configuration​

Configuration data for each peer can be split into local and shared.

Local Configuration​

  • local Box address

  • local public/private key

Shared Configuration​

  • remote Box addresses of other peers in the reserve

  • shared secret

  • minimum acceptable replication factor

  • 'normal' event dispatching frequency

  • warning time window

    • has a global default as well as an override for each limitation

Conflict Resolution​

Although it can be assumed the snapshot is already free from conflicts caused by concurrent updates initiated from a user, conflicts may still arise from disk corruption or other unforseen keeper errors.

The disputing keepers will take the appropriate steps to resolve the conflict. If an appropriate resolution can not be achieved, an event is raised.

Events​

The following events are dispatched for an administrative UI.

  • limitation imminent

  • limitation encountered

  • keeper health

    • memory
    • disk I/O
    • CPU usage
    • disk corruption
  • unresolved conflict

  • unacceptable replication factor

  • keeper added / removed

  • network disruption

Event Types​

  • normal
  • warning
  • failure

Warnings​

Events dispatched before a failure occurs based on a forecasting heuristic to determine how quickly a limit will be reached.

Event Frequency​

Normal events are dispatched periodically (based on a config param) for historical reporting and warnings|failures are dispatched immediately.

Implementation​

Components​

The components that are needed for this use case are:

  • data set keeper

  • data set retriever

  • event dispatcher

  • file integrity monitor

Event Dispatcher​

A mechanism for dispatching events and queueing them to prevent loss if a peer goes down.

File Integrity Monitoring​

For detecting / handling disk corruption.

A full sweep of the file system is periodically done comparing the contents of chunks on disk with a source of truth.

Network Architecture​

A peer-peer architecture is used over master/slave so that if a single Box goes down the rest of the reserve will still be able to operate normally.

  • any shared config data is stored on each Box

  • any shared state required for the retrieval of a data set is stored on each Box

  • no central servers are used for networking

Drawbacks​

Putting the responsibility of data reliability on Box owners means there is potential for a Box owner to make a mistake and permanently lose their data.

Rationale and alternatives​

An alternative could be to use paid services (cloud storage providers) with their own SLAs to take on the responsibility of data reliability.

If participating in a decentralized storage network (DSN), the Box owner could also purchase a mining component to offset their cost.

There are currently a few drawbacks with this:

  • becoming a storage miner requires a significant upfront investment to cover hardware and staking costs

  • a private reserve will always be more efficient since keepers will not have to worry about the overhead of trusting each other

These options are not mutually exclusive. Offering both options (free and paid) could provide the greatest freedom/flexibility for Box owners.

Dependencies​

  • IPFS Cluster

  • private connections

  • authentication

  • retriever

  • keeper

@TODO - provide links to relevant docs

Unresolved questions​

What is an ideal replication factor?

How can resilience be measured? Markov models?

How can contents of an entire filesystem be efficiently compared with a source of truth?

How can system resources and their limits be calculated?

How can NAT hole punching work in a pnet without any relays?

Should data compression be taken into account?

Future Possibilities​

History​

Storing a history snapshots so an owner can go back in time and recover a data set from a previous state. This could help with data loss due to user errors.

Regions​

A person or group of people may have a large number of Boxes and want to set up geographically grouped regions such that if there is a severe network outage, each region will still be able to recover the entire contents of a snapshot.

- - + + \ No newline at end of file diff --git a/RFCs/private-network.html b/RFCs/private-network.html index 8e4ea8ca..0650a9bf 100644 --- a/RFCs/private-network.html +++ b/RFCs/private-network.html @@ -5,8 +5,8 @@ Private Network | Functionland - - + +
@@ -18,7 +18,7 @@ In the Config we should add to support to load config.json in this format:

{
"nodes": [
"/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ",
"/dnsaddr/bootstrap.libp2p.io/ipfs/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
"/dnsaddr/bootstrap.libp2p.io/ipfs/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa"
]
}

Which will be used for creating js-libp2p-bootstrap config.

FULA-client​

In fula-client We have to change pkey to fulaSecret so:

createClient(config?: Partial<Libp2pOptions & constructorOptions>, pKey = undefined): Promise<Fula>

to

createClient(config?: Partial<Libp2pOptions & constructorOptions>, fulaSecret = undefined): Promise<Fula>

and change connect interface to get a list of peerId`s from:

connect: (peerId: string) => Connection

to

 connect: (peerId: [string]) => Connection

We need to change Connection in the way that:

Case Study​

For dogfooding of new changes we can use a copy of react-gallery and change the BoxConfig to get list of comma seperated peerIds and App should change to pass the list of peerId's to fula-client.

Note: if example repo would be outside mono-repo we can just use branch for describing every functionality.

Alternative approaches​

VPN​

Using VPN for creating the private network.

Disadvantage:

- - + + \ No newline at end of file diff --git a/RFCs/replication.html b/RFCs/replication.html index d77d451f..a8dc71b6 100644 --- a/RFCs/replication.html +++ b/RFCs/replication.html @@ -5,14 +5,14 @@ Replication | Functionland - - + +
Skip to main content

Replication

Summary

When user set up his box he should join/create a public/private pool. in every pool user will pin their data for High availability and replication. and get fula token for keeping the pinset alive.

Motivation

  • user can mine fula and use app's and other futuers.
  • user can have HA on his/her data.

Guide-level explanation

  • there is node call validator that run's on the box and try to keep the pinset alive.
  • the validator use fula-file-protocol to stream pinned data to functionland/box container which keeping the pools data.
  • the validator can get the proof that the data stored and get to consensus of cluster pinset state.
  • joining to the pool most be base on geolocation.

Reference-level explanation

Drawbacks

Rationale and alternatives

Prior art

Unresolved questions

Future possibilities

- - + + \ No newline at end of file diff --git a/RFCs/rfc-process.html b/RFCs/rfc-process.html index 4f32928f..308baff2 100644 --- a/RFCs/rfc-process.html +++ b/RFCs/rfc-process.html @@ -5,13 +5,13 @@ Requests for comments (RFCs) | Functionland - - + +
Skip to main content

Request for comments

What is the RFC process?​

Many changes, including bug fixes and documentation improvements, can be implemented and reviewed via the normal GitHub pull request workflow.

However, some changes though are "substantial", and we ask that these be put through a bit of design process and produce a consensus among community members.

The "RFC" (Request For Comments) process is intended to provide a consistent, controlled path for new features to enter the project, so that all stakeholders and contributors can be confident about the direction the project is evolving in.

When to follow this process​

You should consider using this process if you intend to make "substantial" changes in any Functionland project or the documentation. Here are some examples of things that would benefit from an RFC:

  • A new feature that requires rethinking of something that has already been developed and shipped.
  • A change in the documentation structure in order to enhance readers experience.
  • The introduction of a new idea, concept or convention that is currently not present in Functionland.

The RFC process will help you attract more attention to your proposal, as well as make sure that everybody gets a chance to participate in shaping and polishing your new idea.

About the process​

In short, to get a major feature added to any of Functionland's projects, you would first get the RFC merged into the RFC repo of that project as a markdown file. At that point the RFC is β€˜active’ and may be implemented with the goal of eventual inclusion.

  • Fork the project repository
  • Copy rfcs/template.md to rfcs/0000-my-feature/README.md (where my-feature is descriptive, don't ask for an RFC number yet)
  • Put any accompanying resources (pictures, etc.) in rfcs/0000-my-feature/. You can refer to these in the text.
  • Fill in the RFC. Details matter! Remember: RFCs that lack convincing motivation, fail to demonstrate understanding of the impact of the design, or are disingenuous about the drawbacks or alternatives tend to be poorly received.
  • Submit a pull request. As a pull request, the RFC will receive design feedback from the broader community. The author should be prepared to revise it in response to their feedback.
  • Build consensus and integrate feedback. RFCs that have broad support are much more likely to make progress than those that don't receive any comments.
  • The community will discuss the RFC pull request in the comment thread of the pull request itself as much as possible. Offline discussion will be summarized on the pull request comment thread.
  • RFCs rarely go through this process unchanged, especially as members of the broader community identify alternatives and drawbacks. You can make edits, big and small, to the RFC to clarify or change the design, but make changes as new commits to the pull request, and leave a comment on the pull request explaining your changes. Specifically, do not squash or rebase commits after they are visible on the pull request.
  • At some point, a member will propose a "motion for final comment period" (FCP), along with a disposition for the RFC (merge, close, or postpone).
    • For RFCs with lengthy discussion, the motion to FCP is usually preceded by a summary comment that attempts to map the current state of the discussion including major tradeoffs and/or points of disagreement.
  • The FCP lasts ten (10) calendar days, guaranteeing it remains open for at least five (5) business days. This allows stakeholders the opportunity to submit any final objections before a decision is reached.
  • In most cases the FCP period is quiet, and the RFC is either merged or closed. However, sometimes substantial new arguments or ideas are raised, the FCP is canceled, and the RFC returns to development mode.
- - + + \ No newline at end of file diff --git a/api-intro.html b/api-intro.html index 0acf40f0..59a6f5ea 100644 --- a/api-intro.html +++ b/api-intro.html @@ -5,13 +5,13 @@ Fula API | Functionland - - + +
Skip to main content

Fula API

We designed Fula API to help you (a third-party, open-source developer) build other rich and compelling user experiences.

Want to get your hands dirty right away? Head over to getting started.

If you're the kind of person who likes to read the entire manual before starting the engine, then visit the Fula Reference API.

- - + + \ No newline at end of file diff --git a/api/client-instance.html b/api/client-instance.html index 88006b2e..a804438b 100644 --- a/api/client-instance.html +++ b/api/client-instance.html @@ -5,13 +5,13 @@ Client Instance | Functionland - - + +
Skip to main content

Client Instance

Fula client package provides a method createClient that returns client instance. You can use this object to call File and Data APIs.

The client instance is basically a wrapper around a libp2p node. It abstracts away the protocol layer and makes it easier to communicate over libp2p with Fula's File and Graph protocols.

In addition to File and Data APIs, the client instance provides access to the underlying libp2p node. It also maintains the connection between client and the Box and provides a reconnecting mechanism.

You can find below basic methods for working with the client instance.

Create a new client instance​

You can use the createClient method to create a new client instance.

async createClient(config?, pKey=undefined)

Arguments are:

  • config?: The configuration object that gets passed directly to the underlying libp2p node. See here for more information
  • pkey: The private key used for securing the connection. Fula client is currently using NOISE as the connection encryptor, if you want to change that in config, make sure you provide appropriate arguments.

The method resolves to a Fula instance.

Example:

import {createClient} from '@functionland/fula'
const client = await createClient()

Connect to Box​

In order to use the different APIs provided by the Fula client, you must connect a client instance to a Box app using the connect method.

async connect(serverId)

Arguments are:

  • serverId: The base58 PeerID string provided by Box app or any other libp2p node supporting File and Graph protocols.

Example:

const serverId = '12D3KooWBFCDpMyEmyAAAAY6PiQw2vaM35ChTZ8ZmVUe8GFRMUrt' // copied from box app
await client.connect(serverId)

Close a connection​

You can disconnect an already connected client instance using the close method. This will close the connection and stops the libp2p node.

async close()

Example:

await client.close()

Access to Libp2p node​

As mentioned earlier, the Fula client is a wrapper around a libp2p node abstracting away the protocol layer and providing APIs to communicate over File and Graph protocols. If you want to do more specific configurations, access the libp2p cache, or access other interfaces, you can use the getNode method.

getNode()

This method returns a Libp2p node.

Example:

const libp2pNode = client.getNode()
console.log(libp2pNode.multiaddrs)
// [ <Multiaddr 047f00000106f9ba - /ip4/127.0.0.1/tcp/63930> ]
WIP Alert

Please note: these instructions remain a work in progress as we continue to evolve, refine and perfect the Fula API. Make sure to check back soon for more details!

- - + + \ No newline at end of file diff --git a/api/file-api.html b/api/file-api.html index 4978bd68..5e2ebf39 100644 --- a/api/file-api.html +++ b/api/file-api.html @@ -5,15 +5,15 @@ File API | Functionland - - + +
Skip to main content

File API (Object Store)

File API provides an interface-like object store for you to upload files and streams (eg. photos, videos or any type of document) and efficiently retrieve them for use in your web/mobile DApp.

File protocol is based on object stores. When you upload something, a CID is created and returned to you and the file gets stored in an IPFS compatible datastore.

Upload​

SendFile​

sendFile(File) => Promise<FileId>

sendFile will take a File as an argument and return a Promise. If the upload completes successfully, a Promise will return a FileId that is a string representing the CID of uploaded content.

Example​

import {Fula, createClient} from '@functionland/fula';

const fulaClient = await createClient();
await fulaClient.connect(serverId);
...
const selectedFile = document.getElementById('input').files[0];
const id = await fulaClient.sendFile(selectedFile);

sendStreamFile​

sendStreamFile(source, meta) => Promise<FileId>

sendStreamFile will take a source and meta as argument and return a Promise. If upload is done successfully, a Promise will return a FileId that is a string representing the CID of uploaded content. (This is useful when you're working with stream or outside the browser.)

  • source: AsyncIterable<Uint8Array>
  • meta: {name,type,lastModified,size}

Example​

import {Fula, createClient} from '@functionland/fula';

const fulaClient = await createClient();
await fulaClient.connect(serverId);
...
export async function* fileToAsyncItrable(file:File) {
const reader = (file.stream()).getReader();
while (true) {
const {value, done} = await reader.read();
if (done) {
break;
}
yield value;
}
}
const selectedFile = document.getElementById('input').files[0];
const id = await fulaClient.sendStreamFile(fileToAsyncItrable(selectedFile),
{
name: selectedFile.name,
type: selectedFile.type,
size: selectedFile.size,
lastModified: selectedFile.lastModified
});

Download​

receiveFile​

(fileId: FileId) => Promise<File>

receiveFile will take FileId and return Promise. if file retrieved successfully Promise return a File

  • fileId: FileId

Example​

import {Fula, createClient} from '@functionland/fula';

const fulaClient = await createClient();
await fulaClient.connect(serverId);
...
const data = await fulaClient.receiveFile(fileId);

receiveMeta​

(fileId: FileId) => Promise<Meta>

receiveMeta will take FileId and return Promise. if meta for the file retrieved successfully Promise return a Meta

  • fileId: FileId

Example​

import {Fula, createClient} from '@functionland/fula';

const fulaClient = await createClient();
await fulaClient.connect(serverId);
...
const {name, type, size, lastModified} = await fulaClient.receiveMeta(fileId);

receiveStreamFile​

(fileId: FileId) => Promise<{ source: AsyncIterable<Uint8Array>, meta: Meta }>

receiveStreamFile will take FileId and return a Promise. If the FileId exists, a Promise will return a { source: AsyncIterable<Uint8Array>, meta: Meta }

That source is a stream of content of the file and Meta is the Meta. (This is useful when you're working with a stream or outside of the browser.)

  • fileId: FileId

Example​

import {Fula, createClient} from '@functionland/fula';

const fulaClient = await createClient();
await fulaClient.connect(serverId);
...
const {source, meta} = await fulaClient.receiveStreamFile(fileId);
const {name, type, size, lastModified} = meta;
const content: Array<Uint8Array> = [];
for await (const chunk of source) {
content.push(Uint8Array.from(chunk));
}
const blob = new Blob(content, {type})


WIP Alert

Please note: these instructions remain a work in progress as we continue to evolve, refine and perfect the Fula API. Make sure to check back soon for more details!

- - + + \ No newline at end of file diff --git a/api/graph-api.html b/api/graph-api.html index da07e454..638dc914 100644 --- a/api/graph-api.html +++ b/api/graph-api.html @@ -5,8 +5,8 @@ Graph API | Functionland - - + +
@@ -27,7 +27,7 @@ takes an array of filters.

Example​

This example demonstrates the filter use:

filter: {
and: [
{name: {nin: ["keyvan", "mahdi"]}},
{
or: [
{age: {gt: 45}},
{age: {lt: 15}}
]
}
]
}

Subscription​

Fula client's Graph API provides subscription for queries. You can subscribe to a query's result and get the new result on each change using the graphqlSubscription method.

async function* graphqlSubscribe(query: string, variableValues?: never, operationName?: string)

The interface is almost identical to the graphql method, except that graphqlSubscribe returns an AsyncIterable.

Arguments are:

The method returns an AsyncIterable that generates a new result based on query filters every time the collection is changed.

Example​

const readQuery = `
query {
read(input:{
collection:"profile",
filter:{
age: {gt: 50}
}
}){
id
name
age
}
}
`;

const resultIterator = client.graphqlSubscribe(readQuery)

for await (const res of resultIterator){
console.log(res)
}

WIP Alert

Please note: these instructions remain a work in progress as we continue to evolve, refine and perfect the Fula API. Make sure to check back soon for more details!

- - + + \ No newline at end of file diff --git a/assets/images/raspberrypi-imager-0098395d6b13954a7d9ae647b1ad14dd.png b/assets/images/raspberrypi-imager-0098395d6b13954a7d9ae647b1ad14dd.png new file mode 100644 index 00000000..0af0b4a1 Binary files /dev/null and b/assets/images/raspberrypi-imager-0098395d6b13954a7d9ae647b1ad14dd.png differ diff --git a/assets/images/rpi-shortcircuit-bc7eb70b313a56a44664ff935497ed96.jpg b/assets/images/rpi-shortcircuit-bc7eb70b313a56a44664ff935497ed96.jpg new file mode 100644 index 00000000..908e7c47 Binary files /dev/null and b/assets/images/rpi-shortcircuit-bc7eb70b313a56a44664ff935497ed96.jpg differ diff --git a/assets/images/rpi-usbc-reimage-1ac52347426ee09dc487c4ec047d0ce8.jpg b/assets/images/rpi-usbc-reimage-1ac52347426ee09dc487c4ec047d0ce8.jpg new file mode 100644 index 00000000..ad41a7d9 Binary files /dev/null and b/assets/images/rpi-usbc-reimage-1ac52347426ee09dc487c4ec047d0ce8.jpg differ diff --git a/assets/js/1299eea8.f2bb32e3.js b/assets/js/1299eea8.f2bb32e3.js deleted file mode 100644 index b7df273b..00000000 --- a/assets/js/1299eea8.f2bb32e3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2217],{3399:(e,t,a)=>{a.r(t),a.d(t,{contentTitle:()=>s,default:()=>u,frontMatter:()=>l,metadata:()=>d,toc:()=>p});var i=a(7462),n=(a(7294),a(3905)),o=a(2004),r=a.n(o);const l={title:"Add Storage",id:"add-storage"},s=void 0,d={unversionedId:"functionyard/add-storage",id:"functionyard/add-storage",title:"Add Storage",description:"Compatible Storage Drives",source:"@site/docs/functionyard/add-storage.md",sourceDirName:"functionyard",slug:"/functionyard/add-storage",permalink:"/functionyard/add-storage",tags:[],version:"current",frontMatter:{title:"Add Storage",id:"add-storage"},sidebar:"tutorialSidebar",previous:{title:"FxBlox Lite Plus (RK1)",permalink:"/functionyard/hardware/fxblox-hardware-rk1"},next:{title:"FxBlox App Setup",permalink:"/functionyard/fxblox-app"}},p=[{value:"Compatible Storage Drives",id:"compatible-storage-drives",children:[],level:2},{value:"Install Internal Storage",id:"install-internal-storage",children:[{value:"Install M.2 NVMe drive",id:"install-m2-nvme-drive",children:[],level:3},{value:"Install MicroSD Card",id:"install-microsd-card",children:[],level:3}],level:2},{value:"Install External Storage",id:"install-external-storage",children:[],level:2},{value:"Manually Parition and Format",id:"manually-parition-and-format",children:[{value:"Linux (Terminal) (Recommended)",id:"linux-terminal-recommended",children:[{value:"Video Guide",id:"video-guide",children:[],level:4},{value:"Written Guide",id:"written-guide",children:[],level:4}],level:3},{value:"MacOS (Terminal)",id:"macos-terminal",children:[{value:"Video Guide",id:"video-guide-1",children:[],level:4},{value:"Written Guide",id:"written-guide-1",children:[],level:4},{value:"Example Output",id:"example-output",children:[],level:4}],level:3},{value:"Windows (Free Third-Party App)",id:"windows-free-third-party-app",children:[{value:"Video Guide",id:"video-guide-2",children:[],level:4},{value:"Written Guide",id:"written-guide-2",children:[],level:4}],level:3}],level:2},{value:"Troubleshoot",id:"troubleshoot",children:[],level:2}],m={toc:p};function u(e){let{components:t,...o}=e;return(0,n.kt)("wrapper",(0,i.Z)({},m,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"compatible-storage-drives"},"Compatible Storage Drives"),(0,n.kt)("p",null,"Almost all types of storage mediums are compatible with the FxBlox. The Blox has internal slots for:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://frame.work/marketplace/expansion-cards"},"Framework Storage Expansion Cards")),(0,n.kt)("li",{parentName:"ul"},"MicroSD"),(0,n.kt)("li",{parentName:"ul"},"M.2 NVMe"),(0,n.kt)("li",{parentName:"ul"},"And any internal/external drives via USB-C (or USB-C adaptor)")),(0,n.kt)("p",null,"For the Blox to recognize and use the drive as storage, it must be formatted to ",(0,n.kt)("strong",{parentName:"p"},"ext4"),". This is automatically done for all drives connected to the Blox during the setup. If you want to add more storage after the fact, then you will have to manually partition and format it."),(0,n.kt)("h2",{id:"install-internal-storage"},"Install Internal Storage"),(0,n.kt)("p",null,"To install an NVMe or MicroSD drive, you'll have to open the Blox to gain access to the Single Board Computer (SBC) inside."),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Remove the four black screws of the 3-port USB-C housing."),(0,n.kt)("li",{parentName:"ol"},"Remove the four silver screws on the bottom of the Blox."),(0,n.kt)("li",{parentName:"ol"},"Slowly slide out the SBC."),(0,n.kt)("li",{parentName:"ol"},"Remove light orange cover on the nvme screw mounting point.")),(0,n.kt)("h3",{id:"install-m2-nvme-drive"},"Install M.2 NVMe drive"),(0,n.kt)("p",null,"With nvme drives, there are a lot of options to choose from. Which ever you choose, M.2 NVMe drives are plenty fast enough to maintain a quality speed for reads, writes, and data transfers."),(0,n.kt)("p",null,"To install your first NVMe drive:"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Follow ",(0,n.kt)("a",{parentName:"li",href:"#install-internal-storage"},"steps above to open the case.")),(0,n.kt)("li",{parentName:"ol"},"Insert NVMe drive into M.2 slot at an angle. Make sure no pins are showing."),(0,n.kt)("li",{parentName:"ol"},"Hold drive down, while you screw it into place. (Screw not included with FxBlox)"),(0,n.kt)("li",{parentName:"ol"},"Follow steps in reverse order to put the case back together.")),(0,n.kt)("h3",{id:"install-microsd-card"},"Install MicroSD Card"),(0,n.kt)("p",null,"MicroSD cards have comparitively slow read & write speeds. We don't have enough data to recommend them as a method of storage for Fula net, but it should still be possible to run a high-speed, high-capacity card. The port is located under the wifi card. To access it:"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Follow ",(0,n.kt)("a",{parentName:"li",href:"#install-internal-storage"},"steps above to open the case.")),(0,n.kt)("li",{parentName:"ol"},"Wifi card ",(0,n.kt)("strong",{parentName:"li"},"does not")," need to be removed to insert microsd card. Insert microSD card from the side of the board. "),(0,n.kt)("li",{parentName:"ol"},"Follow steps in reverse order to put the case back together.")),(0,n.kt)("h2",{id:"install-external-storage"},"Install External Storage"),(0,n.kt)("p",null,"You can use any type of drive as long as it can be connected via USB-C cable or adapter. Plug it in to any of the three USB-C ports available on the side of the FxBlox. These include, but not limited to:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"SATA drives (2.5-inch internal SSDs or 3.5-inch internal HDDs)"),(0,n.kt)("li",{parentName:"ul"},"External SSD's or HDDs"),(0,n.kt)("li",{parentName:"ul"},"External NVMe drives"),(0,n.kt)("li",{parentName:"ul"},"Docking stations"),(0,n.kt)("li",{parentName:"ul"},"Hardware RAID arrays"),(0,n.kt)("li",{parentName:"ul"},"etc...")),(0,n.kt)("h2",{id:"manually-parition-and-format"},"Manually Parition and Format"),(0,n.kt)("p",null,"If you want to add additional storage at some point after initial setup. You will need to manually parition and format the drive before it can be used by the FxBlox."),(0,n.kt)("p",null,"You will need to ",(0,n.kt)("strong",{parentName:"p"},"parition 100%")," of the drive and ",(0,n.kt)("strong",{parentName:"p"},"format to ext4"),". To do this on Mac and Linux, you will want to be comfortable with the command line. Windows will require a third party tool."),(0,n.kt)("h3",{id:"linux-terminal-recommended"},"Linux (Terminal) (Recommended)"),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"You do not need a separate Linux computer to do this.")," Although the drive can not be seen in the FxBlox app yet, we can manually format it through the Blox's desktop interface."),(0,n.kt)("p",null,"At this point, your Blox must already have an internet connection, if not please complete the ",(0,n.kt)("a",{parentName:"p",href:"/functionyard/fxblox-app#app-configuration-steps"},"setting up your FxBlox first"),". If completing set is not an option, you can connect an ethernet cable via usb-c. This will allow you to remotely login from another computer with ",(0,n.kt)("inlineCode",{parentName:"p"},"ssh"),". ",(0,n.kt)("a",{parentName:"p",href:"https://fierrolabs.medium.com/how-to-remote-control-your-fxblox-mac-windows-linux-d0771b1565ca"},"Checkout this article"),", made by a community member, for more information on how to do that."),(0,n.kt)("p",null,"Alternatively, you can connect keyboard, video, & mouse. Bottom port is DisplayPort and HDMI compatible on both the CM4 and RK1."),(0,n.kt)("h4",{id:"video-guide"},"Video Guide"),(0,n.kt)("center",null,(0,n.kt)(r(),{controls:!0,url:"https://youtu.be/jAKz-fTesAg",mdxType:"ReactPlayer"})),(0,n.kt)("h4",{id:"written-guide"},"Written Guide"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Connect your drive to the FxBlox"),(0,n.kt)("li",{parentName:"ol"},"Connect to your FxBlox via ",(0,n.kt)("inlineCode",{parentName:"li"},"ssh")," or keyboard, video, & mouse",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"If you have FxBlox Lite (CM4):",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"ssh pi@fulatower"),", password ",(0,n.kt)("inlineCode",{parentName:"li"},"raspberry")))),(0,n.kt)("li",{parentName:"ul"},"If you have FxBlox Lite Plus (RK1):",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"ssh pi@fxblox-rk1"),", password ",(0,n.kt)("inlineCode",{parentName:"li"},"fxblox")))),(0,n.kt)("li",{parentName:"ul"},"When connecting directly, open up Terminal app with ",(0,n.kt)("inlineCode",{parentName:"li"},"Ctrl + Alt + T")))),(0,n.kt)("li",{parentName:"ol"},"Update current packages with ",(0,n.kt)("inlineCode",{parentName:"li"},"sudo apt update && sudo apt upgrade"),". Enter your password.\n:::If it asks to choose between files\nIf it asks to choose (y/n) between two file versions, enter ",(0,n.kt)("inlineCode",{parentName:"li"},"n"),".\n:::"),(0,n.kt)("li",{parentName:"ol"},"Download ",(0,n.kt)("inlineCode",{parentName:"li"},"parted")," app with ",(0,n.kt)("inlineCode",{parentName:"li"},"sudo apt install parted")),(0,n.kt)("li",{parentName:"ol"},"Identify new disk(s) with ",(0,n.kt)("inlineCode",{parentName:"li"},"lsblk"),". External drives will show up as ",(0,n.kt)("inlineCode",{parentName:"li"},"sdX"),". Internal drives would show up as the type of device.")),(0,n.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,n.kt)("div",{parentName:"div",className:"admonition-heading"},(0,n.kt)("h5",{parentName:"div"},(0,n.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,n.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,n.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,n.kt)("div",{parentName:"div",className:"admonition-content"},(0,n.kt)("p",{parentName:"div"},"In the following commands, replace ",(0,n.kt)("inlineCode",{parentName:"p"},"sdx")," with the device name(s) found in the output of the above command. Repeat steps 10-12 for any new drives you have, one at a time."))),(0,n.kt)("ol",{start:6},(0,n.kt)("li",{parentName:"ol"},"Assign your drive the ",(0,n.kt)("inlineCode",{parentName:"li"},"GPT")," partition standard with ",(0,n.kt)("inlineCode",{parentName:"li"},"sudo parted /dev/sdx mklabel gpt")),(0,n.kt)("li",{parentName:"ol"},"Partition your drive with ",(0,n.kt)("inlineCode",{parentName:"li"},"sudo parted -a opt /dev/sdx mkpart primary ext4 0% 100%")),(0,n.kt)("li",{parentName:"ol"},"Format the newly created partition with ",(0,n.kt)("inlineCode",{parentName:"li"},"sudo mkfs.ext4 /dev/sdx1")),(0,n.kt)("li",{parentName:"ol"},"Wait for it to complete. Then restart FxBlox app."),(0,n.kt)("li",{parentName:"ol"},"You should now see that your total maximum storage has increased by the size of the drive you installed. You may also need to hit the refresh button.")),(0,n.kt)("p",null,"If you have any issues, checkout the ",(0,n.kt)("a",{parentName:"p",href:"#troubleshoot"},"Troubleshoot")," section for more information."),(0,n.kt)("h3",{id:"macos-terminal"},"MacOS (Terminal)"),(0,n.kt)("p",null,"Ext4 is a linux standard that MacOS does not support without some third-party help. ",(0,n.kt)("strong",{parentName:"p"},"You will not be able to use the ",(0,n.kt)("inlineCode",{parentName:"strong"},"Disk Utility")," app on Mac, to partition to Ext4"),". We do not need to mount our drive to Mac, we just need to partition and format it. To do so:"),(0,n.kt)("h4",{id:"video-guide-1"},"Video Guide"),(0,n.kt)("center",null,(0,n.kt)(r(),{controls:!0,url:"https://youtu.be/Kmcsxbx4rcY",mdxType:"ReactPlayer"})),(0,n.kt)("h4",{id:"written-guide-1"},"Written Guide"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Start by downloading the ",(0,n.kt)("a",{parentName:"li",href:"https://sourceforge.net/projects/gptfdisk/"},"fdisk command-line tool on sourceforge")),(0,n.kt)("li",{parentName:"ol"},"Install app by double-clicking on the downloaded dpkg file"),(0,n.kt)("li",{parentName:"ol"},"You will not be able to open it, because of Apple security measures. To circumvent them, open ",(0,n.kt)("inlineCode",{parentName:"li"},"Settings")," -> ",(0,n.kt)("inlineCode",{parentName:"li"},"Privacy & Security")," -> ",(0,n.kt)("inlineCode",{parentName:"li"},"Security")),(0,n.kt)("li",{parentName:"ol"},"Click on ",(0,n.kt)("inlineCode",{parentName:"li"},"Allow Anyways")),(0,n.kt)("li",{parentName:"ol"},"Connect drive to Mac, if not already done. Click ",(0,n.kt)("inlineCode",{parentName:"li"},"Allow")," to allow access to drive and now click ",(0,n.kt)("inlineCode",{parentName:"li"},"Ignore")," to keep it discoverable"),(0,n.kt)("li",{parentName:"ol"},"Open up your Terminal app by searching your Applications or search with Spotlight by pressing ",(0,n.kt)("inlineCode",{parentName:"li"},"CMD")," + ",(0,n.kt)("inlineCode",{parentName:"li"},"SPACEBAR"),", then type ",(0,n.kt)("inlineCode",{parentName:"li"},"Terminal")),(0,n.kt)("li",{parentName:"ol"},"Identify disk location with ",(0,n.kt)("inlineCode",{parentName:"li"},"diskutil list"),". You'll want to keep note of the path, it should be something like ",(0,n.kt)("inlineCode",{parentName:"li"},"/dev/disk#")),(0,n.kt)("li",{parentName:"ol"},"Now start command-line utility with ",(0,n.kt)("inlineCode",{parentName:"li"},"sudo gdisk"),". ",(0,n.kt)("strong",{parentName:"li"},"See ",(0,n.kt)("a",{parentName:"strong",href:"#example-output"},"Example Output")," and ",(0,n.kt)("a",{parentName:"strong",href:"#troubleshoot"},"Troubleshoot")," for more information"),"."),(0,n.kt)("li",{parentName:"ol"},"Enter device path found in step 7."),(0,n.kt)("li",{parentName:"ol"},"Hit ",(0,n.kt)("inlineCode",{parentName:"li"},"n"),", to create a new GPT partition",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"If partition already exists, press ",(0,n.kt)("inlineCode",{parentName:"li"},"d")," to delete it."),(0,n.kt)("li",{parentName:"ul"},"if multiple partitions exist, checkout ",(0,n.kt)("a",{parentName:"li",href:"#troubleshoot"},"Troubleshoot")," section."))),(0,n.kt)("li",{parentName:"ol"},"Accept the default partition number by just pressing ",(0,n.kt)("inlineCode",{parentName:"li"},"return/Enter"),"."),(0,n.kt)("li",{parentName:"ol"},"Accept the default starting and ending sectors (creates a partition that spans 100% of the drive) by just pressing ",(0,n.kt)("inlineCode",{parentName:"li"},"return/Enter")),(0,n.kt)("li",{parentName:"ol"},"Enter ",(0,n.kt)("inlineCode",{parentName:"li"},"8300")," for the Hex-code/GUID. This is shortform to select the 'Linux Filesystem'"),(0,n.kt)("li",{parentName:"ol"},"Enter ",(0,n.kt)("inlineCode",{parentName:"li"},"w")," to write table to disk and exit tool"),(0,n.kt)("li",{parentName:"ol"},"Hit ",(0,n.kt)("inlineCode",{parentName:"li"},"y")," to proceed, wait for it to complete, and safely eject and reinsert drive.")),(0,n.kt)("h4",{id:"example-output"},"Example Output"),(0,n.kt)("div",{class:"text--center"},(0,n.kt)("img",{src:"/img/fxyard-network/gdisk-output.jpg",style:{width:700}})),(0,n.kt)("p",null,"After partitioning is complete. Now we can format using the ",(0,n.kt)("inlineCode",{parentName:"p"},"e2fsprogs")," command."),(0,n.kt)("ol",{start:16},(0,n.kt)("li",{parentName:"ol"},"Download with ",(0,n.kt)("inlineCode",{parentName:"li"},"brew install e2fsprogs"),". This might take a while if Brew is not up-to-date."),(0,n.kt)("li",{parentName:"ol"},"Now verify disk path again with ",(0,n.kt)("inlineCode",{parentName:"li"},"diskutil list"),"."),(0,n.kt)("li",{parentName:"ol"},"Run ",(0,n.kt)("inlineCode",{parentName:"li"},"sudo `brew --prefix e2fsprogs`/sbin/mkfs.ext4 /dev/diskXs1"))),(0,n.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,n.kt)("div",{parentName:"div",className:"admonition-heading"},(0,n.kt)("h5",{parentName:"div"},(0,n.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,n.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,n.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"replace the ",(0,n.kt)("inlineCode",{parentName:"h5"},"X")," in ",(0,n.kt)("inlineCode",{parentName:"h5"},"/dev/diskXs1")," with the path found in step 18!")),(0,n.kt)("div",{parentName:"div",className:"admonition-content"})),(0,n.kt)("ol",{start:19},(0,n.kt)("li",{parentName:"ol"},"Wait for it to complete and safely eject drive."),(0,n.kt)("li",{parentName:"ol"},"Connect your drive to the FxBlox."),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("strong",{parentName:"li"},"Close FxBlox app"),". Now open your Fxblox app now and see your total maximum storage increase in the FxBlox app. ")),(0,n.kt)("p",null,"If the drive does not show within the next 5 minutes there maybe a variety of issues occurring. ",(0,n.kt)("strong",{parentName:"p"},"Checkout the ",(0,n.kt)("a",{parentName:"strong",href:"#troubleshoot"},"Troubleshooting")," section for more details.")),(0,n.kt)("h3",{id:"windows-free-third-party-app"},"Windows (Free Third-Party App)"),(0,n.kt)("p",null,"Ext4 is a linux standard that Windows does not support without some third-party help. There are various paid and free options out there, but we recommend ",(0,n.kt)("a",{parentName:"p",href:"https://www.easeus.com/partition-manager/epm-free.html"},"Parition Master Free by EaseUS"),"."),(0,n.kt)("h4",{id:"video-guide-2"},"Video Guide"),(0,n.kt)("center",null,(0,n.kt)(r(),{controls:!0,url:"https://youtu.be/lVuTGof1pGI",mdxType:"ReactPlayer"})),(0,n.kt)("h4",{id:"written-guide-2"},"Written Guide"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Install ",(0,n.kt)("a",{parentName:"p",href:"https://www.easeus.com/partition-manager/epm-free.html"},"Parition Master Free by EaseUS")," if not already done")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Plug in storage device to your Windows computer, if not already done")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Open the app. Select ",(0,n.kt)("inlineCode",{parentName:"p"},"Parition Manager")," from the left sidebar"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"It may immediately recognize the drive and push you to use the Parition Wizard. The partition wizard is a paid service, so if you exit out of that window you can continue to use the app normally (as described below)."))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Select the new drive"))),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"blank drive",src:a(7998).Z,width:"766",height:"96"})),(0,n.kt)("ol",{start:5},(0,n.kt)("li",{parentName:"ol"},"Ensure drive partition type is listed as ",(0,n.kt)("inlineCode",{parentName:"li"},"GPT")," instead of ",(0,n.kt)("inlineCode",{parentName:"li"},"MBR"),".",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"If it is ",(0,n.kt)("strong",{parentName:"li"},"not"),", select drive. Then, in right sidebar, select ",(0,n.kt)("inlineCode",{parentName:"li"},"Initialize to GPT")," to add it to task list queue."),(0,n.kt)("li",{parentName:"ul"},"Optionally, execute task.")))),(0,n.kt)("div",{class:"text--center"},(0,n.kt)("img",{src:"/img/fxyard-network/init-gpt.png"})),(0,n.kt)("ol",{start:6},(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Select unallocated drive, and on the right sidebar, click ",(0,n.kt)("inlineCode",{parentName:"p"},"Create")),(0,n.kt)("div",{class:"text--center"},(0,n.kt)("img",{src:"/img/fxyard-network/r-sidebar.png"}))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Make sure ",(0,n.kt)("inlineCode",{parentName:"p"},"EXT4")," is selected under ",(0,n.kt)("inlineCode",{parentName:"p"},"File system")),(0,n.kt)("div",{class:"text--center"},(0,n.kt)("img",{src:"/img/fxyard-network/partition-config-screen.jpeg",style:{width:700}}))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Click ",(0,n.kt)("inlineCode",{parentName:"p"},"OK"))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Click ",(0,n.kt)("inlineCode",{parentName:"p"},"Execute # Task(s)")," at the bottom of the right sidebar of the main window"))),(0,n.kt)("div",{class:"text--center"},(0,n.kt)("img",{src:"/img/fxyard-network/queue-2.png"})),(0,n.kt)("ol",{start:10},(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Wait for task(s) to complete, then close app and eject drive")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Connect your drive to the FxBlox")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Close FxBlox app if its currently opened, otherwise open your Fxblox app now and see your total maximum storage increase in the FxBlox app."))),(0,n.kt)("h2",{id:"troubleshoot"},"Troubleshoot"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"Drive not recognized in Windows.")," If your windows computer doesn't see the connected drive, try restarting your computer first. Then look into potentially installing drivers for the storage device."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"Storage capacity not updating")," This could be for a variety of issues:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Try closing/opening your app a couple of times, but also press the ",(0,n.kt)("inlineCode",{parentName:"li"},"retry")," buttons a once or twice in between."),(0,n.kt)("li",{parentName:"ul"},"Restart the FxBlox by unplug-plugging it back in."),(0,n.kt)("li",{parentName:"ul"},"The usb3 drive is connected to a usb2 port. On a ",(0,n.kt)("strong",{parentName:"li"},"FxBlox Lite"),", the top two ports are USB2.0 and the bottom is USB3.0. On a ",(0,n.kt)("strong",{parentName:"li"},"FxBlox Lite Plus"),", the top port is USB2.0 and the bottom two are USB3.0."))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"Additional storage devices not showing up under ",(0,n.kt)("inlineCode",{parentName:"strong"},"Device")," Tab.")," This is a known bug, as of app version 1.6.2. Currently, newly added storage gets added to the total instead of as a separate device."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"Parition Exists already (MacOS).")," If a partition exists already, then you will want to delete it first, write to drive, and rerun the command:",(0,n.kt)("ol",{parentName:"li"},(0,n.kt)("li",{parentName:"ol"},"Get to step 9 in the ",(0,n.kt)("em",{parentName:"li"},(0,n.kt)("a",{parentName:"em",href:"#macos-terminal"},"Manually Parition and Format for Mac"))," instructions"),(0,n.kt)("li",{parentName:"ol"},"Hit ",(0,n.kt)("inlineCode",{parentName:"li"},"d"),", to delete partition(s)."),(0,n.kt)("li",{parentName:"ol"},"Hit ",(0,n.kt)("inlineCode",{parentName:"li"},"w"),", confirm by hitting ",(0,n.kt)("inlineCode",{parentName:"li"},"y")," and saving state."),(0,n.kt)("li",{parentName:"ol"},"Continue ",(0,n.kt)("em",{parentName:"li"},(0,n.kt)("a",{parentName:"em",href:"#macos-terminal"},"Manually Parition and Format for Mac"))," instructions, from step 7.")))),(0,n.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,n.kt)("div",{parentName:"div",className:"admonition-heading"},(0,n.kt)("h5",{parentName:"div"},(0,n.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,n.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,n.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,n.kt)("div",{parentName:"div",className:"admonition-content"},(0,n.kt)("p",{parentName:"div"},(0,n.kt)("strong",{parentName:"p"},"Our apps are open-source and built in React Native for cross-platform support. So if you would like to ",(0,n.kt)("a",{parentName:"strong",href:"https://github.com/functionland/fx-components"},"contribute to the project"),", that would be greatly appreciated!")))))}u.isMDXComponent=!0},7998:(e,t,a)=>{a.d(t,{Z:()=>i});const i="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAcHBwcIBwgJCQgMDAsMDBEQDg4QERoSFBIUEhonGB0YGB0YJyMqIiAiKiM+MSsrMT5IPDk8SFdOTldtaG2Pj8ABBwcHBwgHCAkJCAwMCwwMERAODhARGhIUEhQSGicYHRgYHRgnIyoiICIqIz4xKysxPkg8OTxIV05OV21obY+PwP/CABEIAGAC/gMBIgACEQEDEQH/xAAbAAEAAwEBAQEAAAAAAAAAAAAAAgMEAQUGB//aAAgBAQAAAAD8PAAAAAAAAAAAAAAAE4Fn1HmeNv5nacPAAAAAAAAWXT7HJs5jF9E4TWdz2T7n0ZwmhOB9v9HT+cfpH2Hk+RV8B5YAAduoADTtoABDGt++zedl9Xytfv8A5sd+vzVY5+vDvyvu89H5j6arL2yN0vnaIHsa3hbadOe7zOAAAAAAAAs09otyehDCNM67ck7KbJd5mutz30295R2AAAAAAAAAAAAAAAATg23AAAAAAAAAAAAAAAZ88G+wfVel8t5gAABZWupE4AAAFls+xzauZBKMud5wAAozQb7B9n+gU/jN2IAAHffrlpy1aoT+dEJoTQmhNCZb9xmxZfS83R7v56d9e7uff89UAAUZoN9gnrjjAAANFdkJW1O5wAACzR2mzJ6EMQ0tmLufgABRmg23AAAAAAAAAAAAAAAZ88AAAAAAAAAAAAAAAAnAAAAAAAAAAAAAAAAJw//EABcBAQEBAQAAAAAAAAAAAAAAAAABAgP/2gAIAQIQAAAAupAAAAAAAB2zzlAAABZYNRYWWRQAAAAAABKdc4AFsuSgISqQBKVABSAAAqAEAAAAAAAA/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAECA//aAAgBAxAAAABFAAAAAAAHLWqAAEAolJUpKEAAAAAAAFhzuwAJQAAlAFhFAAAAAABQAAAAAAAP/8QAMhAAAgEDAwAJBAEDBQAAAAAAAgMEAQUSABMUBhARICIjJDIzFSFAYAclUFUWMDRCYf/aAAgBAQABDAD9er8Y9xSmuaK1iRlToZd8fdHpq52G4W0RY4aVXqLarlMVnEt8h61Wy4OY9S4LjYhD5D1oSsmMkR3xXtQ5VVsi2q5TFNOJb5D1/wBxolu1u7ZbdYM4Y3L4jqR3W24R0C90GQtMa13KUrOPb5DVqt85z2oXEcxxCQkQkJUKtsuXG5PBkcc7fcFoGSURwJ7jYklIiTozVjoFtZliJV6gW1mWI1PQLawsViRkMSSSt0YzarGJLJW6MZtV6qpuQjtlkqJJcRCuM1hUiS9om8Zu3psSWkRJkZqx7pravESEqaNbV4iQlTqr8Y9zoy1EGMMvg8iQfSrbIgKzdhO6TokKJTrN2ruUcYtwmxh9vR6t5HoBP+lcnlTooytv6j2/VINhtAjYp1sghTX8hWqBDUUtMbfd/GxtXLRQvq1BvgNXebkDiCrPwnrQvHbeLP8Ach8blxuR/wAeV9K5L9n4fQ69Dr0OvQ69Dr0OvQ69Dr0OvQ69Dr0Oj4mJY+7qSveapeQhq4RUD0fJCXx6xb9FiSH3sljIWy4VjXKJLuCxkIZZBJLZMtnbtxKxGWZHIGS0osSNH6SqiSGUYk0SZkm782XJXMAlEpaFk6kjuTsWfVFJ3dx0OCKsmKCmihoLfLaTRdwWoXsiJhdmrK7jtktx7dQ0Kgtbj99W41Cq0j5tHQ6rWNt8095oNEsiEg0wCZcLTiNa6B6nE2IzdAYtBT9PURN5BpQI5ckasm4/1IVsMybCtQyeN4Mi4IoY36erKVGjQd0hjUfo7ZE3yxHsXFhxmI8xCqExaHPiIZGpXRx4xK33bVdTRQMlvH+Ovxj3IN5bDRscZLV/6iL/ABsTVOkZf42JqQ9sh73s+7IV5u9vUS4VylR1hcrgtr2jOdRjb9e3CgWXSWYtulycp6mTpBriXq8wUEiJcpSF1rl4v7jRrdolbpbbbhcHIWhktxpk3O5ShUMmdIaJy5LN/ce09RbhOh7nEluRqtdHeLuxHGKfKqkrpcijcYp0isfuNmy3DgyS0xK4TixylurpkuSwiJj2mQ3GdtbZPMxEyHLEipqjnjj5h6CbLWraGS0F1Y3wjkWpElsghJhdpBNlrUSlyWgtM6WkcEyWrEJstatoZLaL1yH5Ee6eRT5xCtZSW1GrW445FiudOWTSXJaBUawcvMrTQzZYq2hktous6XtbXJbtqmS0lmuS0CNhMImMIjKvxj+wV+MetFPKy/XJFPDlqvxj1p+Me7ZOiNyvCt9ZAqPdugc6ChZx30klJs91ijm6IdB/F2m5YbZZdRIeI5EsqD3BWRZEI9v41FN2t3brt1hyxjcnjN2XW+4JULXRHLWi23CQrOPBkNWqDOc8kLiONxUISISHsKtuuGxyeFI2TgzloF5RHUT3CEhLEhKhaESIhERKpVpj4S+2gAmEIiPaVaY+H8CR7dV+MetPxj3ejHSJlvyQ7eZFDpJYSxIpzdSullmSPl5yClM3JLzxENJjxGRmGycK2fhnT+ttL/rGTExt4FGEyjREEjFilZbQuEVF9hTGjSsh2KI0qimNZ6RKxaKI4zhFAVE4tvWrAiChEKljdELjCHcprsLLLIcTrl7fBoK4+7x67CyyyHE65e3waCuPu8euwssshxOuXt8Ggrj7vHrsLLLIcTrl7fBoK4+7x67CyyyHEq5e0ezrSvcaoMhDU6MobCSFvj1j3xERz7uS+QBTqouUSXOWMhTLNQltfJZ27cUoxWhe8MhhRY0ZPSJUaQVGJJL5Um6c2XIXMXVRKWhZSKSOumnpF132i+wpjRpWQ8YUaSmNIHLiCvT1ISpYjGowgioElEKlUY752/gSPbqvxj1p+Me6DCWWQl2apcH/APldHNeXhyGn41ZcklbW+3bo1o7fmloZckVYC9tF1c0hx3SxbKkux3Hmeqz52Qly3ZUkyRIj3zy5Una2t89spckh2ye2o/i0Y3aJeVdts+c5CkMluNMi43CUIjIluaJyZLN3J5nqNOnQ8uPJarVa6O63JiNgp0iqSuVwKNxinOqnuHLlsHBklpict7iVvPawZNyJihBZO0MqSsSWLzoJzJjMcpLa6rX8CR7dV+MetFfKx/XJFfDjqvxj+wV+Mf2Cvxj1f//EADcQAAIBAwIDBgQDBwUAAAAAAAECEQADEiExBBNRECAiQYGxMkBhcQVSYBQjUGJyg5EGFTCC0//aAAgBAQANPwD9PZH2HcZoAGpJrpmdKbTJCSAezKC1u2ziekirClrqhDKKNy1OwVFGpJOgApGKup0KkaEGk+NrdtnC/eP4lljnBxyiYmm0F3A4T0y2poh3tsqmdRBNbZW7bOJ6SKSc7aWyzLGhkCl0IOhBGkGsZ5vLbCOuW1NBFw2yEIOxDHutsXQqD2KsmNYG0nsVSTAJgDcmK1MAE6DUnSvzhCV0+ta+MISum+vY0QIMmdoFLuEQtFLMtgYEaGexti6FQe8ygj7ESDTKCPsRIPZkfYdy/wAQ9lP3gTEKF6g75UrEEftA3H/Sn0I54On2wq1xFxBO8KxAr/dEj9nyzjH+Sk/03efisLhttkIxFzAiatcVwQ4q5dN5L6XWYSMW8JU1xX4hfN3jMzFshtLMUeI/cfs4nhC8am/S8VdDlNFLZGY+T84BWP8AP/Jzk5v9E+KIrmNy/i+GfDM16161616161616161616161615b9rMBk5hRJiTVjjLUMl5HZ5DZMYPxHp0rg8AC7g22tkhAqqAMfpqasNaFxHcPbaRgAkBYIiuDtm5idjcJxUGfqa4v8AEmW6bLhCWgQWkNMSYFJxmDsdmAaJNWrdxyhSVZV1xJyEfaIp/wAFAkw1gJgScgO7jbLh4KESAAsRBq1xCJc5HMOmuQOe5EeVNw5a29svBhwsnMk1aYjPxM7ADc+VJw7GOuo0NcUtzlHzFoIWmm5gtlIKyTHjHmKVrvLUeFHIbYt5TTT5R5wYprNiPrGhp+KdrV1NfExjxDzFcy8iFPEmWUS/UVkfAAesaGm5YuofCqLIOSxM0t62oA5mTCYbOYFJxHJAzeCpEydd6birloBy0KqxAGJGpmuGvNz9TJSMh7RT2bl1INw3IEkH8oAin4NG5skMsJMjygUnD8OoFzMqMlmSLetaEb+YmBMGsj7DucwuBcy0YgAkYFa/vf8ApX90+9yrtxnc/VjJpmkrZvMgJ6mDV9St1xcIZ1O4brVhgbYN5zgV2I1q7c5lxDcYq7/mYHc00kpbvMikncwP4kzBikmCQIBNJGCFyVWNBANJqge4Wg1dYG5Lk5kagtO9Po/Lcpl947MY5ZuMVjpFYgcrmNhA2GO3dXZS5YUsEeM6EbEUy4kkkyu8GsSoUkkKCI0plgxpI6GlUqNToDuBWvgDkLrvSfAJOlKsTqfOZJNNMoHIGu+grojlRWvgDkDXfsZYLSZIIiDSQUGZgEbEVllEmJ60/wAZDkFqf49T4tZ1rXwhyBrvWgwzMQKxCyHIMDYU2pJMk/cmsj7D9QZH2H6gyPsO3Xu5EC48+KN4FM2JUAJH+TS7sPEB94+W/LBnt8Jn+rUd1Vk/QTEn5bLHODjMTE1tzcDhO0ZU0Q72yqmdRBNbZJbZxPSRSzKBCzCNDIFLoQdCD0Irfmcs4R1ypoi4UIUztBPd6HQ9jaADUk10ptAOp+RyrI+w7de7uBbfEoTWhxcXG1ryUIUH+Wp7jNiNlkzApZi0UYltPIiR8pizT/LhM1fkO0kEeKARFNZuOh8ZfwgwdPCNqdeDB9QaTiESQTJDGCDkTqKtKZzNyBrAkAyTTW7Ta5aZRtrTWVZG/eFyxE/041at45yST4hvOmvd6ecdK6muorp5x0rqa6iunnHSuprqK6ecdK6muorp5x0r69OnazAZOYAkxJq1xVmGF5GLkg5Ex5n2rhMAC7g22SQqqqgDH6VYa0txHcOjSMRjAWCIrg7Zu4mYLzigPqa4njmFzkuEMwMS0hp3MCk4zB2OzANEmkt3GKYSrKuuJJIin/CYkwbOOJJnuvcUE/cCk4hE0JkhjBByJ1FLxVtNC2qkmQZNXcvGSdDJUBYNWuKtKeXmdyZBL1kff5DKsj7Dt17/ANPlvyZmKT4NT4dZ0rXw5mNd600k+W1LtJJil0BzOgNMuJMmSNoNfkkxWMYlyRHyzMCVkwSNATSRghclVjQQDSaoHuFoNXWBuSSciNiZp9H5blJ+8dmMcs3CVgeUVjHL5hwjpHd/KXJGlL5FzWQbO5czaRsAREU0yASAZ3mlgiXJgjYj5HKsj7D9QZH2H6gyPsP1BkfYdn//xAAqEQEAAgECAwUJAAAAAAAAAAABABECMWEQITASQlBRwSJAQWCBkqHR0v/aAAgBAgEBPwCGK6ERNfD8cwAtmeRlVTLne/8APZmXP7l+jXKPPIdq95fPeXrO8JoVO7W3onrxs4Xt8KlkGq2RhQEGXpLilVFtXxXHASZY1XTqVKlM/V9TznexJfs9ra/wvpxrg8q6opoxV1+XP//EACkRAAEDAgMGBwAAAAAAAAAAAAEAAhEhMTBh0RASQUJQUSBAYHGRocL/2gAIAQMBAT8ARcBcoEG3T3NO9ZMbCaIj3/W8m0v2H1KFA7M+Qis4Iouyu0iVzTnpp4QFCNZzCNZRUbOKFuqlxBTXE3xpWsYYXALgSuaM4n41299gscWAbhAAenP/2Q=="}}]); \ No newline at end of file diff --git a/assets/js/1299eea8.f3cc2b87.js b/assets/js/1299eea8.f3cc2b87.js new file mode 100644 index 00000000..fec4590e --- /dev/null +++ b/assets/js/1299eea8.f3cc2b87.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2217],{3399:(e,t,a)=>{a.r(t),a.d(t,{contentTitle:()=>s,default:()=>u,frontMatter:()=>l,metadata:()=>d,toc:()=>p});var i=a(7462),n=(a(7294),a(3905)),o=a(2004),r=a.n(o);const l={title:"Add Storage",id:"add-storage"},s=void 0,d={unversionedId:"functionyard/add-storage",id:"functionyard/add-storage",title:"Add Storage",description:"Compatible Storage Drives",source:"@site/docs/functionyard/add-storage.md",sourceDirName:"functionyard",slug:"/functionyard/add-storage",permalink:"/functionyard/add-storage",tags:[],version:"current",frontMatter:{title:"Add Storage",id:"add-storage"},sidebar:"tutorialSidebar",previous:{title:"FxBlox Lite Plus (RK1)",permalink:"/functionyard/hardware/fxblox-hardware-rk1"},next:{title:"FxBlox App Setup",permalink:"/functionyard/fxblox-app"}},p=[{value:"Compatible Storage Drives",id:"compatible-storage-drives",children:[],level:2},{value:"Install Internal Storage",id:"install-internal-storage",children:[{value:"Install M.2 NVMe drive",id:"install-m2-nvme-drive",children:[],level:3},{value:"Install MicroSD Card",id:"install-microsd-card",children:[],level:3}],level:2},{value:"Install External Storage",id:"install-external-storage",children:[],level:2},{value:"Manually Partition and Format",id:"manually-partition-and-format",children:[{value:"Linux (Terminal) (Recommended)",id:"linux-terminal-recommended",children:[{value:"Video Guide",id:"video-guide",children:[],level:4},{value:"Written Guide",id:"written-guide",children:[],level:4}],level:3},{value:"MacOS (Terminal)",id:"macos-terminal",children:[{value:"Video Guide",id:"video-guide-1",children:[],level:4},{value:"Written Guide",id:"written-guide-1",children:[],level:4},{value:"Example Output",id:"example-output",children:[],level:4}],level:3},{value:"Windows (Free Third-Party App)",id:"windows-free-third-party-app",children:[{value:"Video Guide",id:"video-guide-2",children:[],level:4},{value:"Written Guide",id:"written-guide-2",children:[],level:4}],level:3}],level:2},{value:"Troubleshoot",id:"troubleshoot",children:[],level:2}],m={toc:p};function u(e){let{components:t,...o}=e;return(0,n.kt)("wrapper",(0,i.Z)({},m,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"compatible-storage-drives"},"Compatible Storage Drives"),(0,n.kt)("p",null,"Almost all types of storage mediums are compatible with the FxBlox. The Blox has internal slots for:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://frame.work/marketplace/expansion-cards"},"Framework Storage Expansion Cards")),(0,n.kt)("li",{parentName:"ul"},"MicroSD"),(0,n.kt)("li",{parentName:"ul"},"M.2 NVMe"),(0,n.kt)("li",{parentName:"ul"},"And any internal/external drives via USB-C (or USB-C adaptor)")),(0,n.kt)("p",null,"For the Blox to recognize and use the drive as storage, it must be formatted to ",(0,n.kt)("strong",{parentName:"p"},"ext4"),". This is automatically done for all drives connected to the Blox during the setup. If you want to add more storage after the fact, then you will have to manually partition and format it."),(0,n.kt)("h2",{id:"install-internal-storage"},"Install Internal Storage"),(0,n.kt)("p",null,"To install an NVMe or MicroSD drive, you'll have to open the Blox to gain access to the Single Board Computer (SBC) inside."),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Remove the four black screws of the 3-port USB-C housing."),(0,n.kt)("li",{parentName:"ol"},"Remove the four silver screws on the bottom of the Blox."),(0,n.kt)("li",{parentName:"ol"},"Slowly slide out the SBC."),(0,n.kt)("li",{parentName:"ol"},"Remove light orange cover on the nvme screw mounting point.")),(0,n.kt)("h3",{id:"install-m2-nvme-drive"},"Install M.2 NVMe drive"),(0,n.kt)("p",null,"With nvme drives, there are a lot of options to choose from. Which ever you choose, M.2 NVMe drives are plenty fast enough to maintain a quality speed for reads, writes, and data transfers."),(0,n.kt)("p",null,"To install your first NVMe drive:"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Follow ",(0,n.kt)("a",{parentName:"li",href:"#install-internal-storage"},"steps above to open the case.")),(0,n.kt)("li",{parentName:"ol"},"Insert NVMe drive into M.2 slot at an angle. Make sure no pins are showing."),(0,n.kt)("li",{parentName:"ol"},"Hold drive down, while you screw it into place. (Screw not included with FxBlox)"),(0,n.kt)("li",{parentName:"ol"},"Follow steps in reverse order to put the case back together.")),(0,n.kt)("h3",{id:"install-microsd-card"},"Install MicroSD Card"),(0,n.kt)("p",null,"MicroSD cards have comparatively slow read & write speeds. We don't have enough data to recommend them as a method of storage for Fula net, but it should still be possible to run a high-speed, high-capacity card. The port is located under the wifi card. To access it:"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Follow ",(0,n.kt)("a",{parentName:"li",href:"#install-internal-storage"},"steps above to open the case.")),(0,n.kt)("li",{parentName:"ol"},"Wifi card ",(0,n.kt)("strong",{parentName:"li"},"does not")," need to be removed to insert microSD card. Insert microSD card from the side of the board. "),(0,n.kt)("li",{parentName:"ol"},"Follow steps in reverse order to put the case back together.")),(0,n.kt)("h2",{id:"install-external-storage"},"Install External Storage"),(0,n.kt)("p",null,"You can use any type of drive as long as it can be connected via USB-C cable or adapter. Plug it in to any of the three USB-C ports available on the side of the FxBlox. These include, but not limited to:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"SATA drives (2.5-inch internal SSDs or 3.5-inch internal HDDs)"),(0,n.kt)("li",{parentName:"ul"},"External SSD's or HDDs"),(0,n.kt)("li",{parentName:"ul"},"External NVMe drives"),(0,n.kt)("li",{parentName:"ul"},"Docking stations"),(0,n.kt)("li",{parentName:"ul"},"Hardware RAID arrays"),(0,n.kt)("li",{parentName:"ul"},"etc...")),(0,n.kt)("h2",{id:"manually-partition-and-format"},"Manually Partition and Format"),(0,n.kt)("p",null,"If you want to add additional storage at some point after initial setup. You will need to manually partition and format the drive before it can be used by the FxBlox."),(0,n.kt)("p",null,"You will need to ",(0,n.kt)("strong",{parentName:"p"},"partition 100%")," of the drive and ",(0,n.kt)("strong",{parentName:"p"},"format to ext4"),". To do this on Mac and Linux, you will want to be comfortable with the command line. Windows will require a third party tool."),(0,n.kt)("h3",{id:"linux-terminal-recommended"},"Linux (Terminal) (Recommended)"),(0,n.kt)("p",null,(0,n.kt)("strong",{parentName:"p"},"You do not need a separate Linux computer to do this.")," Although the drive can not be seen in the FxBlox app yet, we can manually format it through the Blox's desktop interface."),(0,n.kt)("p",null,"At this point, your Blox must already have an internet connection, if not please complete the ",(0,n.kt)("a",{parentName:"p",href:"/functionyard/fxblox-app#app-configuration-steps"},"setting up your FxBlox first"),". If completing set is not an option, you can connect an ethernet cable via usb-c. This will allow you to remotely login from another computer with ",(0,n.kt)("inlineCode",{parentName:"p"},"ssh"),". ",(0,n.kt)("a",{parentName:"p",href:"https://fierrolabs.medium.com/how-to-remote-control-your-fxblox-mac-windows-linux-d0771b1565ca"},"Checkout this article"),", made by a community member, for more information on how to do that."),(0,n.kt)("p",null,"Alternatively, you can connect keyboard, video, & mouse. Bottom port is DisplayPort and HDMI compatible on both the CM4 and RK1."),(0,n.kt)("h4",{id:"video-guide"},"Video Guide"),(0,n.kt)("center",null,(0,n.kt)(r(),{controls:!0,url:"https://youtu.be/jAKz-fTesAg",mdxType:"ReactPlayer"})),(0,n.kt)("h4",{id:"written-guide"},"Written Guide"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Connect your drive to the FxBlox"),(0,n.kt)("li",{parentName:"ol"},"Connect to your FxBlox via ",(0,n.kt)("inlineCode",{parentName:"li"},"ssh")," or keyboard, video, & mouse",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"If you have FxBlox Lite (CM4):",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"ssh pi@fulatower"),", password ",(0,n.kt)("inlineCode",{parentName:"li"},"raspberry")))),(0,n.kt)("li",{parentName:"ul"},"If you have FxBlox Lite Plus (RK1):",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"ssh pi@fxblox-rk1"),", password ",(0,n.kt)("inlineCode",{parentName:"li"},"fxblox")))),(0,n.kt)("li",{parentName:"ul"},"When connecting directly, open up Terminal app with ",(0,n.kt)("inlineCode",{parentName:"li"},"Ctrl + Alt + T")))),(0,n.kt)("li",{parentName:"ol"},"Update current packages with ",(0,n.kt)("inlineCode",{parentName:"li"},"sudo apt update && sudo apt upgrade"),". Enter your password.\n:::If it asks to choose between files\nIf it asks to choose (y/n) between two file versions, enter ",(0,n.kt)("inlineCode",{parentName:"li"},"n"),".\n:::"),(0,n.kt)("li",{parentName:"ol"},"Download ",(0,n.kt)("inlineCode",{parentName:"li"},"parted")," app with ",(0,n.kt)("inlineCode",{parentName:"li"},"sudo apt install parted")),(0,n.kt)("li",{parentName:"ol"},"Identify new disk(s) with ",(0,n.kt)("inlineCode",{parentName:"li"},"lsblk"),". External drives will show up as ",(0,n.kt)("inlineCode",{parentName:"li"},"sdX"),". Internal drives would show up as the type of device.")),(0,n.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,n.kt)("div",{parentName:"div",className:"admonition-heading"},(0,n.kt)("h5",{parentName:"div"},(0,n.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,n.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,n.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,n.kt)("div",{parentName:"div",className:"admonition-content"},(0,n.kt)("p",{parentName:"div"},"In the following commands, replace ",(0,n.kt)("inlineCode",{parentName:"p"},"sdx")," with the device name(s) found in the output of the above command. Repeat steps 10-12 for any new drives you have, one at a time."))),(0,n.kt)("ol",{start:6},(0,n.kt)("li",{parentName:"ol"},"Assign your drive the ",(0,n.kt)("inlineCode",{parentName:"li"},"GPT")," partition standard with ",(0,n.kt)("inlineCode",{parentName:"li"},"sudo parted /dev/sdx mklabel gpt")),(0,n.kt)("li",{parentName:"ol"},"Partition your drive with ",(0,n.kt)("inlineCode",{parentName:"li"},"sudo parted -a opt /dev/sdx mkpart primary ext4 0% 100%")),(0,n.kt)("li",{parentName:"ol"},"Format the newly created partition with ",(0,n.kt)("inlineCode",{parentName:"li"},"sudo mkfs.ext4 /dev/sdx1")),(0,n.kt)("li",{parentName:"ol"},"Wait for it to complete. Then restart FxBlox app."),(0,n.kt)("li",{parentName:"ol"},"You should now see that your total maximum storage has increased by the size of the drive you installed. You may also need to hit the refresh button.")),(0,n.kt)("p",null,"If you have any issues, checkout the ",(0,n.kt)("a",{parentName:"p",href:"#troubleshoot"},"Troubleshoot")," section for more information."),(0,n.kt)("h3",{id:"macos-terminal"},"MacOS (Terminal)"),(0,n.kt)("p",null,"Ext4 is a linux standard that MacOS does not support without some third-party help. ",(0,n.kt)("strong",{parentName:"p"},"You will not be able to use the ",(0,n.kt)("inlineCode",{parentName:"strong"},"Disk Utility")," app on Mac, to partition to Ext4"),". We do not need to mount our drive to Mac, we just need to partition and format it. To do so:"),(0,n.kt)("h4",{id:"video-guide-1"},"Video Guide"),(0,n.kt)("center",null,(0,n.kt)(r(),{controls:!0,url:"https://youtu.be/Kmcsxbx4rcY",mdxType:"ReactPlayer"})),(0,n.kt)("h4",{id:"written-guide-1"},"Written Guide"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},"Start by downloading the ",(0,n.kt)("a",{parentName:"li",href:"https://sourceforge.net/projects/gptfdisk/"},"fdisk command-line tool on sourceforge")),(0,n.kt)("li",{parentName:"ol"},"Install app by double-clicking on the downloaded dpkg file"),(0,n.kt)("li",{parentName:"ol"},"You will not be able to open it, because of Apple security measures. To circumvent them, open ",(0,n.kt)("inlineCode",{parentName:"li"},"Settings")," -> ",(0,n.kt)("inlineCode",{parentName:"li"},"Privacy & Security")," -> ",(0,n.kt)("inlineCode",{parentName:"li"},"Security")),(0,n.kt)("li",{parentName:"ol"},"Click on ",(0,n.kt)("inlineCode",{parentName:"li"},"Allow Anyways")),(0,n.kt)("li",{parentName:"ol"},"Connect drive to Mac, if not already done. Click ",(0,n.kt)("inlineCode",{parentName:"li"},"Allow")," to allow access to drive and now click ",(0,n.kt)("inlineCode",{parentName:"li"},"Ignore")," to keep it discoverable"),(0,n.kt)("li",{parentName:"ol"},"Open up your Terminal app by searching your Applications or search with Spotlight by pressing ",(0,n.kt)("inlineCode",{parentName:"li"},"CMD")," + ",(0,n.kt)("inlineCode",{parentName:"li"},"SPACEBAR"),", then type ",(0,n.kt)("inlineCode",{parentName:"li"},"Terminal")),(0,n.kt)("li",{parentName:"ol"},"Identify disk location with ",(0,n.kt)("inlineCode",{parentName:"li"},"diskutil list"),". You'll want to keep note of the path, it should be something like ",(0,n.kt)("inlineCode",{parentName:"li"},"/dev/disk#")),(0,n.kt)("li",{parentName:"ol"},"Now start command-line utility with ",(0,n.kt)("inlineCode",{parentName:"li"},"sudo gdisk"),". ",(0,n.kt)("strong",{parentName:"li"},"See ",(0,n.kt)("a",{parentName:"strong",href:"#example-output"},"Example Output")," and ",(0,n.kt)("a",{parentName:"strong",href:"#troubleshoot"},"Troubleshoot")," for more information"),"."),(0,n.kt)("li",{parentName:"ol"},"Enter device path found in step 7."),(0,n.kt)("li",{parentName:"ol"},"Hit ",(0,n.kt)("inlineCode",{parentName:"li"},"n"),", to create a new GPT partition",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"If partition already exists, press ",(0,n.kt)("inlineCode",{parentName:"li"},"d")," to delete it."),(0,n.kt)("li",{parentName:"ul"},"if multiple partitions exist, checkout ",(0,n.kt)("a",{parentName:"li",href:"#troubleshoot"},"Troubleshoot")," section."))),(0,n.kt)("li",{parentName:"ol"},"Accept the default partition number by just pressing ",(0,n.kt)("inlineCode",{parentName:"li"},"return/Enter"),"."),(0,n.kt)("li",{parentName:"ol"},"Accept the default starting and ending sectors (creates a partition that spans 100% of the drive) by just pressing ",(0,n.kt)("inlineCode",{parentName:"li"},"return/Enter")),(0,n.kt)("li",{parentName:"ol"},"Enter ",(0,n.kt)("inlineCode",{parentName:"li"},"8300")," for the Hex-code/GUID. This is short form to select the 'Linux Filesystem'"),(0,n.kt)("li",{parentName:"ol"},"Enter ",(0,n.kt)("inlineCode",{parentName:"li"},"w")," to write table to disk and exit tool"),(0,n.kt)("li",{parentName:"ol"},"Hit ",(0,n.kt)("inlineCode",{parentName:"li"},"y")," to proceed, wait for it to complete, and safely eject and reinsert drive.")),(0,n.kt)("h4",{id:"example-output"},"Example Output"),(0,n.kt)("div",{class:"text--center"},(0,n.kt)("img",{src:"/img/fxyard-network/gdisk-output.jpg",style:{width:700}})),(0,n.kt)("p",null,"After partitioning is complete. Now we can format using the ",(0,n.kt)("inlineCode",{parentName:"p"},"e2fsprogs")," command."),(0,n.kt)("ol",{start:16},(0,n.kt)("li",{parentName:"ol"},"Download with ",(0,n.kt)("inlineCode",{parentName:"li"},"brew install e2fsprogs"),". This might take a while if Brew is not up-to-date."),(0,n.kt)("li",{parentName:"ol"},"Now verify disk path again with ",(0,n.kt)("inlineCode",{parentName:"li"},"diskutil list"),"."),(0,n.kt)("li",{parentName:"ol"},"Run ",(0,n.kt)("inlineCode",{parentName:"li"},"sudo `brew --prefix e2fsprogs`/sbin/mkfs.ext4 /dev/diskXs1"))),(0,n.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,n.kt)("div",{parentName:"div",className:"admonition-heading"},(0,n.kt)("h5",{parentName:"div"},(0,n.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,n.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,n.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"replace the ",(0,n.kt)("inlineCode",{parentName:"h5"},"X")," in ",(0,n.kt)("inlineCode",{parentName:"h5"},"/dev/diskXs1")," with the path found in step 18!")),(0,n.kt)("div",{parentName:"div",className:"admonition-content"})),(0,n.kt)("ol",{start:19},(0,n.kt)("li",{parentName:"ol"},"Wait for it to complete and safely eject drive."),(0,n.kt)("li",{parentName:"ol"},"Connect your drive to the FxBlox."),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("strong",{parentName:"li"},"Close FxBlox app"),". Now open your Fxblox app now and see your total maximum storage increase in the FxBlox app. ")),(0,n.kt)("p",null,"If the drive does not show within the next 5 minutes there maybe a variety of issues occurring. ",(0,n.kt)("strong",{parentName:"p"},"Checkout the ",(0,n.kt)("a",{parentName:"strong",href:"#troubleshoot"},"Troubleshooting")," section for more details.")),(0,n.kt)("h3",{id:"windows-free-third-party-app"},"Windows (Free Third-Party App)"),(0,n.kt)("p",null,"Ext4 is a linux standard that Windows does not support without some third-party help. There are various paid and free options out there, but we recommend ",(0,n.kt)("a",{parentName:"p",href:"https://www.easeus.com/partition-manager/epm-free.html"},"Parition Master Free by EaseUS"),"."),(0,n.kt)("h4",{id:"video-guide-2"},"Video Guide"),(0,n.kt)("center",null,(0,n.kt)(r(),{controls:!0,url:"https://youtu.be/lVuTGof1pGI",mdxType:"ReactPlayer"})),(0,n.kt)("h4",{id:"written-guide-2"},"Written Guide"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Install ",(0,n.kt)("a",{parentName:"p",href:"https://www.easeus.com/partition-manager/epm-free.html"},"Partition Master Free by EaseUS")," if not already done")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Plug in storage device to your Windows computer, if not already done")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Open the app. Select ",(0,n.kt)("inlineCode",{parentName:"p"},"Partition Manager")," from the left sidebar"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"It may immediately recognize the drive and push you to use the Partition Wizard. The partition wizard is a paid service, so if you exit out of that window you can continue to use the app normally (as described below)."))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Select the new drive"))),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"blank drive",src:a(7998).Z,width:"766",height:"96"})),(0,n.kt)("ol",{start:5},(0,n.kt)("li",{parentName:"ol"},"Ensure drive partition type is listed as ",(0,n.kt)("inlineCode",{parentName:"li"},"GPT")," instead of ",(0,n.kt)("inlineCode",{parentName:"li"},"MBR"),".",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"If it is ",(0,n.kt)("strong",{parentName:"li"},"not"),", select drive. Then, in right sidebar, select ",(0,n.kt)("inlineCode",{parentName:"li"},"Initialize to GPT")," to add it to task list queue."),(0,n.kt)("li",{parentName:"ul"},"Optionally, execute task.")))),(0,n.kt)("div",{class:"text--center"},(0,n.kt)("img",{src:"/img/fxyard-network/init-gpt.png"})),(0,n.kt)("ol",{start:6},(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Select unallocated drive, and on the right sidebar, click ",(0,n.kt)("inlineCode",{parentName:"p"},"Create")),(0,n.kt)("div",{class:"text--center"},(0,n.kt)("img",{src:"/img/fxyard-network/r-sidebar.png"}))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Make sure ",(0,n.kt)("inlineCode",{parentName:"p"},"EXT4")," is selected under ",(0,n.kt)("inlineCode",{parentName:"p"},"File system")),(0,n.kt)("div",{class:"text--center"},(0,n.kt)("img",{src:"/img/fxyard-network/partition-config-screen.jpeg",style:{width:700}}))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Click ",(0,n.kt)("inlineCode",{parentName:"p"},"OK"))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Click ",(0,n.kt)("inlineCode",{parentName:"p"},"Execute # Task(s)")," at the bottom of the right sidebar of the main window"))),(0,n.kt)("div",{class:"text--center"},(0,n.kt)("img",{src:"/img/fxyard-network/queue-2.png"})),(0,n.kt)("ol",{start:10},(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Wait for task(s) to complete, then close app and eject drive")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Connect your drive to the FxBlox")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},"Close FxBlox app if its currently opened, otherwise open your Fxblox app now and see your total maximum storage increase in the FxBlox app."))),(0,n.kt)("h2",{id:"troubleshoot"},"Troubleshoot"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"Drive not recognized in Windows.")," If your windows computer doesn't see the connected drive, try restarting your computer first. Then look into potentially installing drivers for the storage device."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"Storage capacity not updating")," This could be for a variety of issues:",(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Try closing/opening your app a couple of times, but also press the ",(0,n.kt)("inlineCode",{parentName:"li"},"retry")," buttons a once or twice in between."),(0,n.kt)("li",{parentName:"ul"},"Restart the FxBlox by unplug-plugging it back in."),(0,n.kt)("li",{parentName:"ul"},"The usb3 drive is connected to a usb2 port. On a ",(0,n.kt)("strong",{parentName:"li"},"FxBlox Lite"),", the top two ports are USB2.0 and the bottom is USB3.0. On a ",(0,n.kt)("strong",{parentName:"li"},"FxBlox Lite Plus"),", the top port is USB2.0 and the bottom two are USB3.0."))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"Additional storage devices not showing up under ",(0,n.kt)("inlineCode",{parentName:"strong"},"Device")," Tab.")," This is a known bug, as of app version 1.6.2. Currently, newly added storage gets added to the total instead of as a separate device."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"Partition Exists already (MacOS).")," If a partition exists already, then you will want to delete it first, write to drive, and rerun the command:",(0,n.kt)("ol",{parentName:"li"},(0,n.kt)("li",{parentName:"ol"},"Get to step 9 in the ",(0,n.kt)("em",{parentName:"li"},(0,n.kt)("a",{parentName:"em",href:"#macos-terminal"},"Manually Partition and Format for Mac"))," instructions"),(0,n.kt)("li",{parentName:"ol"},"Hit ",(0,n.kt)("inlineCode",{parentName:"li"},"d"),", to delete partition(s)."),(0,n.kt)("li",{parentName:"ol"},"Hit ",(0,n.kt)("inlineCode",{parentName:"li"},"w"),", confirm by hitting ",(0,n.kt)("inlineCode",{parentName:"li"},"y")," and saving state."),(0,n.kt)("li",{parentName:"ol"},"Continue ",(0,n.kt)("em",{parentName:"li"},(0,n.kt)("a",{parentName:"em",href:"#macos-terminal"},"Manually Partition and Format for Mac"))," instructions, from step 7.")))),(0,n.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,n.kt)("div",{parentName:"div",className:"admonition-heading"},(0,n.kt)("h5",{parentName:"div"},(0,n.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,n.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,n.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,n.kt)("div",{parentName:"div",className:"admonition-content"},(0,n.kt)("p",{parentName:"div"},(0,n.kt)("strong",{parentName:"p"},"Our apps are open-source and built in React Native for cross-platform support. So if you would like to ",(0,n.kt)("a",{parentName:"strong",href:"https://github.com/functionland/fx-components"},"contribute to the project"),", that would be greatly appreciated!")))))}u.isMDXComponent=!0},7998:(e,t,a)=>{a.d(t,{Z:()=>i});const i="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAcHBwcIBwgJCQgMDAsMDBEQDg4QERoSFBIUEhonGB0YGB0YJyMqIiAiKiM+MSsrMT5IPDk8SFdOTldtaG2Pj8ABBwcHBwgHCAkJCAwMCwwMERAODhARGhIUEhQSGicYHRgYHRgnIyoiICIqIz4xKysxPkg8OTxIV05OV21obY+PwP/CABEIAGAC/gMBIgACEQEDEQH/xAAbAAEAAwEBAQEAAAAAAAAAAAAAAgMEAQUGB//aAAgBAQAAAAD8PAAAAAAAAAAAAAAAE4Fn1HmeNv5nacPAAAAAAAAWXT7HJs5jF9E4TWdz2T7n0ZwmhOB9v9HT+cfpH2Hk+RV8B5YAAduoADTtoABDGt++zedl9Xytfv8A5sd+vzVY5+vDvyvu89H5j6arL2yN0vnaIHsa3hbadOe7zOAAAAAAAAs09otyehDCNM67ck7KbJd5mutz30295R2AAAAAAAAAAAAAAAATg23AAAAAAAAAAAAAAAZ88G+wfVel8t5gAABZWupE4AAAFls+xzauZBKMud5wAAozQb7B9n+gU/jN2IAAHffrlpy1aoT+dEJoTQmhNCZb9xmxZfS83R7v56d9e7uff89UAAUZoN9gnrjjAAANFdkJW1O5wAACzR2mzJ6EMQ0tmLufgABRmg23AAAAAAAAAAAAAAAZ88AAAAAAAAAAAAAAAAnAAAAAAAAAAAAAAAAJw//EABcBAQEBAQAAAAAAAAAAAAAAAAABAgP/2gAIAQIQAAAAupAAAAAAAB2zzlAAABZYNRYWWRQAAAAAABKdc4AFsuSgISqQBKVABSAAAqAEAAAAAAAA/8QAFwEBAQEBAAAAAAAAAAAAAAAAAAECA//aAAgBAxAAAABFAAAAAAAHLWqAAEAolJUpKEAAAAAAAFhzuwAJQAAlAFhFAAAAAABQAAAAAAAP/8QAMhAAAgEDAwAJBAEDBQAAAAAAAgMEAQUSABMUBhARICIjJDIzFSFAYAclUFUWMDRCYf/aAAgBAQABDAD9er8Y9xSmuaK1iRlToZd8fdHpq52G4W0RY4aVXqLarlMVnEt8h61Wy4OY9S4LjYhD5D1oSsmMkR3xXtQ5VVsi2q5TFNOJb5D1/wBxolu1u7ZbdYM4Y3L4jqR3W24R0C90GQtMa13KUrOPb5DVqt85z2oXEcxxCQkQkJUKtsuXG5PBkcc7fcFoGSURwJ7jYklIiTozVjoFtZliJV6gW1mWI1PQLawsViRkMSSSt0YzarGJLJW6MZtV6qpuQjtlkqJJcRCuM1hUiS9om8Zu3psSWkRJkZqx7pravESEqaNbV4iQlTqr8Y9zoy1EGMMvg8iQfSrbIgKzdhO6TokKJTrN2ruUcYtwmxh9vR6t5HoBP+lcnlTooytv6j2/VINhtAjYp1sghTX8hWqBDUUtMbfd/GxtXLRQvq1BvgNXebkDiCrPwnrQvHbeLP8Ach8blxuR/wAeV9K5L9n4fQ69Dr0OvQ69Dr0OvQ69Dr0OvQ69Dr0Oj4mJY+7qSveapeQhq4RUD0fJCXx6xb9FiSH3sljIWy4VjXKJLuCxkIZZBJLZMtnbtxKxGWZHIGS0osSNH6SqiSGUYk0SZkm782XJXMAlEpaFk6kjuTsWfVFJ3dx0OCKsmKCmihoLfLaTRdwWoXsiJhdmrK7jtktx7dQ0Kgtbj99W41Cq0j5tHQ6rWNt8095oNEsiEg0wCZcLTiNa6B6nE2IzdAYtBT9PURN5BpQI5ckasm4/1IVsMybCtQyeN4Mi4IoY36erKVGjQd0hjUfo7ZE3yxHsXFhxmI8xCqExaHPiIZGpXRx4xK33bVdTRQMlvH+Ovxj3IN5bDRscZLV/6iL/ABsTVOkZf42JqQ9sh73s+7IV5u9vUS4VylR1hcrgtr2jOdRjb9e3CgWXSWYtulycp6mTpBriXq8wUEiJcpSF1rl4v7jRrdolbpbbbhcHIWhktxpk3O5ShUMmdIaJy5LN/ce09RbhOh7nEluRqtdHeLuxHGKfKqkrpcijcYp0isfuNmy3DgyS0xK4TixylurpkuSwiJj2mQ3GdtbZPMxEyHLEipqjnjj5h6CbLWraGS0F1Y3wjkWpElsghJhdpBNlrUSlyWgtM6WkcEyWrEJstatoZLaL1yH5Ee6eRT5xCtZSW1GrW445FiudOWTSXJaBUawcvMrTQzZYq2hktous6XtbXJbtqmS0lmuS0CNhMImMIjKvxj+wV+MetFPKy/XJFPDlqvxj1p+Me7ZOiNyvCt9ZAqPdugc6ChZx30klJs91ijm6IdB/F2m5YbZZdRIeI5EsqD3BWRZEI9v41FN2t3brt1hyxjcnjN2XW+4JULXRHLWi23CQrOPBkNWqDOc8kLiONxUISISHsKtuuGxyeFI2TgzloF5RHUT3CEhLEhKhaESIhERKpVpj4S+2gAmEIiPaVaY+H8CR7dV+MetPxj3ejHSJlvyQ7eZFDpJYSxIpzdSullmSPl5yClM3JLzxENJjxGRmGycK2fhnT+ttL/rGTExt4FGEyjREEjFilZbQuEVF9hTGjSsh2KI0qimNZ6RKxaKI4zhFAVE4tvWrAiChEKljdELjCHcprsLLLIcTrl7fBoK4+7x67CyyyHE65e3waCuPu8euwssshxOuXt8Ggrj7vHrsLLLIcTrl7fBoK4+7x67CyyyHEq5e0ezrSvcaoMhDU6MobCSFvj1j3xERz7uS+QBTqouUSXOWMhTLNQltfJZ27cUoxWhe8MhhRY0ZPSJUaQVGJJL5Um6c2XIXMXVRKWhZSKSOumnpF132i+wpjRpWQ8YUaSmNIHLiCvT1ISpYjGowgioElEKlUY752/gSPbqvxj1p+Me6DCWWQl2apcH/APldHNeXhyGn41ZcklbW+3bo1o7fmloZckVYC9tF1c0hx3SxbKkux3Hmeqz52Qly3ZUkyRIj3zy5Una2t89spckh2ye2o/i0Y3aJeVdts+c5CkMluNMi43CUIjIluaJyZLN3J5nqNOnQ8uPJarVa6O63JiNgp0iqSuVwKNxinOqnuHLlsHBklpict7iVvPawZNyJihBZO0MqSsSWLzoJzJjMcpLa6rX8CR7dV+MetFfKx/XJFfDjqvxj+wV+Mf2Cvxj1f//EADcQAAIBAwIDBgQDBwUAAAAAAAECEQADEiExBBNRECAiQYGxMkBhcQVSYBQjUGJyg5EGFTCC0//aAAgBAQANPwD9PZH2HcZoAGpJrpmdKbTJCSAezKC1u2ziekirClrqhDKKNy1OwVFGpJOgApGKup0KkaEGk+NrdtnC/eP4lljnBxyiYmm0F3A4T0y2poh3tsqmdRBNbZW7bOJ6SKSc7aWyzLGhkCl0IOhBGkGsZ5vLbCOuW1NBFw2yEIOxDHutsXQqD2KsmNYG0nsVSTAJgDcmK1MAE6DUnSvzhCV0+ta+MISum+vY0QIMmdoFLuEQtFLMtgYEaGexti6FQe8ygj7ESDTKCPsRIPZkfYdy/wAQ9lP3gTEKF6g75UrEEftA3H/Sn0I54On2wq1xFxBO8KxAr/dEj9nyzjH+Sk/03efisLhttkIxFzAiatcVwQ4q5dN5L6XWYSMW8JU1xX4hfN3jMzFshtLMUeI/cfs4nhC8am/S8VdDlNFLZGY+T84BWP8AP/Jzk5v9E+KIrmNy/i+GfDM16161616161616161616161615b9rMBk5hRJiTVjjLUMl5HZ5DZMYPxHp0rg8AC7g22tkhAqqAMfpqasNaFxHcPbaRgAkBYIiuDtm5idjcJxUGfqa4v8AEmW6bLhCWgQWkNMSYFJxmDsdmAaJNWrdxyhSVZV1xJyEfaIp/wAFAkw1gJgScgO7jbLh4KESAAsRBq1xCJc5HMOmuQOe5EeVNw5a29svBhwsnMk1aYjPxM7ADc+VJw7GOuo0NcUtzlHzFoIWmm5gtlIKyTHjHmKVrvLUeFHIbYt5TTT5R5wYprNiPrGhp+KdrV1NfExjxDzFcy8iFPEmWUS/UVkfAAesaGm5YuofCqLIOSxM0t62oA5mTCYbOYFJxHJAzeCpEydd6birloBy0KqxAGJGpmuGvNz9TJSMh7RT2bl1INw3IEkH8oAin4NG5skMsJMjygUnD8OoFzMqMlmSLetaEb+YmBMGsj7DucwuBcy0YgAkYFa/vf8ApX90+9yrtxnc/VjJpmkrZvMgJ6mDV9St1xcIZ1O4brVhgbYN5zgV2I1q7c5lxDcYq7/mYHc00kpbvMikncwP4kzBikmCQIBNJGCFyVWNBANJqge4Wg1dYG5Lk5kagtO9Po/Lcpl947MY5ZuMVjpFYgcrmNhA2GO3dXZS5YUsEeM6EbEUy4kkkyu8GsSoUkkKCI0plgxpI6GlUqNToDuBWvgDkLrvSfAJOlKsTqfOZJNNMoHIGu+grojlRWvgDkDXfsZYLSZIIiDSQUGZgEbEVllEmJ60/wAZDkFqf49T4tZ1rXwhyBrvWgwzMQKxCyHIMDYU2pJMk/cmsj7D9QZH2H6gyPsO3Xu5EC48+KN4FM2JUAJH+TS7sPEB94+W/LBnt8Jn+rUd1Vk/QTEn5bLHODjMTE1tzcDhO0ZU0Q72yqmdRBNbZJbZxPSRSzKBCzCNDIFLoQdCD0Irfmcs4R1ypoi4UIUztBPd6HQ9jaADUk10ptAOp+RyrI+w7de7uBbfEoTWhxcXG1ryUIUH+Wp7jNiNlkzApZi0UYltPIiR8pizT/LhM1fkO0kEeKARFNZuOh8ZfwgwdPCNqdeDB9QaTiESQTJDGCDkTqKtKZzNyBrAkAyTTW7Ta5aZRtrTWVZG/eFyxE/041at45yST4hvOmvd6ecdK6muorp5x0rqa6iunnHSuprqK6ecdK6muorp5x0r69OnazAZOYAkxJq1xVmGF5GLkg5Ex5n2rhMAC7g22SQqqqgDH6VYa0txHcOjSMRjAWCIrg7Zu4mYLzigPqa4njmFzkuEMwMS0hp3MCk4zB2OzANEmkt3GKYSrKuuJJIin/CYkwbOOJJnuvcUE/cCk4hE0JkhjBByJ1FLxVtNC2qkmQZNXcvGSdDJUBYNWuKtKeXmdyZBL1kff5DKsj7Dt17/ANPlvyZmKT4NT4dZ0rXw5mNd600k+W1LtJJil0BzOgNMuJMmSNoNfkkxWMYlyRHyzMCVkwSNATSRghclVjQQDSaoHuFoNXWBuSSciNiZp9H5blJ+8dmMcs3CVgeUVjHL5hwjpHd/KXJGlL5FzWQbO5czaRsAREU0yASAZ3mlgiXJgjYj5HKsj7D9QZH2H6gyPsP1BkfYdn//xAAqEQEAAgECAwUJAAAAAAAAAAABABECMWEQITASQlBRwSJAQWCBkqHR0v/aAAgBAgEBPwCGK6ERNfD8cwAtmeRlVTLne/8APZmXP7l+jXKPPIdq95fPeXrO8JoVO7W3onrxs4Xt8KlkGq2RhQEGXpLilVFtXxXHASZY1XTqVKlM/V9TznexJfs9ra/wvpxrg8q6opoxV1+XP//EACkRAAEDAgMGBwAAAAAAAAAAAAEAAhEhMTBh0RASQUJQUSBAYHGRocL/2gAIAQMBAT8ARcBcoEG3T3NO9ZMbCaIj3/W8m0v2H1KFA7M+Qis4Iouyu0iVzTnpp4QFCNZzCNZRUbOKFuqlxBTXE3xpWsYYXALgSuaM4n41299gscWAbhAAenP/2Q=="}}]); \ No newline at end of file diff --git a/assets/js/1c5b444a.5e065227.js b/assets/js/1c5b444a.5e065227.js new file mode 100644 index 00000000..2ccd4cd3 --- /dev/null +++ b/assets/js/1c5b444a.5e065227.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3693],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>h});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=p(a),h=r,c=u["".concat(s,".").concat(h)]||u[h]||m[h]||i;return a?n.createElement(c,o(o({ref:t},d),{},{components:a})):n.createElement(c,o({ref:t},d))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,o[1]=l;for(var p=2;p{a.r(t),a.d(t,{contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var n=a(7462),r=(a(7294),a(3905));const i={title:"FxBlox Lite (CM4)",id:"fxblox-hardware-rpi"},o=void 0,l={unversionedId:"functionyard/hardware/fxblox-hardware-rpi",id:"functionyard/hardware/fxblox-hardware-rpi",title:"FxBlox Lite (CM4)",description:"Updating Your FxBlox Lite (RPI)",source:"@site/docs/functionyard/hardware/fxblox-hardware-rpi.md",sourceDirName:"functionyard/hardware",slug:"/functionyard/hardware/fxblox-hardware-rpi",permalink:"/functionyard/hardware/fxblox-hardware-rpi",tags:[],version:"current",frontMatter:{title:"FxBlox Lite (CM4)",id:"fxblox-hardware-rpi"},sidebar:"tutorialSidebar",previous:{title:"FxBlox Hardware",permalink:"/functionyard/hardware/fxblox-hardware"},next:{title:"FxBlox Lite Plus (RK1)",permalink:"/functionyard/hardware/fxblox-hardware-rk1"}},s=[{value:"Updating Your FxBlox Lite (RPI)",id:"updating-your-fxblox-lite-rpi",children:[{value:"Step 1: Download the firmware",id:"step-1-download-the-firmware",children:[],level:3},{value:"Step 2: Unzip and Write image to USB",id:"step-2-unzip-and-write-image-to-usb",children:[],level:3},{value:"Step 3: Updating FxBlox",id:"step-3-updating-fxblox",children:[],level:3},{value:"Step 4: Post-Update",id:"step-4-post-update",children:[],level:3}],level:2},{value:"First Time Setup",id:"first-time-setup",children:[{value:"Troubleshoot",id:"troubleshoot",children:[],level:3}],level:2}],p={toc:s};function d(e){let{components:t,...i}=e;return(0,r.kt)("wrapper",(0,n.Z)({},p,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h2",{id:"updating-your-fxblox-lite-rpi"},"Updating Your FxBlox Lite (RPI)"),(0,r.kt)("div",{className:"admonition admonition-warning alert alert--danger"},(0,r.kt)("div",{parentName:"div",className:"admonition-heading"},(0,r.kt)("h5",{parentName:"div"},(0,r.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,r.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},(0,r.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),(0,r.kt)("div",{parentName:"div",className:"admonition-content"},(0,r.kt)("p",{parentName:"div"},"If you were helping test nightly firmware releases ",(0,r.kt)("strong",{parentName:"p"},"before")," official testnet launch, you will be required to format drive to clear out old/incompatible chain data. ",(0,r.kt)("strong",{parentName:"p"},"See more ",(0,r.kt)("a",{parentName:"strong",href:"/functionyard/fxblox-app/#format-drive"},"details here."))))),(0,r.kt)("h3",{id:"step-1-download-the-firmware"},"Step 1: Download the firmware"),(0,r.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,r.kt)("div",{parentName:"div",className:"admonition-heading"},(0,r.kt)("h5",{parentName:"div"},(0,r.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,r.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,r.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,r.kt)("div",{parentName:"div",className:"admonition-content"},(0,r.kt)("p",{parentName:"div"},"If this is your very first time setting up your FxBlox Lite, see these ",(0,r.kt)("a",{parentName:"p",href:"#first-time-setup"},"instructions first")))),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Download"),": Find ",(0,r.kt)("inlineCode",{parentName:"p"},"rpi_update.zip")," in the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/functionland/rk1-image/releases/latest"},"latest release")," under the Assets section on GitHub.")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Download: Download ",(0,r.kt)("inlineCode",{parentName:"p"},"Win32 Disk Imager")," for writing update firmware to USB.\n",(0,r.kt)("a",{parentName:"p",href:"https://win32diskimager.org/"},"https://win32diskimager.org/"),"\n"))),(0,r.kt)("h3",{id:"step-2-unzip-and-write-image-to-usb"},"Step 2: Unzip and Write image to USB"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Unzipping"),": Unzip ",(0,r.kt)("inlineCode",{parentName:"p"},"rpi_update.zip")," on your computer. After unzipping there must be a .img file.")),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("p",{parentName:"li"},(0,r.kt)("strong",{parentName:"p"},"Writing Image to USB"),": "),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"In Image File section select ",(0,r.kt)("inlineCode",{parentName:"li"},"rpi_update.img")," file."),(0,r.kt)("li",{parentName:"ul"},"In Device section select USB Disk Partion letter."),(0,r.kt)("li",{parentName:"ul"},"Click Write to start flashing USB Disk.")),(0,r.kt)("p",{parentName:"li"},(0,r.kt)("img",{alt:"Win32 Disk Imager",src:a(4558).Z,width:"501",height:"353"})))),(0,r.kt)("h3",{id:"step-3-updating-fxblox"},"Step 3: Updating FxBlox"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("strong",{parentName:"li"},"Turn Off"),": Ensure your FxBlox (RPI) Lite is turned off."),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("strong",{parentName:"li"},"USB Connection"),": Connect the USB drive to the BOTTOM USB port of the FxBlox Lite (RPI)."),(0,r.kt)("li",{parentName:"ol"},(0,r.kt)("strong",{parentName:"li"},"Power On"),": Turn on your FxBlox Lite (RPI). After about 30 sec, the LED will blink yellow 5 times that indicating the update process started.",(0,r.kt)("div",{parentName:"li",className:"admonition admonition-warning alert alert--danger"},(0,r.kt)("div",{parentName:"div",className:"admonition-heading"},(0,r.kt)("h5",{parentName:"div"},(0,r.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,r.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},(0,r.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),(0,r.kt)("div",{parentName:"div",className:"admonition-content"},(0,r.kt)("p",{parentName:"div"},"In update process the LED blinks red and green. This phase is very critical, and any mistake in this phase cause breaking FxBlox Lite (RPI). ")))),(0,r.kt)("li",{parentName:"ol"},"After about 10 minutes, the LED blinks red only. Remove the USB drive."),(0,r.kt)("li",{parentName:"ol"},"Restart the FxBlox Lite (RPI) by unplugging and plugging back the power (Make sure an external storage, without the img files, is plugged to the bottom port of blox before powering it back on or the sequence of lighting you would see might defer from this documentation). The best partitioning format for storage devices is ",(0,r.kt)("inlineCode",{parentName:"li"},"ext4")," but ",(0,r.kt)("inlineCode",{parentName:"li"},"vfat")," is also acceptable.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Note")," If the blox stays in blue/white color, or does not connect to wifi and neither shows FxBlox hotspot or you rebooted during hte update and think it is broken, you need to do a full re-image by following the ",(0,r.kt)("a",{parentName:"p",href:"/functionyard/hardware/fxblox-hardware-rpi-reimage"},"instructions here"),"."),(0,r.kt)("h3",{id:"step-4-post-update"},"Step 4: Post-Update"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Be patient on the first boot, post-update!")," The FxBlox automatically reboots 3 times, and will go through a series of lights. This ",(0,r.kt)("strong",{parentName:"p"},"full process")," should take about ",(0,r.kt)("strong",{parentName:"p"},"30 minutes")," to fully process the update and show the ",(0,r.kt)("inlineCode",{parentName:"p"},"FxBlox")," WiFi."),(0,r.kt)("p",null,"Please wait for ",(0,r.kt)("inlineCode",{parentName:"p"},"10-30 minutes")," before doing anything. You may think it is done or stuck or it is turned off, but be sure that it is processing the update for ",(0,r.kt)("inlineCode",{parentName:"p"},"10-30 minutes")," after the first boot. At the end of process the LED starts blinking light blue (cyan) consistently if an external storage is plugged to the blox. If no external storage is plugged, then you cannot see this sequence."),(0,r.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,r.kt)("div",{parentName:"div",className:"admonition-heading"},(0,r.kt)("h5",{parentName:"div"},(0,r.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,r.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,r.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,r.kt)("div",{parentName:"div",className:"admonition-content"},(0,r.kt)("p",{parentName:"div"},(0,r.kt)("strong",{parentName:"p"},"Future firmware updates will be automatic, eliminating the need for manual updates.")))),(0,r.kt)("h2",{id:"first-time-setup"},"First Time Setup"),(0,r.kt)("p",null,'If this is your very first time setting up your FxBlox Lite (RPI), you will not be able to install the latest usb update. The reason for that is because "updating via usb" feature was not added in until a later firmware version. '),(0,r.kt)("p",null,"To automatically get that version, you need to connect the Blox to the wifi first. You can do so by following these steps:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Download the latest iOS/Android app."),(0,r.kt)("li",{parentName:"ol"},"Follow prompts to create password and connect Metamask."),(0,r.kt)("li",{parentName:"ol"},'On the authorize blox screen wait for 15 seconds and a "skip" button appears in the bottom left. click that to skip the authorization and then click yes to confirm. ',(0,r.kt)("a",{parentName:"li",href:"#troubleshoot"},(0,r.kt)("strong",{parentName:"a"}," * "))),(0,r.kt)("li",{parentName:"ol"},"Connect Blox to wifi. ",(0,r.kt)("a",{parentName:"li",href:"#troubleshoot"},(0,r.kt)("strong",{parentName:"a"}," * "))),(0,r.kt)("li",{parentName:"ol"},"Now, wait 24 hours for the update to install. ",(0,r.kt)("a",{parentName:"li",href:"#troubleshoot"},(0,r.kt)("strong",{parentName:"a"}," * "))),(0,r.kt)("li",{parentName:"ol"},"With new version installed, you can proceed with the ",(0,r.kt)("a",{parentName:"li",href:"#step-1-download-the-firmware"},"normal upgrading process."))),(0,r.kt)("h3",{id:"troubleshoot"},"Troubleshoot"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"You may need to wait somewhere between 20-30 seconds for the button to appear."),(0,r.kt)("li",{parentName:"ul"},"You may not get a ",(0,r.kt)("inlineCode",{parentName:"li"},"setup complete")," message after connecting to wifi, because you don't have the latest firmware version. Check your router settings to see if it connected properly."),(0,r.kt)("li",{parentName:"ul"},"We recommend waiting 24 hours, because there are no indicators for when it is completed."),(0,r.kt)("li",{parentName:"ul"},"If the blox stays in blue/white color for a long time after reboot, or does not connect to wifi and neither shows FxBlox hotspot or you rebooted during hte update and think it is broken, you need to do a full re-image by following the ",(0,r.kt)("a",{parentName:"li",href:"/functionyard/hardware/fxblox-hardware-rpi-reimage"},"instructions here"))))}d.isMDXComponent=!0},4558:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/win32DiskImager-470a740c8f557a1dd4e6e0d0ced281eb.png"}}]); \ No newline at end of file diff --git a/assets/js/1c5b444a.9d2c2d74.js b/assets/js/1c5b444a.9d2c2d74.js deleted file mode 100644 index 50d761b5..00000000 --- a/assets/js/1c5b444a.9d2c2d74.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3693],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>c});var n=a(7294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var s=n.createContext({}),p=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},d=function(e){var t=p(e.components);return n.createElement(s.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var a=e.components,i=e.mdxType,r=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=p(a),c=i,h=u["".concat(s,".").concat(c)]||u[c]||m[c]||r;return a?n.createElement(h,o(o({ref:t},d),{},{components:a})):n.createElement(h,o({ref:t},d))}));function c(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=a.length,o=new Array(r);o[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:i,o[1]=l;for(var p=2;p{a.r(t),a.d(t,{contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>l,toc:()=>s});var n=a(7462),i=(a(7294),a(3905));const r={title:"FxBlox Lite (CM4)",id:"fxblox-hardware-rpi"},o=void 0,l={unversionedId:"functionyard/hardware/fxblox-hardware-rpi",id:"functionyard/hardware/fxblox-hardware-rpi",title:"FxBlox Lite (CM4)",description:"Updating Your FxBlox Lite (RPI)",source:"@site/docs/functionyard/hardware/fxblox-hardware-rpi.md",sourceDirName:"functionyard/hardware",slug:"/functionyard/hardware/fxblox-hardware-rpi",permalink:"/functionyard/hardware/fxblox-hardware-rpi",tags:[],version:"current",frontMatter:{title:"FxBlox Lite (CM4)",id:"fxblox-hardware-rpi"},sidebar:"tutorialSidebar",previous:{title:"FxBlox Hardware",permalink:"/functionyard/hardware/fxblox-hardware"},next:{title:"FxBlox Lite Plus (RK1)",permalink:"/functionyard/hardware/fxblox-hardware-rk1"}},s=[{value:"Updating Your FxBlox Lite (RPI)",id:"updating-your-fxblox-lite-rpi",children:[{value:"Step 1: Download the firmware",id:"step-1-download-the-firmware",children:[],level:3},{value:"Step 2: Unzip and Write image to USB",id:"step-2-unzip-and-write-image-to-usb",children:[],level:3},{value:"Step 3: Updating FxBlox",id:"step-3-updating-fxblox",children:[],level:3},{value:"Step 4: Post-Update",id:"step-4-post-update",children:[],level:3}],level:2},{value:"First Time Setup",id:"first-time-setup",children:[{value:"Troubleshoot",id:"troubleshoot",children:[],level:3}],level:2}],p={toc:s};function d(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h2",{id:"updating-your-fxblox-lite-rpi"},"Updating Your FxBlox Lite (RPI)"),(0,i.kt)("div",{className:"admonition admonition-warning alert alert--danger"},(0,i.kt)("div",{parentName:"div",className:"admonition-heading"},(0,i.kt)("h5",{parentName:"div"},(0,i.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,i.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},(0,i.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),(0,i.kt)("div",{parentName:"div",className:"admonition-content"},(0,i.kt)("p",{parentName:"div"},"If you were helping test nightly firmware releases ",(0,i.kt)("strong",{parentName:"p"},"before")," official testnet launch, you will be required to format drive to clear out old/incompatible chain data. ",(0,i.kt)("strong",{parentName:"p"},"See more ",(0,i.kt)("a",{parentName:"strong",href:"/functionyard/fxblox-app/#format-drive"},"details here."))))),(0,i.kt)("h3",{id:"step-1-download-the-firmware"},"Step 1: Download the firmware"),(0,i.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,i.kt)("div",{parentName:"div",className:"admonition-heading"},(0,i.kt)("h5",{parentName:"div"},(0,i.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,i.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,i.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,i.kt)("div",{parentName:"div",className:"admonition-content"},(0,i.kt)("p",{parentName:"div"},"If this is your very first time setting up your FxBlox Lite, see these ",(0,i.kt)("a",{parentName:"p",href:"#first-time-setup"},"instructions first")))),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Download"),": Find ",(0,i.kt)("inlineCode",{parentName:"p"},"rpi_update.zip")," in the ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/functionland/rk1-image/releases/latest"},"latest release")," under the Assets section on GitHub.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Download: Download ",(0,i.kt)("inlineCode",{parentName:"p"},"Win32 Disk Imager")," for writing update firmware to USB.\n",(0,i.kt)("a",{parentName:"p",href:"https://win32diskimager.org/"},"https://win32diskimager.org/"),"\n"))),(0,i.kt)("h3",{id:"step-2-unzip-and-write-image-to-usb"},"Step 2: Unzip and Write image to USB"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Unzipping"),": Unzip ",(0,i.kt)("inlineCode",{parentName:"p"},"rpi_update.zip")," on your computer. After unzipping there must be a .img file.")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("strong",{parentName:"p"},"Writing Image to USB"),": "),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"In Image File section select ",(0,i.kt)("inlineCode",{parentName:"li"},"rpi_update.img")," file."),(0,i.kt)("li",{parentName:"ul"},"In Device section select USB Disk Partion letter."),(0,i.kt)("li",{parentName:"ul"},"Click Write to start flashing USB Disk.")),(0,i.kt)("p",{parentName:"li"},(0,i.kt)("img",{alt:"Win32 Disk Imager",src:a(4558).Z,width:"501",height:"353"})))),(0,i.kt)("h3",{id:"step-3-updating-fxblox"},"Step 3: Updating FxBlox"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("strong",{parentName:"li"},"Turn Off"),": Ensure your FxBlox (RPI) Lite is turned off."),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("strong",{parentName:"li"},"USB Connection"),": Connect the USB drive to the BOTTOM USB port of the FxBlox Lite (RPI)."),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("strong",{parentName:"li"},"Power On"),": Turn on your FxBlox Lite (RPI). After about 30 sec, the LED will blink yellow 5 times that indicating the update process started.",(0,i.kt)("div",{parentName:"li",className:"admonition admonition-warning alert alert--danger"},(0,i.kt)("div",{parentName:"div",className:"admonition-heading"},(0,i.kt)("h5",{parentName:"div"},(0,i.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,i.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},(0,i.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),(0,i.kt)("div",{parentName:"div",className:"admonition-content"},(0,i.kt)("p",{parentName:"div"},"In update process the LED blinks red and green. This phase is very critical, and any mistake in this phase cause breaking FxBlox Lite (RPI). ")))),(0,i.kt)("li",{parentName:"ol"},"After about 10 minutes, the LED blinks red only. Remove the USB drive."),(0,i.kt)("li",{parentName:"ol"},"Restart the FxBlox Lite (RPI) by unplugging and plugging back the power (Make sure an external storage, without the img files, is plugged to the bottom port of blox before powering it back on or the sequence of lighting you would see might defer from this documentation). The best partitioning format for storage devices is ",(0,i.kt)("inlineCode",{parentName:"li"},"ext4")," but ",(0,i.kt)("inlineCode",{parentName:"li"},"vfat")," is also acceptable.")),(0,i.kt)("h3",{id:"step-4-post-update"},"Step 4: Post-Update"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Be patient on the first boot, post-update!")," The FxBlox automatically reboots 3 times, and will go through a series of lights. This ",(0,i.kt)("strong",{parentName:"p"},"full process")," should take about ",(0,i.kt)("strong",{parentName:"p"},"30 minutes")," to fully process the update and show the ",(0,i.kt)("inlineCode",{parentName:"p"},"FxBlox")," WiFi."),(0,i.kt)("p",null,"Please wait for ",(0,i.kt)("inlineCode",{parentName:"p"},"10-30 minutes")," before doing anything. You may think it is done or stuck or it is turned off, but be sure that it is processing the update for ",(0,i.kt)("inlineCode",{parentName:"p"},"10-30 minutes")," after the frist boot. At the end of process the LED starts blinking light blue (cyan) consistently if an external storage is plugged to the blox. If no external storage is plugged, then you cannot see this sequence."),(0,i.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,i.kt)("div",{parentName:"div",className:"admonition-heading"},(0,i.kt)("h5",{parentName:"div"},(0,i.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,i.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,i.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,i.kt)("div",{parentName:"div",className:"admonition-content"},(0,i.kt)("p",{parentName:"div"},(0,i.kt)("strong",{parentName:"p"},"Future firmware updates will be automatic, eliminating the need for manual updates.")))),(0,i.kt)("h2",{id:"first-time-setup"},"First Time Setup"),(0,i.kt)("p",null,'If this is your very first time setting up your FxBlox Lite (RPI), you will not be able to install the latest usb update. The reason for that is because "updating via usb" feature was not added in until a later firmware version. '),(0,i.kt)("p",null,"To automatically get that version, you need to connect the Blox to the wifi first. You can do so by following these steps:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Download the latest iOS/Android app."),(0,i.kt)("li",{parentName:"ol"},"Follow prompts to create password and connect Metamask."),(0,i.kt)("li",{parentName:"ol"},'On the authorize blox screen wait for 15 seconds and a "skip" button apperas. click that to skip the authorization and then click yes to confirm. ',(0,i.kt)("a",{parentName:"li",href:"#troubleshoot"},(0,i.kt)("strong",{parentName:"a"}," * "))),(0,i.kt)("li",{parentName:"ol"},"Connect Blox to wifi. ",(0,i.kt)("a",{parentName:"li",href:"#troubleshoot"},(0,i.kt)("strong",{parentName:"a"}," * "))),(0,i.kt)("li",{parentName:"ol"},"Now, wait 24 hours for the update to install. ",(0,i.kt)("a",{parentName:"li",href:"#troubleshoot"},(0,i.kt)("strong",{parentName:"a"}," * "))),(0,i.kt)("li",{parentName:"ol"},"With new version installed, you can proceed with the ",(0,i.kt)("a",{parentName:"li",href:"#step-1-download-the-firmware"},"normal upgrading process."))),(0,i.kt)("h3",{id:"troubleshoot"},"Troubleshoot"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"You may need to wait somewhere between 20-30 seconds for the button to appear."),(0,i.kt)("li",{parentName:"ul"},"You may not get a ",(0,i.kt)("inlineCode",{parentName:"li"},"setup complete")," message afer connecting to wifi, because you don't have the latest firmware version. Check your router settings to see if it connected properly."),(0,i.kt)("li",{parentName:"ul"},"We recommend waiting 24 hours, because there are no indicators for when it is completed.")))}d.isMDXComponent=!0},4558:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/win32DiskImager-470a740c8f557a1dd4e6e0d0ced281eb.png"}}]); \ No newline at end of file diff --git a/assets/js/799a1b22.1adce6f6.js b/assets/js/799a1b22.adc1476a.js similarity index 88% rename from assets/js/799a1b22.1adce6f6.js rename to assets/js/799a1b22.adc1476a.js index f1e0affa..42ee8e2a 100644 --- a/assets/js/799a1b22.1adce6f6.js +++ b/assets/js/799a1b22.adc1476a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7878],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>u});var a=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},d=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=s(n),u=o,h=c["".concat(p,".").concat(u)]||c[u]||m[u]||i;return n?a.createElement(h,r(r({ref:t},d),{},{components:n})):a.createElement(h,r({ref:t},d))}));function u(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:o,r[1]=l;for(var s=2;s{n.r(t),n.d(t,{contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var a=n(7462),o=(n(7294),n(3905));const i={title:"FxBlox App Setup",id:"fxblox-app"},r=void 0,l={unversionedId:"functionyard/fxblox-app",id:"functionyard/fxblox-app",title:"FxBlox App Setup",description:"Installing the FxBlox App",source:"@site/docs/functionyard/fxblox-app.md",sourceDirName:"functionyard",slug:"/functionyard/fxblox-app",permalink:"/functionyard/fxblox-app",tags:[],version:"current",frontMatter:{title:"FxBlox App Setup",id:"fxblox-app"},sidebar:"tutorialSidebar",previous:{title:"Add Storage",permalink:"/functionyard/add-storage"},next:{title:"Joining Testnet",permalink:"/functionyard/join"}},p=[{value:"Installing the FxBlox App",id:"installing-the-fxblox-app",children:[{value:"Initial Setup",id:"initial-setup",children:[],level:3},{value:"App Configuration Steps",id:"app-configuration-steps",children:[],level:3},{value:"Troubleshoot",id:"troubleshoot",children:[],level:3}],level:2},{value:"Add Multiple FxBloxes",id:"add-multiple-fxbloxes",children:[],level:2},{value:"Format Drive",id:"format-drive",children:[],level:2}],s={toc:p};function d(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,a.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"installing-the-fxblox-app"},"Installing the FxBlox App"),(0,o.kt)("h3",{id:"initial-setup"},"Initial Setup"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("strong",{parentName:"li"},"Download the App"),": ",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"For Android: ",(0,o.kt)("a",{parentName:"li",href:"https://play.google.com/store/apps/details?id=land.fx.blox"},"FxBlox on Google Play (v1.6.11+)"),"."),(0,o.kt)("li",{parentName:"ul"},"For iOS: ",(0,o.kt)("a",{parentName:"li",href:"https://apps.apple.com/ca/app/fxblox/id6444862171"},"FxBlox on AppStore (v1.6.11+)"),"."))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("strong",{parentName:"li"},"Metamask Wallet"),": Ensure you have a ",(0,o.kt)("a",{parentName:"li",href:"https://play.google.com/store/apps/details?id=io.metamask"},"Metamask wallet")," for setting up your identity.")),(0,o.kt)("h3",{id:"app-configuration-steps"},"App Configuration Steps"),(0,o.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,o.kt)("div",{parentName:"div",className:"admonition-heading"},(0,o.kt)("h5",{parentName:"div"},(0,o.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,o.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,o.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,o.kt)("div",{parentName:"div",className:"admonition-content"},(0,o.kt)("p",{parentName:"div"},"If adding more than one FxBlox to your app, get familiar with ",(0,o.kt)("a",{parentName:"p",href:"#add-multiple-fxbloxs"},"these instructions first.")))),(0,o.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,o.kt)("div",{parentName:"div",className:"admonition-heading"},(0,o.kt)("h5",{parentName:"div"},(0,o.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,o.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,o.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,o.kt)("div",{parentName:"div",className:"admonition-content"},(0,o.kt)("p",{parentName:"div"},"For a successful setup you should either have the Blox with internal storage, or attach an external storage to it."))),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},'Open Metamask Wallet. We recommend having the opening network set to "Ethereum Mainnet" for a smoother setup process.'),(0,o.kt)("li",{parentName:"ol"},"Minimize Metamask (not close) and open the FxBlox app."),(0,o.kt)("li",{parentName:"ol"},"Read the ",(0,o.kt)("a",{parentName:"li",href:"https://fx.land/terms"},"Terms and Condition")," and if you agree, then select ",(0,o.kt)("inlineCode",{parentName:"li"},"Agree and Setup Blox")," in the app."),(0,o.kt)("li",{parentName:"ol"},"Enter a memorable password for data encryption and click ",(0,o.kt)("inlineCode",{parentName:"li"},"Sign")," (Note: This is not your Metamask password)."),(0,o.kt)("li",{parentName:"ol"},"Complete the connection in the Metamask app, then return to the FxBlox app.",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"You may need to click back to manually return to the app if it does not open Blox automatically after you sign in Metamask"),(0,o.kt)("li",{parentName:"ul"},"It does not matter which chain (Ethereum, Mumbai, etc) you are on in your Metamask wallet."))),(0,o.kt)("li",{parentName:"ol"},"Tap ",(0,o.kt)("inlineCode",{parentName:"li"},"Connect to new blox"),"."),(0,o.kt)("li",{parentName:"ol"},'Manually connect your phone to the "FxBlox" WiFi/Hotspot, and turn off "mobile data", then continue in the app.')),(0,o.kt)("div",{className:"admonition admonition-warning alert alert--danger"},(0,o.kt)("div",{parentName:"div",className:"admonition-heading"},(0,o.kt)("h5",{parentName:"div"},(0,o.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,o.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},(0,o.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),(0,o.kt)("div",{parentName:"div",className:"admonition-content"},(0,o.kt)("p",{parentName:"div"},'Everyone should format their storage in step 8. If you have Blox with internal storage, disconnect any external disk. If you have Blox with no internal storage, attach your external storage. At the "set Authorizer" page, wait for 10 seconds and a green button named "Format Disk" appears. click on it and blox turns ',(0,o.kt)("font",{color:"purple"}," purple")," and reboots after a few minutes. You should wait for the light to turn flashing ",(0,o.kt)("font",{color:"cyan"}," light blue")," again and then reconnect your phone to FxBlox again to continue the process"))),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Make sure you have attached at least 300GB of external storage to your FxBlox. Proceed by clicking ",(0,o.kt)("inlineCode",{parentName:"li"},"Next")," once the app recognizes the storage.",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"If the storage is not recognized ensure that is it correctly formatted by clicking on the ",(0,o.kt)("inlineCode",{parentName:"li"},"Format")," button.",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"The light will turn ",(0,o.kt)("font",{color:"purple"}," purple"),", to indicate it is formatting. ",(0,o.kt)("strong",{parentName:"li"},"Formatting times depend on storage medium and capacity"),", so be patient during this time. Device will reboot automatically and eventually start flashing ",(0,o.kt)("font",{color:"cyan"}," light blue")," again when it is ready to proceed."))),(0,o.kt)("li",{parentName:"ul"},"If you have an FxBlox version with internal storage, there is no need to attach external storage."))),(0,o.kt)("li",{parentName:"ol"},"Select your desired WiFi network for the FxBlox and enter the password.",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"If you entered the wrong password, double check you're connected to FxBlox Wifi and just go back to the wifi selection screen to choose and re-enter your password."))),(0,o.kt)("li",{parentName:"ol"},"Finally, on the last screen reconnect your mobile device to your home WiFi and you can turn on the mobile data again if you want to. The app will confirm the successful setup. Please note the app does not continue if you do not have an active internet connection. When Blox is connected to the internet, the LEDs turn ",(0,o.kt)("inlineCode",{parentName:"li"},"green")," for 30 seconds and then turn off."),(0,o.kt)("li",{parentName:"ol"},"We recommend unplugging and replugging the Blox after the initial setup once for a hard reboot and ensuring that everything is set. After you re-plug the power and it boots, it may reboot automatically once as well.")),(0,o.kt)("h3",{id:"troubleshoot"},"Troubleshoot"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Final step connection issues"),": Connect to mobile or home wifi, restart the FxBlox app, select ",(0,o.kt)("inlineCode",{parentName:"li"},"Connect to Existing Blox"),". If that doesn't work, restart the FxBlox device. Close app and reopen to proceed with ",(0,o.kt)("inlineCode",{parentName:"li"},"Connect to new Blox"),"."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"If Metamask doesn't redirect after signing transaction"),": Manually go back to the FxBlox app."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"App issues with Metamask"),': On some phones, if you cannot get the "Connect" and "sign" prompts in Metamask, you may need to put both the Metamask app and Blox app in Unrestricted mode from the "Battery Optimization". Go to: ',(0,o.kt)("inlineCode",{parentName:"li"},"Settings")," > ",(0,o.kt)("inlineCode",{parentName:"li"},"Apps")," > ",(0,o.kt)("inlineCode",{parentName:"li"},"FxBlox")," > ",(0,o.kt)("inlineCode",{parentName:"li"},"Battery")," / ",(0,o.kt)("inlineCode",{parentName:"li"},"App Battery")," > Choose ",(0,o.kt)("inlineCode",{parentName:"li"},"Unrestricted"),". Do the same for the Metamask app. After the setup, you can return it back to the default of ",(0,o.kt)("inlineCode",{parentName:"li"},"Optimized"))),(0,o.kt)("h2",{id:"add-multiple-fxbloxes"},"Add Multiple FxBloxes"),(0,o.kt)("p",null,"As of Android/iOS app version 1.6.7, there is not an easy way to add more than one blox to your account. Follow these additional steps if you would like to connect more than one blox:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"If not already done, complete setup of your first Blox."),(0,o.kt)("li",{parentName:"ol"},"Verify Blox is listed as ",(0,o.kt)("inlineCode",{parentName:"li"},"Authorized")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"Settings"),"->",(0,o.kt)("inlineCode",{parentName:"li"},"Blox Discovery"),". If not, restart your Blox by unplug/plug-ing it back in."),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"Log Out")," of your account by going to ",(0,o.kt)("inlineCode",{parentName:"li"},"Settings")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Log Out"),"."),(0,o.kt)("li",{parentName:"ol"},"Proceed and complete set-up of your next FxBlox."),(0,o.kt)("li",{parentName:"ol"},"Repeat steps 2-4 for all the FxBloxes you have, except for the last one.",(0,o.kt)("div",{parentName:"li",className:"admonition admonition-info alert alert--info"},(0,o.kt)("div",{parentName:"div",className:"admonition-heading"},(0,o.kt)("h5",{parentName:"div"},(0,o.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,o.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,o.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,o.kt)("div",{parentName:"div",className:"admonition-content"},(0,o.kt)("p",{parentName:"div"},"If you're using the default naming scheme ",(0,o.kt)("inlineCode",{parentName:"p"},"Blox unit #X"),", then name your last Blox ",(0,o.kt)("inlineCode",{parentName:"p"},"Blox unit #1"),". The reason for this is because the app will auto-number the rest of your Bloxes when you add them back in.")))),(0,o.kt)("li",{parentName:"ol"},"When you've finally added the last FxBlox, go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Settings")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Blox Discovery"),"."),(0,o.kt)("li",{parentName:"ol"},"All FxBloxes should say ",(0,o.kt)("inlineCode",{parentName:"li"},"Authorized"),", so select them and click ",(0,o.kt)("inlineCode",{parentName:"li"},"Add selected blox(s)"),"."),(0,o.kt)("li",{parentName:"ol"},"Verify you can see all of them by going to ",(0,o.kt)("inlineCode",{parentName:"li"},"Blox")," tab and swiping left/right between them.")),(0,o.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,o.kt)("div",{parentName:"div",className:"admonition-heading"},(0,o.kt)("h5",{parentName:"div"},(0,o.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,o.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,o.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,o.kt)("div",{parentName:"div",className:"admonition-content"},(0,o.kt)("p",{parentName:"div"},"As you can see the functionality is there, but priotization of an easier way to add them is scheduled for after testnet launch."),(0,o.kt)("p",{parentName:"div"},(0,o.kt)("strong",{parentName:"p"},"Our apps are open-source and built in React Native for cross-platform support. So if you would like to ",(0,o.kt)("a",{parentName:"strong",href:"https://github.com/functionland/fx-components"},"contribute to the project"),", that would be greatly appreciated!")))),(0,o.kt)("h2",{id:"format-drive"},"Format Drive"),(0,o.kt)("p",null,"If you were eager to test out nightly releases on your own, you may have trouble joining the official launch of the testnet. This is because the blocks from the temporary chains are incompatible with the official testnet blocks. To fix this, you need to erase all previous blocks, easiest way is to format the drive."),(0,o.kt)("p",null,"To format your drive: "),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Tap on the ",(0,o.kt)("inlineCode",{parentName:"li"},"Blox")," tab to see this screen",(0,o.kt)("center",null,(0,o.kt)("img",{src:"/img/fxyard-network/blox-page.png",style:{width:450}}))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("strong",{parentName:"li"},"Tap and hold")," the ",(0,o.kt)("inlineCode",{parentName:"li"},"Hard Disk")," you want to format"),(0,o.kt)("li",{parentName:"ol"},"When the pop-up shows, click the ",(0,o.kt)("inlineCode",{parentName:"li"},"Format")," button",(0,o.kt)("center",null,(0,o.kt)("img",{src:"/img/fxyard-network/format-button.png",style:{width:400}}))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("strong",{parentName:"li"},"Now wait!")," The light will turn purple. This process may take more or less than 5 minutes, dependent on the speed of your drive."),(0,o.kt)("li",{parentName:"ol"},"The FxBlox will auto-reboot, after it is done the lights will turn off.")),(0,o.kt)("p",null,"FxBlox will automatically connect to testnet and save chain history. You should be able to join testnet now."))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7878],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>u});var a=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=a.createContext({}),s=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},d=function(e){var t=s(e.components);return a.createElement(p.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},c=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,p=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=s(n),u=o,h=c["".concat(p,".").concat(u)]||c[u]||m[u]||i;return n?a.createElement(h,r(r({ref:t},d),{},{components:n})):a.createElement(h,r({ref:t},d))}));function u(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=c;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:o,r[1]=l;for(var s=2;s{n.r(t),n.d(t,{contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var a=n(7462),o=(n(7294),n(3905));const i={title:"FxBlox App Setup",id:"fxblox-app"},r=void 0,l={unversionedId:"functionyard/fxblox-app",id:"functionyard/fxblox-app",title:"FxBlox App Setup",description:"Installing the FxBlox App",source:"@site/docs/functionyard/fxblox-app.md",sourceDirName:"functionyard",slug:"/functionyard/fxblox-app",permalink:"/functionyard/fxblox-app",tags:[],version:"current",frontMatter:{title:"FxBlox App Setup",id:"fxblox-app"},sidebar:"tutorialSidebar",previous:{title:"Add Storage",permalink:"/functionyard/add-storage"},next:{title:"Joining Testnet",permalink:"/functionyard/join"}},p=[{value:"Installing the FxBlox App",id:"installing-the-fxblox-app",children:[{value:"Initial Setup",id:"initial-setup",children:[],level:3},{value:"App Configuration Steps",id:"app-configuration-steps",children:[],level:3},{value:"Troubleshoot",id:"troubleshoot",children:[],level:3}],level:2},{value:"Add Multiple FxBloxes",id:"add-multiple-fxbloxes",children:[],level:2},{value:"Format Drive",id:"format-drive",children:[],level:2}],s={toc:p};function d(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,a.Z)({},s,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h2",{id:"installing-the-fxblox-app"},"Installing the FxBlox App"),(0,o.kt)("h3",{id:"initial-setup"},"Initial Setup"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("strong",{parentName:"li"},"Download the App"),": ",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"For Android: ",(0,o.kt)("a",{parentName:"li",href:"https://play.google.com/store/apps/details?id=land.fx.blox"},"FxBlox on Google Play (v1.6.11+)"),"."),(0,o.kt)("li",{parentName:"ul"},"For iOS: ",(0,o.kt)("a",{parentName:"li",href:"https://apps.apple.com/ca/app/fxblox/id6444862171"},"FxBlox on AppStore (v1.6.11+)"),"."))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("strong",{parentName:"li"},"Metamask Wallet"),": Ensure you have a ",(0,o.kt)("a",{parentName:"li",href:"https://play.google.com/store/apps/details?id=io.metamask"},"Metamask wallet")," for setting up your identity.")),(0,o.kt)("h3",{id:"app-configuration-steps"},"App Configuration Steps"),(0,o.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,o.kt)("div",{parentName:"div",className:"admonition-heading"},(0,o.kt)("h5",{parentName:"div"},(0,o.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,o.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,o.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,o.kt)("div",{parentName:"div",className:"admonition-content"},(0,o.kt)("p",{parentName:"div"},"If adding more than one FxBlox to your app, get familiar with ",(0,o.kt)("a",{parentName:"p",href:"#add-multiple-fxbloxs"},"these instructions first.")))),(0,o.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,o.kt)("div",{parentName:"div",className:"admonition-heading"},(0,o.kt)("h5",{parentName:"div"},(0,o.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,o.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,o.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,o.kt)("div",{parentName:"div",className:"admonition-content"},(0,o.kt)("p",{parentName:"div"},"For a successful setup you should either have the Blox with internal storage, or attach an external storage to it."))),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},'Open Metamask Wallet. We recommend having the opening network set to "Ethereum Mainnet" for a smoother setup process.'),(0,o.kt)("li",{parentName:"ol"},"Minimize Metamask (not close) and open the FxBlox app."),(0,o.kt)("li",{parentName:"ol"},"Read the ",(0,o.kt)("a",{parentName:"li",href:"https://fx.land/terms"},"Terms and Condition")," and if you agree, then select ",(0,o.kt)("inlineCode",{parentName:"li"},"Agree and Setup Blox")," in the app."),(0,o.kt)("li",{parentName:"ol"},"Enter a memorable password for data encryption and click ",(0,o.kt)("inlineCode",{parentName:"li"},"Sign")," (Note: This is not your Metamask password)."),(0,o.kt)("li",{parentName:"ol"},"Complete the connection in the Metamask app, then return to the FxBlox app.",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"You may need to click back to manually return to the app if it does not open Blox automatically after you sign in Metamask"),(0,o.kt)("li",{parentName:"ul"},"It does not matter which chain (Ethereum, Mumbai, etc) you are on in your Metamask wallet."))),(0,o.kt)("li",{parentName:"ol"},"Tap ",(0,o.kt)("inlineCode",{parentName:"li"},"Connect to new blox"),"."),(0,o.kt)("li",{parentName:"ol"},'Manually connect your phone to the "FxBlox" WiFi/Hotspot, and turn off "mobile data", then continue in the app.')),(0,o.kt)("div",{className:"admonition admonition-warning alert alert--danger"},(0,o.kt)("div",{parentName:"div",className:"admonition-heading"},(0,o.kt)("h5",{parentName:"div"},(0,o.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,o.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},(0,o.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),(0,o.kt)("div",{parentName:"div",className:"admonition-content"},(0,o.kt)("p",{parentName:"div"},'Everyone should format their storage in step 8. If you have Blox with internal storage, disconnect any external disk. If you have Blox with no internal storage, attach your external storage. At the "set Authorizer" page, wait for 10 seconds and a green button named "Format Disk" appears. click on it and blox turns ',(0,o.kt)("font",{color:"purple"}," purple")," and reboots after a few minutes. You should wait for the light to turn flashing ",(0,o.kt)("font",{color:"cyan"}," light blue")," again and then reconnect your phone to FxBlox again to continue the process"))),(0,o.kt)("ol",{start:8},(0,o.kt)("li",{parentName:"ol"},"Make sure you have attached at least 300GB of external storage to your FxBlox. Proceed by clicking ",(0,o.kt)("inlineCode",{parentName:"li"},"Next")," once the app recognizes the storage.",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"If the storage is not recognized ensure that is it correctly formatted by clicking on the ",(0,o.kt)("inlineCode",{parentName:"li"},"Format")," button.",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"The light will turn ",(0,o.kt)("font",{color:"purple"}," purple"),", to indicate it is formatting. ",(0,o.kt)("strong",{parentName:"li"},"Formatting times depend on storage medium and capacity"),", so be patient during this time. Device will reboot automatically and eventually start flashing ",(0,o.kt)("font",{color:"cyan"}," light blue")," again when it is ready to proceed."))),(0,o.kt)("li",{parentName:"ul"},"If you have an FxBlox version with internal storage, there is no need to attach external storage."))),(0,o.kt)("li",{parentName:"ol"},"Select your desired WiFi network for the FxBlox and enter the password.",(0,o.kt)("ul",{parentName:"li"},(0,o.kt)("li",{parentName:"ul"},"If you entered the wrong password, double check you're connected to FxBlox Wifi and just go back to the wifi selection screen to choose and re-enter your password."))),(0,o.kt)("li",{parentName:"ol"},"Finally, on the last screen reconnect your mobile device to your home WiFi and you can turn on the mobile data again if you want to. The app will confirm the successful setup. Please note the app does not continue if you do not have an active internet connection. When Blox is connected to the internet, the LEDs turn ",(0,o.kt)("inlineCode",{parentName:"li"},"green")," for 30 seconds and then turn off."),(0,o.kt)("li",{parentName:"ol"},"We recommend unplugging and replugging the Blox after the initial setup once for a hard reboot and ensuring that everything is set. After you re-plug the power and it boots, it may reboot automatically once as well.")),(0,o.kt)("h3",{id:"troubleshoot"},"Troubleshoot"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"Final step connection issues"),": Connect to mobile or home wifi, restart the FxBlox app, select ",(0,o.kt)("inlineCode",{parentName:"li"},"Connect to Existing Blox"),". If that doesn't work, restart the FxBlox device. Close app and reopen to proceed with ",(0,o.kt)("inlineCode",{parentName:"li"},"Connect to new Blox"),"."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"If Metamask doesn't redirect after signing transaction"),": Manually go back to the FxBlox app."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("strong",{parentName:"li"},"App issues with Metamask"),': On some phones, if you cannot get the "Connect" and "sign" prompts in Metamask, you may need to put both the Metamask app and Blox app in Unrestricted mode from the "Battery Optimization". Go to: ',(0,o.kt)("inlineCode",{parentName:"li"},"Settings")," > ",(0,o.kt)("inlineCode",{parentName:"li"},"Apps")," > ",(0,o.kt)("inlineCode",{parentName:"li"},"FxBlox")," > ",(0,o.kt)("inlineCode",{parentName:"li"},"Battery")," / ",(0,o.kt)("inlineCode",{parentName:"li"},"App Battery")," > Choose ",(0,o.kt)("inlineCode",{parentName:"li"},"Unrestricted"),". Do the same for the Metamask app. After the setup, you can return it back to the default of ",(0,o.kt)("inlineCode",{parentName:"li"},"Optimized"))),(0,o.kt)("h2",{id:"add-multiple-fxbloxes"},"Add Multiple FxBloxes"),(0,o.kt)("p",null,"As of Android/iOS app version 1.6.7, there is not an easy way to add more than one blox to your account. Follow these additional steps if you would like to connect more than one blox:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"If not already done, complete setup of your first Blox."),(0,o.kt)("li",{parentName:"ol"},"Verify Blox is listed as ",(0,o.kt)("inlineCode",{parentName:"li"},"Authorized")," under ",(0,o.kt)("inlineCode",{parentName:"li"},"Settings"),"->",(0,o.kt)("inlineCode",{parentName:"li"},"Blox Discovery"),". If not, restart your Blox by unplug/plug-ing it back in."),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("inlineCode",{parentName:"li"},"Log Out")," of your account by going to ",(0,o.kt)("inlineCode",{parentName:"li"},"Settings")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Log Out"),"."),(0,o.kt)("li",{parentName:"ol"},"Proceed and complete set-up of your next FxBlox."),(0,o.kt)("li",{parentName:"ol"},"Repeat steps 2-4 for all the FxBloxes you have, except for the last one.",(0,o.kt)("div",{parentName:"li",className:"admonition admonition-info alert alert--info"},(0,o.kt)("div",{parentName:"div",className:"admonition-heading"},(0,o.kt)("h5",{parentName:"div"},(0,o.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,o.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,o.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,o.kt)("div",{parentName:"div",className:"admonition-content"},(0,o.kt)("p",{parentName:"div"},"If you're using the default naming scheme ",(0,o.kt)("inlineCode",{parentName:"p"},"Blox unit #X"),", then name your last Blox ",(0,o.kt)("inlineCode",{parentName:"p"},"Blox unit #1"),". The reason for this is because the app will auto-number the rest of your Bloxes when you add them back in.")))),(0,o.kt)("li",{parentName:"ol"},"When you've finally added the last FxBlox, go to ",(0,o.kt)("inlineCode",{parentName:"li"},"Settings")," -> ",(0,o.kt)("inlineCode",{parentName:"li"},"Blox Discovery"),"."),(0,o.kt)("li",{parentName:"ol"},"All FxBloxes should say ",(0,o.kt)("inlineCode",{parentName:"li"},"Authorized"),", so select them and click ",(0,o.kt)("inlineCode",{parentName:"li"},"Add selected blox(s)"),"."),(0,o.kt)("li",{parentName:"ol"},"Verify you can see all of them by going to ",(0,o.kt)("inlineCode",{parentName:"li"},"Blox")," tab and swiping left/right between them.")),(0,o.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,o.kt)("div",{parentName:"div",className:"admonition-heading"},(0,o.kt)("h5",{parentName:"div"},(0,o.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,o.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,o.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,o.kt)("div",{parentName:"div",className:"admonition-content"},(0,o.kt)("p",{parentName:"div"},"As you can see the functionality is there, but prioritization of an easier way to add them is scheduled for after testnet launch."),(0,o.kt)("p",{parentName:"div"},(0,o.kt)("strong",{parentName:"p"},"Our apps are open-source and built in React Native for cross-platform support. So if you would like to ",(0,o.kt)("a",{parentName:"strong",href:"https://github.com/functionland/fx-components"},"contribute to the project"),", that would be greatly appreciated!")))),(0,o.kt)("h2",{id:"format-drive"},"Format Drive"),(0,o.kt)("p",null,"If you were eager to test out nightly releases on your own, you may have trouble joining the official launch of the testnet. This is because the blocks from the temporary chains are incompatible with the official testnet blocks. To fix this, you need to erase all previous blocks, easiest way is to format the drive."),(0,o.kt)("p",null,"To format your drive: "),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Tap on the ",(0,o.kt)("inlineCode",{parentName:"li"},"Blox")," tab to see this screen",(0,o.kt)("center",null,(0,o.kt)("img",{src:"/img/fxyard-network/blox-page.png",style:{width:450}}))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("strong",{parentName:"li"},"Tap and hold")," the ",(0,o.kt)("inlineCode",{parentName:"li"},"Hard Disk")," you want to format"),(0,o.kt)("li",{parentName:"ol"},"When the pop-up shows, click the ",(0,o.kt)("inlineCode",{parentName:"li"},"Format")," button",(0,o.kt)("center",null,(0,o.kt)("img",{src:"/img/fxyard-network/format-button.png",style:{width:400}}))),(0,o.kt)("li",{parentName:"ol"},(0,o.kt)("strong",{parentName:"li"},"Now wait!")," The light will turn purple. This process may take more or less than 5 minutes, dependent on the speed of your drive."),(0,o.kt)("li",{parentName:"ol"},"The FxBlox will auto-reboot, after it is done the lights will turn off.")),(0,o.kt)("p",null,"FxBlox will automatically connect to testnet and save chain history. You should be able to join testnet now."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7e4aa304.3aa51849.js b/assets/js/7e4aa304.3aa51849.js new file mode 100644 index 00000000..6465addc --- /dev/null +++ b/assets/js/7e4aa304.3aa51849.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8899],{3905:(e,t,r)=>{r.d(t,{Zo:()=>m,kt:()=>h});var a=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=a.createContext({}),s=function(e){var t=a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},m=function(e){var t=s(e.components);return a.createElement(l.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,l=e.parentName,m=p(e,["components","mdxType","originalType","parentName"]),u=s(r),h=n,g=u["".concat(l,".").concat(h)]||u[h]||c[h]||o;return r?a.createElement(g,i(i({ref:t},m),{},{components:r})):a.createElement(g,i({ref:t},m))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,i=new Array(o);i[0]=u;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p.mdxType="string"==typeof e?e:n,i[1]=p;for(var s=2;s{r.r(t),r.d(t,{contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>p,toc:()=>l});var a=r(7462),n=(r(7294),r(3905));const o={title:"Re-imaging CM4"},i=void 0,p={unversionedId:"functionyard/hardware/fxblox-hardware-rpi-reimage",id:"functionyard/hardware/fxblox-hardware-rpi-reimage",title:"Re-imaging CM4",description:"Re-imaging CM4",source:"@site/docs/functionyard/hardware/fxblox-hardware-rpi-reimage.md",sourceDirName:"functionyard/hardware",slug:"/functionyard/hardware/fxblox-hardware-rpi-reimage",permalink:"/functionyard/hardware/fxblox-hardware-rpi-reimage",tags:[],version:"current",frontMatter:{title:"Re-imaging CM4"}},l=[{value:"Re-imaging CM4",id:"re-imaging-cm4",children:[{value:"Steps for Re-imaging",id:"steps-for-re-imaging",children:[],level:3}],level:2}],s={toc:l};function m(e){let{components:t,...o}=e;return(0,n.kt)("wrapper",(0,a.Z)({},s,o,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h2",{id:"re-imaging-cm4"},"Re-imaging CM4"),(0,n.kt)("p",null,"If for any reason the CM4 fulatower gets stuck in a blue/white light without going through the whole boot process, or it is not connected to the Wi-Fi or propagating the FxBlox hotspot, you need to perform a full re-image. This process requires you to first open the tower, which involves unscrewing parts of it. The process of opening the tower is shown in the video below:"),(0,n.kt)("p",null,(0,n.kt)("a",{parentName:"p",href:"https://youtu.be/feBov6U_kJs?t=246"},(0,n.kt)("img",{parentName:"a",src:"https://img.youtube.com/vi/feBov6U_kJs/0.jpg",alt:"How to open the tower"}))),(0,n.kt)("h3",{id:"steps-for-re-imaging"},"Steps for Re-imaging"),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("strong",{parentName:"p"},"Unplug the Tower from Power")),(0,n.kt)("p",{parentName:"li"},"Ensure the tower is not connected to any power source before proceeding.")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("strong",{parentName:"p"},"Opening the Tower")),(0,n.kt)("p",{parentName:"li"},"Follow the instructions in the video linked above to open the tower safely.")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("strong",{parentName:"p"},"Connect the USB-C Port")),(0,n.kt)("p",{parentName:"li"},"Connect the USB-C port on the side of the tower to your laptop or PC."),(0,n.kt)("p",{parentName:"li"},(0,n.kt)("img",{alt:"Placeholder for USB-C connection image",src:r(7033).Z,width:"960",height:"1280"}))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("strong",{parentName:"p"},"Short Circuit the Two Pins")),(0,n.kt)("p",{parentName:"li"},"Short circuit the two pins located on the bottom left side of the Raspberry Pi module. You can use anything to short circuit them, like putting hte head of a USC-C cable between them. but make sure hte material you are using is conductive nad not Aluminum for example (key rings for example are usually aluminum)"),(0,n.kt)("p",{parentName:"li"},(0,n.kt)("img",{alt:"Placeholder for short circuit pins image",src:r(808).Z,width:"602",height:"800"}))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("strong",{parentName:"p"},"Power On the Tower")),(0,n.kt)("p",{parentName:"li"},"Plug the tower back into power. It should display a blue/white light and remain like that, indicating it is in image mode. You can remove the short circuit from step 4 at this stage.")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("strong",{parentName:"p"},"Installing and Running rpiboot")),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("strong",{parentName:"p"},"For Windows:")),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},"Download and install rpiboot from ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/raspberrypi/usbboot/raw/master/win32/rpiboot_setup.exe"},"here"),"."),(0,n.kt)("li",{parentName:"ul"},"Type ",(0,n.kt)("inlineCode",{parentName:"li"},"rpiboot")," in your search bar and run it. After a few seconds it starts printing some stuff and automatically closes after 15 seconds or so. Wait for the terminal to close before proceeding."))),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("strong",{parentName:"p"},"For Mac:")),(0,n.kt)("pre",{parentName:"li"},(0,n.kt)("code",{parentName:"pre"},"git clone --recurse-submodules --shallow-submodules --depth=1 https://github.com/raspberrypi/usbboot\ncd usbboot\nbrew install libusb\nbrew install pkg-config\nmake\nsudo ./rpiboot\n")),(0,n.kt)("p",{parentName:"li"},"After a few seconds it starts printing some stuff and automatically closes after 15 seconds or so. Wait for the terminal to close before proceeding.")))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("strong",{parentName:"p"},"Download the Latest Image")),(0,n.kt)("p",{parentName:"li"},"Download the latest image for your CM4, from ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/functionland/rk1-image/latest/release"},"the official GitHub repository"),". Download all the files that start with CM4_update into one folder on your computer.")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("strong",{parentName:"p"},"Unzip the Image Content")),(0,n.kt)("p",{parentName:"li"},"Right click on the one that ends with .zip and click Extract All. Extract the contents of the downloaded image to a known location on your computer. you can also use a software like 7zip to unzip but both Windows and Mac should natively support the unzip.")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("strong",{parentName:"p"},"Install and Run Raspberry Pi Imager")),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"For Windows:")," Download from ",(0,n.kt)("a",{parentName:"li",href:"https://downloads.raspberrypi.org/imager/imager_latest.exe"},"here"),"."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"For Mac:")," Download from ",(0,n.kt)("a",{parentName:"li",href:"https://downloads.raspberrypi.org/imager/imager_latest.dmg"},"here"),"."))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("strong",{parentName:"p"},"Configure Raspberry Pi Imager")),(0,n.kt)("p",{parentName:"li"},"Open Raspberry Pi Imager and select the following:"),(0,n.kt)("ul",{parentName:"li"},(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"Raspberry Pi Device:")," RASPBERRY PI 4"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"Operating System:"),' Scroll down and choose "custom image," then select the ',(0,n.kt)("inlineCode",{parentName:"li"},".img")," file inside the folder you unzipped in the previous step."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("strong",{parentName:"li"},"Storage:"),' Click on "Choose storage" and select the newly added storage, which should be around 30GB and named RPi-Msd.')),(0,n.kt)("p",{parentName:"li"},(0,n.kt)("img",{alt:"Placeholder for Raspberry Pi Imager configuration image",src:r(2556).Z,width:"1357",height:"951"}))),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("strong",{parentName:"p"},"Start the Imaging Process")),(0,n.kt)("p",{parentName:"li"},'Click "Next." Choose "No" for the first popup asking if you want custom configs, and "Yes" for the second one asking for confirmation.')),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("strong",{parentName:"p"},"Wait for Completion")),(0,n.kt)("p",{parentName:"li"},"The imaging process might take about 3 hours. Please be patient.")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("strong",{parentName:"p"},"Final Steps")),(0,n.kt)("p",{parentName:"li"},"After completion, remove the short circuit from the pins, disconnect the USB-C cable connecting the tower to the computer, and then unplug and re-plug the tower to power.")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("strong",{parentName:"p"},"Set Up Using FxBlox App")),(0,n.kt)("p",{parentName:"li"},"Now that you have the updated fulatower, use the FxBlox app to set it up. There's no need for any other manual updates.")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("p",{parentName:"li"},(0,n.kt)("strong",{parentName:"p"},"Closing the Tower")),(0,n.kt)("p",{parentName:"li"},"Once you've confirmed a successful setup through the FxBlox app, close up the tower again to protect it from damage."))))}m.isMDXComponent=!0},2556:(e,t,r)=>{r.d(t,{Z:()=>a});const a=r.p+"assets/images/raspberrypi-imager-0098395d6b13954a7d9ae647b1ad14dd.png"},808:(e,t,r)=>{r.d(t,{Z:()=>a});const a=r.p+"assets/images/rpi-shortcircuit-bc7eb70b313a56a44664ff935497ed96.jpg"},7033:(e,t,r)=>{r.d(t,{Z:()=>a});const a=r.p+"assets/images/rpi-usbc-reimage-1ac52347426ee09dc487c4ec047d0ce8.jpg"}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.bb689ed6.js b/assets/js/935f2afb.329015fb.js similarity index 63% rename from assets/js/935f2afb.bb689ed6.js rename to assets/js/935f2afb.329015fb.js index 44bbfb4d..90a8fc78 100644 --- a/assets/js/935f2afb.bb689ed6.js +++ b/assets/js/935f2afb.329015fb.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Introduction","items":[{"type":"link","label":"Fula Network","href":"/introduction/fula","docId":"introduction/fula"},{"type":"link","label":"Blockchain Attached Storage","href":"/introduction/bas","docId":"introduction/bas"},{"type":"link","label":"Blox as a Service","href":"/introduction/blox","docId":"introduction/blox"},{"type":"category","label":"How to Contribute","items":[{"type":"link","label":"Style Guide","href":"/introduction/contribute/styling","docId":"introduction/contribute/styling"},{"type":"link","label":"Writing Guide","href":"/introduction/contribute/writing","docId":"introduction/contribute/writing"},{"type":"link","label":"Contribution Tutorial","href":"/introduction/contribute/contribution-tutorial","docId":"introduction/contribute/contribution-tutorial"}],"collapsible":true,"collapsed":true,"href":"/introduction/contribute/"}],"collapsible":true,"collapsed":true,"href":"/"},{"type":"category","label":"Functionyard Testnet","items":[{"type":"category","label":"Hardware","items":[{"type":"link","label":"FxBlox Lite (CM4)","href":"/functionyard/hardware/fxblox-hardware-rpi","docId":"functionyard/hardware/fxblox-hardware-rpi"},{"type":"link","label":"FxBlox Lite Plus (RK1)","href":"/functionyard/hardware/fxblox-hardware-rk1","docId":"functionyard/hardware/fxblox-hardware-rk1"}],"collapsible":true,"collapsed":true,"href":"/functionyard/hardware/fxblox-hardware"},{"type":"link","label":"Add Storage","href":"/functionyard/add-storage","docId":"functionyard/add-storage"},{"type":"link","label":"FxBlox App Setup","href":"/functionyard/fxblox-app","docId":"functionyard/fxblox-app"},{"type":"link","label":"Joining Testnet","href":"/functionyard/join","docId":"functionyard/join"},{"type":"link","label":"Token in Metamask","href":"/functionyard/metamask","docId":"functionyard/metamask"},{"type":"link","label":"Decentralized Apps","href":"/functionyard/dapps","docId":"functionyard/dapps"},{"type":"link","label":"FxFotos Apps","href":"/functionyard/fxfotos","docId":"functionyard/fxfotos"}],"collapsible":true,"collapsed":true,"href":"/functionyard/"},{"type":"category","label":"Fula API","items":[{"type":"category","label":"Getting Started","items":[{"type":"link","label":"Running a Box locally","href":"/getting-started/box-setup","docId":"getting-started/box-setup"},{"type":"link","label":"Using Fula Samples","href":"/getting-started/using-samples","docId":"getting-started/using-samples"}],"collapsible":true,"collapsed":true,"href":"/getting-started"},{"type":"category","label":"Reference","items":[{"type":"link","label":"Client Instance","href":"/api/client-instance","docId":"api/client-instance"},{"type":"link","label":"Graph API","href":"/api/graph-api","docId":"api/graph-api"},{"type":"link","label":"File API","href":"/api/file-api","docId":"api/file-api"}],"collapsible":true,"collapsed":true,"href":"/reference-api"}],"collapsible":true,"collapsed":true,"href":"/api-intro"},{"type":"link","label":"Whitepaper","href":"/whitepaper/","docId":"whitepaper/whitepaper"},{"type":"category","label":"RFCs","items":[{"type":"category","label":"Security","items":[{"type":"link","label":"Decentralized Identity (DID)","href":"/RFCs/fula-sec/did","docId":"RFCs/fula-sec/did"},{"type":"link","label":"Two-way Encryption Mechanism","href":"/RFCs/fula-sec/encryption","docId":"RFCs/fula-sec/encryption"}],"collapsible":true,"collapsed":true,"href":"/RFCs/fula-sec"},{"type":"link","label":"Private Network","href":"/RFCs/private-network","docId":"RFCs/private-network"},{"type":"link","label":"Document Syncing","href":"/RFCs/document-syncing","docId":"RFCs/document-syncing"},{"type":"link","label":"Personal Data Reserve","href":"/RFCs/personal-data-reserve","docId":"RFCs/personal-data-reserve"}],"collapsible":true,"collapsed":true,"href":"/RFCs/rfc-process"},{"type":"category","label":"Blockchain","items":[{"type":"category","label":"Services","items":[{"type":"link","label":"Explorer","href":"/blockchain/Services/Explorer","docId":"blockchain/Services/Explorer"},{"type":"link","label":"Test Node","href":"/blockchain/Services/Node","docId":"blockchain/Services/Node"},{"type":"link","label":"Build Node","href":"/blockchain/Services/BuildNode","docId":"blockchain/Services/BuildNode"},{"type":"link","label":"Run Node","href":"/blockchain/Services/RunNode","docId":"blockchain/Services/RunNode"},{"type":"link","label":"Node API","href":"/blockchain/Services/NodeAPI","docId":"blockchain/Services/NodeAPI"},{"type":"link","label":"Proof Engine","href":"/blockchain/Services/ProofEngine","docId":"blockchain/Services/ProofEngine"},{"type":"link","label":"Status","href":"/blockchain/Services/Status","docId":"blockchain/Services/Status"},{"type":"link","label":"Fula Contract API","href":"/blockchain/Services/FulaContractAPI","docId":"blockchain/Services/FulaContractAPI"}],"collapsible":true,"collapsed":true,"href":"/blockchain/services"},{"type":"category","label":"Recipes","items":[{"type":"link","label":"Account","href":"/blockchain/Recipes/Account","docId":"blockchain/Recipes/Account"},{"type":"link","label":"Asset","href":"/blockchain/Recipes/Asset","docId":"blockchain/Recipes/Asset"},{"type":"link","label":"Bag","href":"/blockchain/Recipes/Bag","docId":"blockchain/Recipes/Bag"},{"type":"link","label":"Bundle","href":"/blockchain/Recipes/Bundle","docId":"blockchain/Recipes/Bundle"},{"type":"link","label":"Challenges","href":"/blockchain/Recipes/Challenges","docId":"blockchain/Recipes/Challenges"},{"type":"link","label":"Claims","href":"/blockchain/Recipes/Claims","docId":"blockchain/Recipes/Claims"},{"type":"link","label":"Manifest","href":"/blockchain/Recipes/Manifest","docId":"blockchain/Recipes/Manifest"},{"type":"link","label":"Market","href":"/blockchain/Recipes/Market","docId":"blockchain/Recipes/Market"},{"type":"link","label":"Pool","href":"/blockchain/Recipes/Pool","docId":"blockchain/Recipes/Pool"}],"collapsible":true,"collapsed":true,"href":"/blockchain/recipes"}],"collapsible":true,"collapsed":true,"href":"/blockchain/blockchain-intro"}],"mvpSidebar":[{"type":"category","label":"MVP","items":[{"type":"category","label":"Fotos","items":[{"type":"link","label":"setup","href":"/mvp/fotos/setup","docId":"mvp/fotos/setup"},{"type":"link","label":"backup","href":"/mvp/fotos/backup","docId":"mvp/fotos/backup"},{"type":"link","label":"sharing","href":"/mvp/fotos/sharing","docId":"mvp/fotos/sharing"}],"collapsible":true,"collapsed":true,"href":"/mvp/fotos"},{"type":"category","label":"Pools","items":[{"type":"link","label":"provide storage","href":"/mvp/pools/storage-provide","docId":"mvp/pools/storage-provide"}],"collapsible":true,"collapsed":true,"href":"/mvp/pools"}],"collapsible":true,"collapsed":true,"href":"/mvp"}]},"docs":{"api-intro":{"id":"api-intro","title":"Fula API","description":"We designed Fula API to help you (a third-party, open-source developer) build other rich and compelling user experiences.","sidebar":"tutorialSidebar"},"api/client-instance":{"id":"api/client-instance","title":"Client Instance","description":"Fula client package provides a method createClient that returns client instance. You can use this object to call File and Data APIs.","sidebar":"tutorialSidebar"},"api/file-api":{"id":"api/file-api","title":"File API","description":"File API provides an interface-like object store for you to upload files and streams (eg. photos, videos or any type of document) and efficiently retrieve them for use in your web/mobile DApp.","sidebar":"tutorialSidebar"},"api/graph-api":{"id":"api/graph-api","title":"Graph API","description":"Graph API provides a graphql based interface for storing and querying structured graph. Decentralized application","sidebar":"tutorialSidebar"},"blockchain/blockchain-intro":{"id":"blockchain/blockchain-intro","title":"Blockchain Documentation","description":"Here you can find the documenation on blockchain API and Services.","sidebar":"tutorialSidebar"},"blockchain/recipes":{"id":"blockchain/recipes","title":"Blockchain APIs","description":"Once you have the API up and running, these are the calls you can perform to interact with the Fula nodes.","sidebar":"tutorialSidebar"},"blockchain/Recipes/Account":{"id":"blockchain/Recipes/Account","title":"Account","description":"Create","sidebar":"tutorialSidebar"},"blockchain/Recipes/Asset":{"id":"blockchain/Recipes/Asset","title":"Asset","description":"Create Class","sidebar":"tutorialSidebar"},"blockchain/Recipes/Bag":{"id":"blockchain/Recipes/Bag","title":"Bag","description":"Register","sidebar":"tutorialSidebar"},"blockchain/Recipes/Bundle":{"id":"blockchain/Recipes/Bundle","title":"Bundle","description":"Register","sidebar":"tutorialSidebar"},"blockchain/Recipes/Challenges":{"id":"blockchain/Recipes/Challenges","title":"Challenges","description":"The Challenges were implemented to improve the security of the proof-engine and the claim of the Fula Tokens. The challenges consist of a series of random proof of storage of a manifest and they are made each cycle in the proof-engine, here:","sidebar":"tutorialSidebar"},"blockchain/Recipes/Claims":{"id":"blockchain/Recipes/Claims","title":"Claims","description":"Claim tokens","sidebar":"tutorialSidebar"},"blockchain/Recipes/Manifest":{"id":"blockchain/Recipes/Manifest","title":"Manifest","description":"Upload Manifest","sidebar":"tutorialSidebar"},"blockchain/Recipes/Market":{"id":"blockchain/Recipes/Market","title":"Market","description":"Create","sidebar":"tutorialSidebar"},"blockchain/Recipes/Pool":{"id":"blockchain/Recipes/Pool","title":"Pool","description":"Create","sidebar":"tutorialSidebar"},"blockchain/services":{"id":"blockchain/services","title":"Blockchain Services","description":"Node","sidebar":"tutorialSidebar"},"blockchain/Services/BuildNode":{"id":"blockchain/Services/BuildNode","title":"Build Node","description":"1- Install Rust","sidebar":"tutorialSidebar"},"blockchain/Services/Explorer":{"id":"blockchain/Services/Explorer","title":"Explorer","description":"Install NodeJS","sidebar":"tutorialSidebar"},"blockchain/Services/FulaContractAPI":{"id":"blockchain/Services/FulaContractAPI","title":"Fula Contract API","description":"This is the end point that interacts with Fula blockchain contract","sidebar":"tutorialSidebar"},"blockchain/Services/Node":{"id":"blockchain/Services/Node","title":"Test Node","description":"This document explains how to run sample nodes. However, for an actual node with custom keys please refer to Run Node","sidebar":"tutorialSidebar"},"blockchain/Services/NodeAPI":{"id":"blockchain/Services/NodeAPI","title":"Node API","description":"Install OS dependencies and Rust","sidebar":"tutorialSidebar"},"blockchain/Services/ProofEngine":{"id":"blockchain/Services/ProofEngine","title":"Proof Engine","description":"Install OS dependencies and Rust","sidebar":"tutorialSidebar"},"blockchain/Services/RunNode":{"id":"blockchain/Services/RunNode","title":"Run Node","description":"This docuemnt explains how to run Fula nodes","sidebar":"tutorialSidebar"},"blockchain/Services/Status":{"id":"blockchain/Services/Status","title":"Status","description":"Install NodeJS","sidebar":"tutorialSidebar"},"components/WorkInProgress":{"id":"components/WorkInProgress","title":"WorkInProgress","description":"Please note: these instructions remain a work in progress as we continue to evolve, refine and perfect the Fula API. Make sure to check back soon for more details!"},"design/encryption":{"id":"design/encryption","title":"encryption","description":"Current Process:"},"design/test":{"id":"design/test","title":"test","description":"this is a test"},"functionyard/add-storage":{"id":"functionyard/add-storage","title":"Add Storage","description":"Compatible Storage Drives","sidebar":"tutorialSidebar"},"functionyard/dapps":{"id":"functionyard/dapps","title":"Decentralized Apps","description":"Download FxFotos App","sidebar":"tutorialSidebar"},"functionyard/fxblox-app":{"id":"functionyard/fxblox-app","title":"FxBlox App Setup","description":"Installing the FxBlox App","sidebar":"tutorialSidebar"},"functionyard/fxfotos":{"id":"functionyard/fxfotos","title":"FxFotos Apps","description":"Use case","sidebar":"tutorialSidebar"},"functionyard/hardware/fxblox-hardware":{"id":"functionyard/hardware/fxblox-hardware","title":"FxBlox Hardware","description":"The Difference Between Lite and Lite Plus","sidebar":"tutorialSidebar"},"functionyard/hardware/fxblox-hardware-rk1":{"id":"functionyard/hardware/fxblox-hardware-rk1","title":"FxBlox Lite Plus (RK1)","description":"Updating Your FxBlox Lite Plus (RK1)","sidebar":"tutorialSidebar"},"functionyard/hardware/fxblox-hardware-rpi":{"id":"functionyard/hardware/fxblox-hardware-rpi","title":"FxBlox Lite (CM4)","description":"Updating Your FxBlox Lite (RPI)","sidebar":"tutorialSidebar"},"functionyard/index":{"id":"functionyard/index","title":"Functionyard","description":"This comprehensive guide is designed to assist in preparing a FxBlox owner for the testnet launch. The testnet is called \\"Functionyard\\" and the token is \\"BORG\\".","sidebar":"tutorialSidebar"},"functionyard/join":{"id":"functionyard/join","title":"Joining Testnet","description":"Joining the Testnet","sidebar":"tutorialSidebar"},"functionyard/metamask":{"id":"functionyard/metamask","title":"Token in Metamask","description":"Adding BORG Token to MetaMask on Mumbai Chain","sidebar":"tutorialSidebar"},"getting-started":{"id":"getting-started","title":"Getting Started","description":"In order to start developing your own DApps on Fula, complete these two steps:","sidebar":"tutorialSidebar"},"getting-started/box-setup":{"id":"getting-started/box-setup","title":"Running a Box locally","description":"The easiest way to get your Box server running locally is to clone our repo and use docker.","sidebar":"tutorialSidebar"},"getting-started/fula-client":{"id":"getting-started/fula-client","title":"The Fula Client Library","description":"Fula client lets you connect your web application to the Box using libp2p. It helps DApp developers to use a Box as the back-end for their applications. You can use the File and Graph APIs to store and retrieve your data."},"getting-started/rpi-setup":{"id":"getting-started/rpi-setup","title":"Installing Box on Raspberry Pi OS","description":"Pre-requisites"},"getting-started/using-samples":{"id":"getting-started/using-samples","title":"Using Fula Samples","description":"All the Fula samples can be found in the Fula GitHub repo under examples.","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Welcome","description":"Functionland was founded on a core set of Web3 principles. At the heart of these principles is a simple premise: We each have an inalienable right to own our own data.","sidebar":"tutorialSidebar"},"introduction/bas":{"id":"introduction/bas","title":"Blockchain Attached Storage","description":"You\'ve heard of a network attached storage (NAS), but you haven\'t heard of a blockchain attached storage (BAS).","sidebar":"tutorialSidebar"},"introduction/blox":{"id":"introduction/blox","title":"Blox as a Service","description":"What we are missing in the web2 (and web3) space is a freemium option for consumers to compute on and store larger sets of data.","sidebar":"tutorialSidebar"},"introduction/contribute/contribute":{"id":"introduction/contribute/contribute","title":"How to Contribute","description":"Thank you for your interest in contributing to our open source repositories on GitHub! Your contributions help us improve the services and make everyone\'s experience even better. Here\'s how you can get involved:","sidebar":"tutorialSidebar"},"introduction/contribute/contribution-tutorial":{"id":"introduction/contribute/contribution-tutorial","title":"Contribution Tutorial","description":"This style guide is adapted from IPFS\'s \\"Contribution Tutorial\\" article.","sidebar":"tutorialSidebar"},"introduction/contribute/styling":{"id":"introduction/contribute/styling","title":"Style Guide","description":"This style guide is adapted from IPFS\'s \\"Grammer, formatting, and style\\" rules.","sidebar":"tutorialSidebar"},"introduction/contribute/writing":{"id":"introduction/contribute/writing","title":"Writing Guide","description":"This writing guide is adapted from IPFS\'s \\"writing guide\\" rules.","sidebar":"tutorialSidebar"},"introduction/fula":{"id":"introduction/fula","title":"Fula Network","description":"Fula Network Architecture","sidebar":"tutorialSidebar"},"mvp":{"id":"mvp","title":"Minimum Valuable Product","description":"The following describes how the Fula network software will work from the network participant\'s perspective.","sidebar":"mvpSidebar"},"mvp/admin-reporting":{"id":"mvp/admin-reporting","title":"Admin Reporting & Alerts","description":""},"mvp/box-admin":{"id":"mvp/box-admin","title":"Box Admin","description":"After loading the Box Admin DApp."},"mvp/forgot-password":{"id":"mvp/forgot-password","title":"Forgot Password","description":"If I ever lose or forget my password."},"mvp/fotos":{"id":"mvp/fotos","title":"Fotos","description":"* setup","sidebar":"mvpSidebar"},"mvp/fotos/availability":{"id":"mvp/fotos/availability","title":"Fotos Availability","description":"Acceptance Criteria"},"mvp/fotos/backup":{"id":"mvp/fotos/backup","title":"Fotos Backup to Fula environment","description":"Acceptance Criteria","sidebar":"mvpSidebar"},"mvp/fotos/setup":{"id":"mvp/fotos/setup","title":"Fotos Setup","description":"Acceptance Criteria","sidebar":"mvpSidebar"},"mvp/fotos/sharing":{"id":"mvp/fotos/sharing","title":"Fotos Sharing","description":"Story","sidebar":"mvpSidebar"},"mvp/my-account":{"id":"mvp/my-account","title":"My Account","description":"On my account page."},"mvp/pools":{"id":"mvp/pools","title":"Pools","description":"* storage provide","sidebar":"mvpSidebar"},"mvp/pools/storage-provide":{"id":"mvp/pools/storage-provide","title":"Providing Storage","description":"Acceptance Criteria","sidebar":"mvpSidebar"},"mvp/privacy-dashboard":{"id":"mvp/privacy-dashboard","title":"privacy-dashboard","description":"* I can see all of my data and what DApps are creating/encrypting content."},"mvp/questions":{"id":"mvp/questions","title":"questions","description":"New Questions"},"mvp/technical-questions":{"id":"mvp/technical-questions","title":"technical questions","description":"Local Pools"},"mvp/unboxing":{"id":"mvp/unboxing","title":"Unboxing","description":"As a Box owner."},"reference-api":{"id":"reference-api","title":"Reference","description":"The Fula API includes the following:","sidebar":"tutorialSidebar"},"release/testnet-alpha":{"id":"release/testnet-alpha","title":"Protocol Testnet Alpha Pre-release","description":"Last updated: July 29, 2022"},"RFCs/document-syncing":{"id":"RFCs/document-syncing","title":"Document Syncing","description":"- Start Date: 2022-03-24","sidebar":"tutorialSidebar"},"RFCs/fula-sec":{"id":"RFCs/fula-sec","title":"FULA Security Layer","description":"- Start Date: 2022-02-27","sidebar":"tutorialSidebar"},"RFCs/fula-sec/did":{"id":"RFCs/fula-sec/did","title":"Decentralized Identity (DID)","description":"- Start Date: 2022-02-27","sidebar":"tutorialSidebar"},"RFCs/fula-sec/encryption":{"id":"RFCs/fula-sec/encryption","title":"Two-way Encryption Mechanism","description":"- Start Date: 2022-02-27","sidebar":"tutorialSidebar"},"RFCs/personal-data-reserve":{"id":"RFCs/personal-data-reserve","title":"Personal Data Reserve","description":"- Start Date: 2022-03-18","sidebar":"tutorialSidebar"},"RFCs/private-network":{"id":"RFCs/private-network","title":"Private Network","description":"- Start Date: 2022-02-01","sidebar":"tutorialSidebar"},"RFCs/replication":{"id":"RFCs/replication","title":"Replication","description":"- Start Date: 2022-02-01"},"RFCs/rfc-process":{"id":"RFCs/rfc-process","title":"Requests for comments (RFCs)","description":"What is the RFC process?","sidebar":"tutorialSidebar"},"whitepaper/whitepaper":{"id":"whitepaper/whitepaper","title":"Whitepaper","description":"Functionland Whitepaper","sidebar":"tutorialSidebar"},"work_in_progress":{"id":"work_in_progress","title":"work_in_progress","description":"{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Introduction","items":[{"type":"link","label":"Fula Network","href":"/introduction/fula","docId":"introduction/fula"},{"type":"link","label":"Blockchain Attached Storage","href":"/introduction/bas","docId":"introduction/bas"},{"type":"link","label":"Blox as a Service","href":"/introduction/blox","docId":"introduction/blox"},{"type":"category","label":"How to Contribute","items":[{"type":"link","label":"Style Guide","href":"/introduction/contribute/styling","docId":"introduction/contribute/styling"},{"type":"link","label":"Writing Guide","href":"/introduction/contribute/writing","docId":"introduction/contribute/writing"},{"type":"link","label":"Contribution Tutorial","href":"/introduction/contribute/contribution-tutorial","docId":"introduction/contribute/contribution-tutorial"}],"collapsible":true,"collapsed":true,"href":"/introduction/contribute/"}],"collapsible":true,"collapsed":true,"href":"/"},{"type":"category","label":"Functionyard Testnet","items":[{"type":"category","label":"Hardware","items":[{"type":"link","label":"FxBlox Lite (CM4)","href":"/functionyard/hardware/fxblox-hardware-rpi","docId":"functionyard/hardware/fxblox-hardware-rpi"},{"type":"link","label":"FxBlox Lite Plus (RK1)","href":"/functionyard/hardware/fxblox-hardware-rk1","docId":"functionyard/hardware/fxblox-hardware-rk1"}],"collapsible":true,"collapsed":true,"href":"/functionyard/hardware/fxblox-hardware"},{"type":"link","label":"Add Storage","href":"/functionyard/add-storage","docId":"functionyard/add-storage"},{"type":"link","label":"FxBlox App Setup","href":"/functionyard/fxblox-app","docId":"functionyard/fxblox-app"},{"type":"link","label":"Joining Testnet","href":"/functionyard/join","docId":"functionyard/join"},{"type":"link","label":"Token in Metamask","href":"/functionyard/metamask","docId":"functionyard/metamask"},{"type":"link","label":"Decentralized Apps","href":"/functionyard/dapps","docId":"functionyard/dapps"},{"type":"link","label":"FxFotos Apps","href":"/functionyard/fxfotos","docId":"functionyard/fxfotos"}],"collapsible":true,"collapsed":true,"href":"/functionyard/"},{"type":"category","label":"Fula API","items":[{"type":"category","label":"Getting Started","items":[{"type":"link","label":"Running a Box locally","href":"/getting-started/box-setup","docId":"getting-started/box-setup"},{"type":"link","label":"Using Fula Samples","href":"/getting-started/using-samples","docId":"getting-started/using-samples"}],"collapsible":true,"collapsed":true,"href":"/getting-started"},{"type":"category","label":"Reference","items":[{"type":"link","label":"Client Instance","href":"/api/client-instance","docId":"api/client-instance"},{"type":"link","label":"Graph API","href":"/api/graph-api","docId":"api/graph-api"},{"type":"link","label":"File API","href":"/api/file-api","docId":"api/file-api"}],"collapsible":true,"collapsed":true,"href":"/reference-api"}],"collapsible":true,"collapsed":true,"href":"/api-intro"},{"type":"link","label":"Whitepaper","href":"/whitepaper/","docId":"whitepaper/whitepaper"},{"type":"category","label":"RFCs","items":[{"type":"category","label":"Security","items":[{"type":"link","label":"Decentralized Identity (DID)","href":"/RFCs/fula-sec/did","docId":"RFCs/fula-sec/did"},{"type":"link","label":"Two-way Encryption Mechanism","href":"/RFCs/fula-sec/encryption","docId":"RFCs/fula-sec/encryption"}],"collapsible":true,"collapsed":true,"href":"/RFCs/fula-sec"},{"type":"link","label":"Private Network","href":"/RFCs/private-network","docId":"RFCs/private-network"},{"type":"link","label":"Document Syncing","href":"/RFCs/document-syncing","docId":"RFCs/document-syncing"},{"type":"link","label":"Personal Data Reserve","href":"/RFCs/personal-data-reserve","docId":"RFCs/personal-data-reserve"}],"collapsible":true,"collapsed":true,"href":"/RFCs/rfc-process"},{"type":"category","label":"Blockchain","items":[{"type":"category","label":"Services","items":[{"type":"link","label":"Explorer","href":"/blockchain/Services/Explorer","docId":"blockchain/Services/Explorer"},{"type":"link","label":"Test Node","href":"/blockchain/Services/Node","docId":"blockchain/Services/Node"},{"type":"link","label":"Build Node","href":"/blockchain/Services/BuildNode","docId":"blockchain/Services/BuildNode"},{"type":"link","label":"Run Node","href":"/blockchain/Services/RunNode","docId":"blockchain/Services/RunNode"},{"type":"link","label":"Node API","href":"/blockchain/Services/NodeAPI","docId":"blockchain/Services/NodeAPI"},{"type":"link","label":"Proof Engine","href":"/blockchain/Services/ProofEngine","docId":"blockchain/Services/ProofEngine"},{"type":"link","label":"Status","href":"/blockchain/Services/Status","docId":"blockchain/Services/Status"},{"type":"link","label":"Fula Contract API","href":"/blockchain/Services/FulaContractAPI","docId":"blockchain/Services/FulaContractAPI"}],"collapsible":true,"collapsed":true,"href":"/blockchain/services"},{"type":"category","label":"Recipes","items":[{"type":"link","label":"Account","href":"/blockchain/Recipes/Account","docId":"blockchain/Recipes/Account"},{"type":"link","label":"Asset","href":"/blockchain/Recipes/Asset","docId":"blockchain/Recipes/Asset"},{"type":"link","label":"Bag","href":"/blockchain/Recipes/Bag","docId":"blockchain/Recipes/Bag"},{"type":"link","label":"Bundle","href":"/blockchain/Recipes/Bundle","docId":"blockchain/Recipes/Bundle"},{"type":"link","label":"Challenges","href":"/blockchain/Recipes/Challenges","docId":"blockchain/Recipes/Challenges"},{"type":"link","label":"Claims","href":"/blockchain/Recipes/Claims","docId":"blockchain/Recipes/Claims"},{"type":"link","label":"Manifest","href":"/blockchain/Recipes/Manifest","docId":"blockchain/Recipes/Manifest"},{"type":"link","label":"Market","href":"/blockchain/Recipes/Market","docId":"blockchain/Recipes/Market"},{"type":"link","label":"Pool","href":"/blockchain/Recipes/Pool","docId":"blockchain/Recipes/Pool"}],"collapsible":true,"collapsed":true,"href":"/blockchain/recipes"}],"collapsible":true,"collapsed":true,"href":"/blockchain/blockchain-intro"}],"mvpSidebar":[{"type":"category","label":"MVP","items":[{"type":"category","label":"Fotos","items":[{"type":"link","label":"setup","href":"/mvp/fotos/setup","docId":"mvp/fotos/setup"},{"type":"link","label":"backup","href":"/mvp/fotos/backup","docId":"mvp/fotos/backup"},{"type":"link","label":"sharing","href":"/mvp/fotos/sharing","docId":"mvp/fotos/sharing"}],"collapsible":true,"collapsed":true,"href":"/mvp/fotos"},{"type":"category","label":"Pools","items":[{"type":"link","label":"provide storage","href":"/mvp/pools/storage-provide","docId":"mvp/pools/storage-provide"}],"collapsible":true,"collapsed":true,"href":"/mvp/pools"}],"collapsible":true,"collapsed":true,"href":"/mvp"}]},"docs":{"api-intro":{"id":"api-intro","title":"Fula API","description":"We designed Fula API to help you (a third-party, open-source developer) build other rich and compelling user experiences.","sidebar":"tutorialSidebar"},"api/client-instance":{"id":"api/client-instance","title":"Client Instance","description":"Fula client package provides a method createClient that returns client instance. You can use this object to call File and Data APIs.","sidebar":"tutorialSidebar"},"api/file-api":{"id":"api/file-api","title":"File API","description":"File API provides an interface-like object store for you to upload files and streams (eg. photos, videos or any type of document) and efficiently retrieve them for use in your web/mobile DApp.","sidebar":"tutorialSidebar"},"api/graph-api":{"id":"api/graph-api","title":"Graph API","description":"Graph API provides a graphql based interface for storing and querying structured graph. Decentralized application","sidebar":"tutorialSidebar"},"blockchain/blockchain-intro":{"id":"blockchain/blockchain-intro","title":"Blockchain Documentation","description":"Here you can find the documenation on blockchain API and Services.","sidebar":"tutorialSidebar"},"blockchain/recipes":{"id":"blockchain/recipes","title":"Blockchain APIs","description":"Once you have the API up and running, these are the calls you can perform to interact with the Fula nodes.","sidebar":"tutorialSidebar"},"blockchain/Recipes/Account":{"id":"blockchain/Recipes/Account","title":"Account","description":"Create","sidebar":"tutorialSidebar"},"blockchain/Recipes/Asset":{"id":"blockchain/Recipes/Asset","title":"Asset","description":"Create Class","sidebar":"tutorialSidebar"},"blockchain/Recipes/Bag":{"id":"blockchain/Recipes/Bag","title":"Bag","description":"Register","sidebar":"tutorialSidebar"},"blockchain/Recipes/Bundle":{"id":"blockchain/Recipes/Bundle","title":"Bundle","description":"Register","sidebar":"tutorialSidebar"},"blockchain/Recipes/Challenges":{"id":"blockchain/Recipes/Challenges","title":"Challenges","description":"The Challenges were implemented to improve the security of the proof-engine and the claim of the Fula Tokens. The challenges consist of a series of random proof of storage of a manifest and they are made each cycle in the proof-engine, here:","sidebar":"tutorialSidebar"},"blockchain/Recipes/Claims":{"id":"blockchain/Recipes/Claims","title":"Claims","description":"Claim tokens","sidebar":"tutorialSidebar"},"blockchain/Recipes/Manifest":{"id":"blockchain/Recipes/Manifest","title":"Manifest","description":"Upload Manifest","sidebar":"tutorialSidebar"},"blockchain/Recipes/Market":{"id":"blockchain/Recipes/Market","title":"Market","description":"Create","sidebar":"tutorialSidebar"},"blockchain/Recipes/Pool":{"id":"blockchain/Recipes/Pool","title":"Pool","description":"Create","sidebar":"tutorialSidebar"},"blockchain/services":{"id":"blockchain/services","title":"Blockchain Services","description":"Node","sidebar":"tutorialSidebar"},"blockchain/Services/BuildNode":{"id":"blockchain/Services/BuildNode","title":"Build Node","description":"1- Install Rust","sidebar":"tutorialSidebar"},"blockchain/Services/Explorer":{"id":"blockchain/Services/Explorer","title":"Explorer","description":"Install NodeJS","sidebar":"tutorialSidebar"},"blockchain/Services/FulaContractAPI":{"id":"blockchain/Services/FulaContractAPI","title":"Fula Contract API","description":"This is the end point that interacts with Fula blockchain contract","sidebar":"tutorialSidebar"},"blockchain/Services/Node":{"id":"blockchain/Services/Node","title":"Test Node","description":"This document explains how to run sample nodes. However, for an actual node with custom keys please refer to Run Node","sidebar":"tutorialSidebar"},"blockchain/Services/NodeAPI":{"id":"blockchain/Services/NodeAPI","title":"Node API","description":"Install OS dependencies and Rust","sidebar":"tutorialSidebar"},"blockchain/Services/ProofEngine":{"id":"blockchain/Services/ProofEngine","title":"Proof Engine","description":"Install OS dependencies and Rust","sidebar":"tutorialSidebar"},"blockchain/Services/RunNode":{"id":"blockchain/Services/RunNode","title":"Run Node","description":"This docuemnt explains how to run Fula nodes","sidebar":"tutorialSidebar"},"blockchain/Services/Status":{"id":"blockchain/Services/Status","title":"Status","description":"Install NodeJS","sidebar":"tutorialSidebar"},"components/WorkInProgress":{"id":"components/WorkInProgress","title":"WorkInProgress","description":"Please note: these instructions remain a work in progress as we continue to evolve, refine and perfect the Fula API. Make sure to check back soon for more details!"},"design/encryption":{"id":"design/encryption","title":"encryption","description":"Current Process:"},"design/test":{"id":"design/test","title":"test","description":"this is a test"},"functionyard/add-storage":{"id":"functionyard/add-storage","title":"Add Storage","description":"Compatible Storage Drives","sidebar":"tutorialSidebar"},"functionyard/dapps":{"id":"functionyard/dapps","title":"Decentralized Apps","description":"Download FxFotos App","sidebar":"tutorialSidebar"},"functionyard/fxblox-app":{"id":"functionyard/fxblox-app","title":"FxBlox App Setup","description":"Installing the FxBlox App","sidebar":"tutorialSidebar"},"functionyard/fxfotos":{"id":"functionyard/fxfotos","title":"FxFotos Apps","description":"Use case","sidebar":"tutorialSidebar"},"functionyard/hardware/fxblox-hardware":{"id":"functionyard/hardware/fxblox-hardware","title":"FxBlox Hardware","description":"The Difference Between Lite and Lite Plus","sidebar":"tutorialSidebar"},"functionyard/hardware/fxblox-hardware-rk1":{"id":"functionyard/hardware/fxblox-hardware-rk1","title":"FxBlox Lite Plus (RK1)","description":"Updating Your FxBlox Lite Plus (RK1)","sidebar":"tutorialSidebar"},"functionyard/hardware/fxblox-hardware-rpi":{"id":"functionyard/hardware/fxblox-hardware-rpi","title":"FxBlox Lite (CM4)","description":"Updating Your FxBlox Lite (RPI)","sidebar":"tutorialSidebar"},"functionyard/hardware/fxblox-hardware-rpi-reimage":{"id":"functionyard/hardware/fxblox-hardware-rpi-reimage","title":"Re-imaging CM4","description":"Re-imaging CM4"},"functionyard/index":{"id":"functionyard/index","title":"Functionyard","description":"This comprehensive guide is designed to assist in preparing a FxBlox owner for the testnet launch. The testnet is called \\"Functionyard\\" and the token is \\"BORG\\".","sidebar":"tutorialSidebar"},"functionyard/join":{"id":"functionyard/join","title":"Joining Testnet","description":"Joining the Testnet","sidebar":"tutorialSidebar"},"functionyard/metamask":{"id":"functionyard/metamask","title":"Token in Metamask","description":"Adding BORG Token to MetaMask on Mumbai Chain","sidebar":"tutorialSidebar"},"getting-started":{"id":"getting-started","title":"Getting Started","description":"In order to start developing your own DApps on Fula, complete these two steps:","sidebar":"tutorialSidebar"},"getting-started/box-setup":{"id":"getting-started/box-setup","title":"Running a Box locally","description":"The easiest way to get your Box server running locally is to clone our repo and use docker.","sidebar":"tutorialSidebar"},"getting-started/fula-client":{"id":"getting-started/fula-client","title":"The Fula Client Library","description":"Fula client lets you connect your web application to the Box using libp2p. It helps DApp developers to use a Box as the back-end for their applications. You can use the File and Graph APIs to store and retrieve your data."},"getting-started/rpi-setup":{"id":"getting-started/rpi-setup","title":"Installing Box on Raspberry Pi OS","description":"Pre-requisites"},"getting-started/using-samples":{"id":"getting-started/using-samples","title":"Using Fula Samples","description":"All the Fula samples can be found in the Fula GitHub repo under examples.","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Welcome","description":"Functionland was founded on a core set of Web3 principles. At the heart of these principles is a simple premise: We each have an inalienable right to own our own data.","sidebar":"tutorialSidebar"},"introduction/bas":{"id":"introduction/bas","title":"Blockchain Attached Storage","description":"You\'ve heard of a network attached storage (NAS), but you haven\'t heard of a blockchain attached storage (BAS).","sidebar":"tutorialSidebar"},"introduction/blox":{"id":"introduction/blox","title":"Blox as a Service","description":"What we are missing in the web2 (and web3) space is a freemium option for consumers to compute on and store larger sets of data.","sidebar":"tutorialSidebar"},"introduction/contribute/contribute":{"id":"introduction/contribute/contribute","title":"How to Contribute","description":"Thank you for your interest in contributing to our open source repositories on GitHub! Your contributions help us improve the services and make everyone\'s experience even better. Here\'s how you can get involved:","sidebar":"tutorialSidebar"},"introduction/contribute/contribution-tutorial":{"id":"introduction/contribute/contribution-tutorial","title":"Contribution Tutorial","description":"This style guide is adapted from IPFS\'s \\"Contribution Tutorial\\" article.","sidebar":"tutorialSidebar"},"introduction/contribute/styling":{"id":"introduction/contribute/styling","title":"Style Guide","description":"This style guide is adapted from IPFS\'s \\"Grammer, formatting, and style\\" rules.","sidebar":"tutorialSidebar"},"introduction/contribute/writing":{"id":"introduction/contribute/writing","title":"Writing Guide","description":"This writing guide is adapted from IPFS\'s \\"writing guide\\" rules.","sidebar":"tutorialSidebar"},"introduction/fula":{"id":"introduction/fula","title":"Fula Network","description":"Fula Network Architecture","sidebar":"tutorialSidebar"},"mvp":{"id":"mvp","title":"Minimum Valuable Product","description":"The following describes how the Fula network software will work from the network participant\'s perspective.","sidebar":"mvpSidebar"},"mvp/admin-reporting":{"id":"mvp/admin-reporting","title":"Admin Reporting & Alerts","description":""},"mvp/box-admin":{"id":"mvp/box-admin","title":"Box Admin","description":"After loading the Box Admin DApp."},"mvp/forgot-password":{"id":"mvp/forgot-password","title":"Forgot Password","description":"If I ever lose or forget my password."},"mvp/fotos":{"id":"mvp/fotos","title":"Fotos","description":"* setup","sidebar":"mvpSidebar"},"mvp/fotos/availability":{"id":"mvp/fotos/availability","title":"Fotos Availability","description":"Acceptance Criteria"},"mvp/fotos/backup":{"id":"mvp/fotos/backup","title":"Fotos Backup to Fula environment","description":"Acceptance Criteria","sidebar":"mvpSidebar"},"mvp/fotos/setup":{"id":"mvp/fotos/setup","title":"Fotos Setup","description":"Acceptance Criteria","sidebar":"mvpSidebar"},"mvp/fotos/sharing":{"id":"mvp/fotos/sharing","title":"Fotos Sharing","description":"Story","sidebar":"mvpSidebar"},"mvp/my-account":{"id":"mvp/my-account","title":"My Account","description":"On my account page."},"mvp/pools":{"id":"mvp/pools","title":"Pools","description":"* storage provide","sidebar":"mvpSidebar"},"mvp/pools/storage-provide":{"id":"mvp/pools/storage-provide","title":"Providing Storage","description":"Acceptance Criteria","sidebar":"mvpSidebar"},"mvp/privacy-dashboard":{"id":"mvp/privacy-dashboard","title":"privacy-dashboard","description":"* I can see all of my data and what DApps are creating/encrypting content."},"mvp/questions":{"id":"mvp/questions","title":"questions","description":"New Questions"},"mvp/technical-questions":{"id":"mvp/technical-questions","title":"technical questions","description":"Local Pools"},"mvp/unboxing":{"id":"mvp/unboxing","title":"Unboxing","description":"As a Box owner."},"reference-api":{"id":"reference-api","title":"Reference","description":"The Fula API includes the following:","sidebar":"tutorialSidebar"},"release/testnet-alpha":{"id":"release/testnet-alpha","title":"Protocol Testnet Alpha Pre-release","description":"Last updated: July 29, 2022"},"RFCs/document-syncing":{"id":"RFCs/document-syncing","title":"Document Syncing","description":"- Start Date: 2022-03-24","sidebar":"tutorialSidebar"},"RFCs/fula-sec":{"id":"RFCs/fula-sec","title":"FULA Security Layer","description":"- Start Date: 2022-02-27","sidebar":"tutorialSidebar"},"RFCs/fula-sec/did":{"id":"RFCs/fula-sec/did","title":"Decentralized Identity (DID)","description":"- Start Date: 2022-02-27","sidebar":"tutorialSidebar"},"RFCs/fula-sec/encryption":{"id":"RFCs/fula-sec/encryption","title":"Two-way Encryption Mechanism","description":"- Start Date: 2022-02-27","sidebar":"tutorialSidebar"},"RFCs/personal-data-reserve":{"id":"RFCs/personal-data-reserve","title":"Personal Data Reserve","description":"- Start Date: 2022-03-18","sidebar":"tutorialSidebar"},"RFCs/private-network":{"id":"RFCs/private-network","title":"Private Network","description":"- Start Date: 2022-02-01","sidebar":"tutorialSidebar"},"RFCs/replication":{"id":"RFCs/replication","title":"Replication","description":"- Start Date: 2022-02-01"},"RFCs/rfc-process":{"id":"RFCs/rfc-process","title":"Requests for comments (RFCs)","description":"What is the RFC process?","sidebar":"tutorialSidebar"},"whitepaper/whitepaper":{"id":"whitepaper/whitepaper","title":"Whitepaper","description":"Functionland Whitepaper","sidebar":"tutorialSidebar"},"work_in_progress":{"id":"work_in_progress","title":"work_in_progress","description":"{n.d(t,{Zo:()=>p,kt:()=>m});var o=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=o.createContext({}),d=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=d(e.components);return o.createElement(s.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},u=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=d(n),m=a,h=u["".concat(s,".").concat(m)]||u[m]||c[m]||i;return n?o.createElement(h,r(r({ref:t},p),{},{components:n})):o.createElement(h,r({ref:t},p))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,r=new Array(i);r[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,r[1]=l;for(var d=2;d{n.r(t),n.d(t,{contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var o=n(7462),a=(n(7294),n(3905));const i={title:"Joining Testnet",id:"join"},r=void 0,l={unversionedId:"functionyard/join",id:"functionyard/join",title:"Joining Testnet",description:"Joining the Testnet",source:"@site/docs/functionyard/join.md",sourceDirName:"functionyard",slug:"/functionyard/join",permalink:"/functionyard/join",tags:[],version:"current",frontMatter:{title:"Joining Testnet",id:"join"},sidebar:"tutorialSidebar",previous:{title:"FxBlox App Setup",permalink:"/functionyard/fxblox-app"},next:{title:"Token in Metamask",permalink:"/functionyard/metamask"}},s=[{value:"Joining the Testnet",id:"joining-the-testnet",children:[],level:2},{value:"Add Multiple FxBloxes",id:"add-multiple-fxbloxes",children:[{value:"Bought during Indiegogo campaign",id:"bought-during-indiegogo-campaign",children:[],level:3},{value:"Bought Blox outside of campaign",id:"bought-blox-outside-of-campaign",children:[],level:3}],level:2}],d={toc:s};function p(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,o.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"joining-the-testnet"},"Joining the Testnet"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"In the ",(0,a.kt)("inlineCode",{parentName:"li"},"FxBlox")," App, go to the ",(0,a.kt)("inlineCode",{parentName:"li"},"Users")," Page and click ",(0,a.kt)("inlineCode",{parentName:"li"},"Join Testnet"),(0,a.kt)("div",{class:"text--center"},(0,a.kt)("img",{src:"/img/fxyard-network/join-testnet.png",style:{width:400}})))),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Or you can manually visit the testnet page at ",(0,a.kt)("a",{parentName:"li",href:"https://fund.functionyard.fula.network"},"Functionyard Testnet")," and enter your Indiegogo campaign order details and account id from the Blox app."),(0,a.kt)("li",{parentName:"ul"},"If the ",(0,a.kt)("inlineCode",{parentName:"li"},"Account")," and ",(0,a.kt)("inlineCode",{parentName:"li"},"Join")," buttons are greyed out, it means the blox is still syncing the chain data. You can check the progress of sync in the ",(0,a.kt)("inlineCode",{parentName:"li"},"Settings -> Pools")," page.")),(0,a.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,a.kt)("div",{parentName:"div",className:"admonition-heading"},(0,a.kt)("h5",{parentName:"div"},(0,a.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,a.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,a.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,a.kt)("div",{parentName:"div",className:"admonition-content"},(0,a.kt)("p",{parentName:"div"},'If after the sync is over you get any errors, you can tap on the tower icon in the home page and click "Reset Chain Data"'))),(0,a.kt)("ol",{start:2},(0,a.kt)("li",{parentName:"ol"},"In the FxBlox app, go to ",(0,a.kt)("inlineCode",{parentName:"li"},"Settings > Pools"),". Join a pool nearest to your city. Choose the one closest to you from the list. Please note, that if you choose a pool that is far from you, the request will automatically rejected by the system.")),(0,a.kt)("div",{class:"text--center"},(0,a.kt)("img",{src:"/img/fxyard-network/join-btn.png",style:{width:400}})),(0,a.kt)("ol",{start:3},(0,a.kt)("li",{parentName:"ol"},"Wait for approval from 5 pool members (may take up to 2 hours right now).")),(0,a.kt)("div",{class:"text--center"},(0,a.kt)("img",{src:"/img/fxyard-network/cancel-btn.png",style:{width:400}})),(0,a.kt)("ol",{start:4},(0,a.kt)("li",{parentName:"ol"},'Once approved, the pool button changes to "Leave". You can now start storing and earning. You should start using FxFotos app to maximize earnings.')),(0,a.kt)("div",{class:"text--center"},(0,a.kt)("img",{src:"/img/fxyard-network/leave-btn.png",style:{width:400}})),(0,a.kt)("h2",{id:"add-multiple-fxbloxes"},"Add Multiple FxBloxes"),(0,a.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,a.kt)("div",{parentName:"div",className:"admonition-heading"},(0,a.kt)("h5",{parentName:"div"},(0,a.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,a.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,a.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,a.kt)("div",{parentName:"div",className:"admonition-content"},(0,a.kt)("p",{parentName:"div"},"If you do not already have all Bloxes added in your app, then checkout ",(0,a.kt)("a",{parentName:"p",href:"/functionyard/fxblox-app#add-multiple-fxbloxes"},"this guide")," on how to add them."))),(0,a.kt)("p",null,"Every FxBlox is not automatically enrolled in the testnet. The Blox that is showing in the ",(0,a.kt)("inlineCode",{parentName:"p"},"Blox"),' tab, is the "Active" Blox which populates the rest of the settings. There are two scenarios that you may fall under.'),(0,a.kt)("h3",{id:"bought-during-indiegogo-campaign"},"Bought during Indiegogo campaign"),(0,a.kt)("p",null,"To add any extra Bloxes to the testnet, you need to:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Make sure you have already followed ",(0,a.kt)("a",{parentName:"li",href:"#joining-the-testnet"},"the steps above")," to add your first Blox to the testnet. "),(0,a.kt)("li",{parentName:"ol"},"Swipe left/right to display the next Blox you want to add."),(0,a.kt)("li",{parentName:"ol"},"Go to ",(0,a.kt)("inlineCode",{parentName:"li"},"Settings")," -> ",(0,a.kt)("inlineCode",{parentName:"li"},"Pool"),", select the testnet pool closest to you."),(0,a.kt)("li",{parentName:"ol"},"Repeat steps 2-3 for any following Blox.")),(0,a.kt)("h3",{id:"bought-blox-outside-of-campaign"},"Bought Blox outside of campaign"),(0,a.kt)("p",null,"If you bought a Blox from the available units on the ",(0,a.kt)("a",{parentName:"p",href:"https://shop.fx.land/"},"shop.fx.land")," or a second-hand resellers site. Then you will need to send a message to ",(0,a.kt)("a",{parentName:"p",href:"mailto:sales@fx.land"},"sales@fx.land")," to have your ",(0,a.kt)("inlineCode",{parentName:"p"},"Blox Account ID")," added to testnet backend. You ",(0,a.kt)("inlineCode",{parentName:"p"},"Blox Account ID")," is shown under the ",(0,a.kt)("inlineCode",{parentName:"p"},"User")," Tab after completing setup."),(0,a.kt)("p",null,"After this has been completed, you will have to wait a couple hours for the testnet to sync and then yo uwill be able to join."))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[815],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>m});var o=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=o.createContext({}),d=function(e){var t=o.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=d(e.components);return o.createElement(s.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},u=o.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),u=d(n),m=a,h=u["".concat(s,".").concat(m)]||u[m]||c[m]||i;return n?o.createElement(h,r(r({ref:t},p),{},{components:n})):o.createElement(h,r({ref:t},p))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,r=new Array(i);r[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,r[1]=l;for(var d=2;d{n.r(t),n.d(t,{contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>s});var o=n(7462),a=(n(7294),n(3905));const i={title:"Joining Testnet",id:"join"},r=void 0,l={unversionedId:"functionyard/join",id:"functionyard/join",title:"Joining Testnet",description:"Joining the Testnet",source:"@site/docs/functionyard/join.md",sourceDirName:"functionyard",slug:"/functionyard/join",permalink:"/functionyard/join",tags:[],version:"current",frontMatter:{title:"Joining Testnet",id:"join"},sidebar:"tutorialSidebar",previous:{title:"FxBlox App Setup",permalink:"/functionyard/fxblox-app"},next:{title:"Token in Metamask",permalink:"/functionyard/metamask"}},s=[{value:"Joining the Testnet",id:"joining-the-testnet",children:[],level:2},{value:"Add Multiple FxBloxes",id:"add-multiple-fxbloxes",children:[{value:"Bought during Indiegogo campaign",id:"bought-during-indiegogo-campaign",children:[],level:3},{value:"Bought Blox outside of campaign",id:"bought-blox-outside-of-campaign",children:[],level:3}],level:2}],d={toc:s};function p(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,o.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h2",{id:"joining-the-testnet"},"Joining the Testnet"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"In the ",(0,a.kt)("inlineCode",{parentName:"li"},"FxBlox")," App, go to the ",(0,a.kt)("inlineCode",{parentName:"li"},"Users")," Page and click ",(0,a.kt)("inlineCode",{parentName:"li"},"Join Testnet"),(0,a.kt)("div",{class:"text--center"},(0,a.kt)("img",{src:"/img/fxyard-network/join-testnet.png",style:{width:400}})))),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Or you can manually visit the testnet page at ",(0,a.kt)("a",{parentName:"li",href:"https://fund.functionyard.fula.network"},"Functionyard Testnet")," and enter your Indiegogo campaign order details and account id from the Blox app."),(0,a.kt)("li",{parentName:"ul"},"If the ",(0,a.kt)("inlineCode",{parentName:"li"},"Account")," and ",(0,a.kt)("inlineCode",{parentName:"li"},"Join")," buttons are greyed out, it means the blox is still syncing the chain data. You can check the progress of sync in the ",(0,a.kt)("inlineCode",{parentName:"li"},"Settings -> Pools")," page.")),(0,a.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,a.kt)("div",{parentName:"div",className:"admonition-heading"},(0,a.kt)("h5",{parentName:"div"},(0,a.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,a.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,a.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,a.kt)("div",{parentName:"div",className:"admonition-content"},(0,a.kt)("p",{parentName:"div"},'If after the sync is over you get any errors, you can tap on the tower icon in the home page and click "Reset Chain Data"'))),(0,a.kt)("ol",{start:2},(0,a.kt)("li",{parentName:"ol"},"In the FxBlox app, go to ",(0,a.kt)("inlineCode",{parentName:"li"},"Settings > Pools"),". Join a pool nearest to your city. Choose the one closest to you from the list. Please note, that if you choose a pool that is far from you, the request will automatically rejected by the system.")),(0,a.kt)("div",{class:"text--center"},(0,a.kt)("img",{src:"/img/fxyard-network/join-btn.png",style:{width:400}})),(0,a.kt)("ol",{start:3},(0,a.kt)("li",{parentName:"ol"},"Wait for approval from 5 pool members (may take up to 2 hours right now).")),(0,a.kt)("div",{class:"text--center"},(0,a.kt)("img",{src:"/img/fxyard-network/cancel-btn.png",style:{width:400}})),(0,a.kt)("ol",{start:4},(0,a.kt)("li",{parentName:"ol"},'Once approved, the pool button changes to "Leave". You can now start storing and earning. You should start using FxFotos app to maximize earnings.')),(0,a.kt)("div",{class:"text--center"},(0,a.kt)("img",{src:"/img/fxyard-network/leave-btn.png",style:{width:400}})),(0,a.kt)("h2",{id:"add-multiple-fxbloxes"},"Add Multiple FxBloxes"),(0,a.kt)("div",{className:"admonition admonition-info alert alert--info"},(0,a.kt)("div",{parentName:"div",className:"admonition-heading"},(0,a.kt)("h5",{parentName:"div"},(0,a.kt)("span",{parentName:"h5",className:"admonition-icon"},(0,a.kt)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},(0,a.kt)("path",{parentName:"svg",fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"}))),"info")),(0,a.kt)("div",{parentName:"div",className:"admonition-content"},(0,a.kt)("p",{parentName:"div"},"If you do not already have all Bloxes added in your app, then checkout ",(0,a.kt)("a",{parentName:"p",href:"/functionyard/fxblox-app#add-multiple-fxbloxes"},"this guide")," on how to add them."))),(0,a.kt)("p",null,"Every FxBlox is not automatically enrolled in the testnet. The Blox that is showing in the ",(0,a.kt)("inlineCode",{parentName:"p"},"Blox"),' tab, is the "Active" Blox which populates the rest of the settings. There are two scenarios that you may fall under.'),(0,a.kt)("h3",{id:"bought-during-indiegogo-campaign"},"Bought during Indiegogo campaign"),(0,a.kt)("p",null,"To add any extra Bloxes to the testnet, you need to:"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},"Make sure you have already followed ",(0,a.kt)("a",{parentName:"li",href:"#joining-the-testnet"},"the steps above")," to add your first Blox to the testnet. "),(0,a.kt)("li",{parentName:"ol"},"Swipe left/right to display the next Blox you want to add."),(0,a.kt)("li",{parentName:"ol"},"Go to ",(0,a.kt)("inlineCode",{parentName:"li"},"Settings")," -> ",(0,a.kt)("inlineCode",{parentName:"li"},"Pool"),", select the testnet pool closest to you."),(0,a.kt)("li",{parentName:"ol"},"Repeat steps 2-3 for any following Blox.")),(0,a.kt)("h3",{id:"bought-blox-outside-of-campaign"},"Bought Blox outside of campaign"),(0,a.kt)("p",null,"If you bought a Blox from the available units on the ",(0,a.kt)("a",{parentName:"p",href:"https://shop.fx.land/"},"shop.fx.land")," or a second-hand resellers site. Then you will need to send a message to ",(0,a.kt)("a",{parentName:"p",href:"mailto:sales@fx.land"},"sales@fx.land")," to have your ",(0,a.kt)("inlineCode",{parentName:"p"},"Blox Account ID")," added to testnet backend. You ",(0,a.kt)("inlineCode",{parentName:"p"},"Blox Account ID")," is shown under the ",(0,a.kt)("inlineCode",{parentName:"p"},"User")," Tab after completing setup."),(0,a.kt)("p",null,"After this has been completed, you will have to wait a couple hours for the testnet to sync and then you will be able to join."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.a6b3114a.js b/assets/js/main.a6b3114a.js new file mode 100644 index 00000000..2dfbb2d0 --- /dev/null +++ b/assets/js/main.a6b3114a.js @@ -0,0 +1,2 @@ +/*! For license information please see main.a6b3114a.js.LICENSE.txt */ +(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[179],{9782:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r={deploymentBranch:"main",title:"Functionland",tagline:"",url:"https://functionland.github.io",baseUrl:"/",onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",favicon:"img/favicon.webp",organizationName:"functionland",projectName:"functionland.github.io",trailingSlash:!1,presets:[["classic",{docs:{routeBasePath:"/",sidebarPath:"/home/runner/work/docs/docs/sidebars.js"},theme:{customCss:"/home/runner/work/docs/docs/src/css/custom.css"}}]],themeConfig:{navbar:{title:"Functionland",logo:{alt:"functionland logo",src:"img/logo.webp"},items:[{href:"https://github.com/functionland",label:"GitHub",position:"right"}],hideOnScroll:!1},prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:[]},colorMode:{defaultMode:"light",disableSwitch:!1,respectPrefersColorScheme:!1,switchConfig:{darkIcon:"\ud83c\udf1c",darkIconStyle:{},lightIcon:"\ud83c\udf1e",lightIconStyle:{}}},docs:{versionPersistence:"localStorage"},metadata:[],hideableSidebar:!1,autoCollapseSidebarCategories:!1,tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,i18n:{defaultLocale:"en",locales:["en"],localeConfigs:{}},onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},plugins:[],themes:[],titleDelimiter:"|",noIndex:!1}},2067:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(8356),l=n.n(i);function s(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("div",{style:{align:"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,t.message),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}const c=JSON.parse('{"/blog/archive-f4c":{"component":"9e4087bc","archive":"b2f554cd"},"/-244":{"component":"1be78505","versionMetadata":"935f2afb"},"/-98e":{"component":"17896441","content":"c377a04b"},"/api-intro-a34":{"component":"17896441","content":"74636f36"},"/api/client-instance-b3a":{"component":"17896441","content":"313672b0"},"/api/file-api-90c":{"component":"17896441","content":"f7d1f36e"},"/api/graph-api-7ac":{"component":"17896441","content":"00e8b4a4"},"/blockchain/blockchain-intro-c9b":{"component":"17896441","content":"395b74f0"},"/blockchain/recipes-28d":{"component":"17896441","content":"0ab2a066"},"/blockchain/Recipes/Account-000":{"component":"17896441","content":"831e3b29"},"/blockchain/Recipes/Asset-4e2":{"component":"17896441","content":"7ad88a01"},"/blockchain/Recipes/Bag-832":{"component":"17896441","content":"39968117"},"/blockchain/Recipes/Bundle-0ad":{"component":"17896441","content":"72fa51da"},"/blockchain/Recipes/Challenges-44d":{"component":"17896441","content":"ffb0c1a3"},"/blockchain/Recipes/Claims-7a5":{"component":"17896441","content":"c7806b8e"},"/blockchain/Recipes/Manifest-c98":{"component":"17896441","content":"8ef82ac0"},"/blockchain/Recipes/Market-446":{"component":"17896441","content":"952b5e81"},"/blockchain/Recipes/Pool-1e5":{"component":"17896441","content":"2a6dab62"},"/blockchain/services-0b4":{"component":"17896441","content":"b48a96ee"},"/blockchain/Services/BuildNode-eb6":{"component":"17896441","content":"79f59562"},"/blockchain/Services/Explorer-67a":{"component":"17896441","content":"0f3c4d9e"},"/blockchain/Services/FulaContractAPI-8b5":{"component":"17896441","content":"32415a15"},"/blockchain/Services/Node-038":{"component":"17896441","content":"6f0e7e6f"},"/blockchain/Services/NodeAPI-078":{"component":"17896441","content":"7dbfe80c"},"/blockchain/Services/ProofEngine-45c":{"component":"17896441","content":"bc2ced7b"},"/blockchain/Services/RunNode-c20":{"component":"17896441","content":"f0ae19a0"},"/blockchain/Services/Status-5e5":{"component":"17896441","content":"f277957b"},"/components/WorkInProgress-c06":{"component":"17896441","content":"e58963f1"},"/design/encryption-763":{"component":"17896441","content":"37866fe0"},"/design/test-86a":{"component":"17896441","content":"c4cee058"},"/functionyard-7ac":{"component":"17896441","content":"533b8a8b"},"/functionyard/add-storage-9cd":{"component":"17896441","content":"1299eea8"},"/functionyard/dapps-c9f":{"component":"17896441","content":"f9725412"},"/functionyard/fxblox-app-6ce":{"component":"17896441","content":"799a1b22"},"/functionyard/fxfotos-a2c":{"component":"17896441","content":"48a74962"},"/functionyard/hardware/fxblox-hardware-90a":{"component":"17896441","content":"dbaeb152"},"/functionyard/hardware/fxblox-hardware-rk1-f1c":{"component":"17896441","content":"aa32ca26"},"/functionyard/hardware/fxblox-hardware-rpi-115":{"component":"17896441","content":"1c5b444a"},"/functionyard/hardware/fxblox-hardware-rpi-reimage-bc0":{"component":"17896441","content":"7e4aa304"},"/functionyard/join-cd1":{"component":"17896441","content":"a98adb27"},"/functionyard/metamask-739":{"component":"17896441","content":"b7a78bd3"},"/getting-started-c9b":{"component":"17896441","content":"d589d3a7"},"/getting-started/box-setup-3d2":{"component":"17896441","content":"da49a82e"},"/getting-started/fula-client-1d1":{"component":"17896441","content":"1cc0488f"},"/getting-started/rpi-setup-19a":{"component":"17896441","content":"63c3a5f4"},"/getting-started/using-samples-a3e":{"component":"17896441","content":"17e75398"},"/introduction/bas-0ae":{"component":"17896441","content":"f9ddae1b"},"/introduction/blox-ab0":{"component":"17896441","content":"748a29f1"},"/introduction/contribute-850":{"component":"17896441","content":"a2977611"},"/introduction/contribute/contribution-tutorial-2b9":{"component":"17896441","content":"96034ec1"},"/introduction/contribute/styling-a1e":{"component":"17896441","content":"2e7550da"},"/introduction/contribute/writing-0dd":{"component":"17896441","content":"ca2fca4c"},"/introduction/fula-032":{"component":"17896441","content":"6c7613ed"},"/mvp-308":{"component":"17896441","content":"b0d6fa48"},"/mvp/admin-reporting-c99":{"component":"17896441","content":"eb64892a"},"/mvp/box-admin-577":{"component":"17896441","content":"27873332"},"/mvp/forgot-password-e97":{"component":"17896441","content":"ec73ac1d"},"/mvp/fotos-b03":{"component":"17896441","content":"f3ebba76"},"/mvp/fotos/availability-bfb":{"component":"17896441","content":"5a04bf5c"},"/mvp/fotos/backup-481":{"component":"17896441","content":"f2d4d1e7"},"/mvp/fotos/setup-8f6":{"component":"17896441","content":"c9e48236"},"/mvp/fotos/sharing-059":{"component":"17896441","content":"f19b4864"},"/mvp/my-account-79c":{"component":"17896441","content":"8a24b94f"},"/mvp/pools-b04":{"component":"17896441","content":"e9a5100a"},"/mvp/pools/storage-provide-eaf":{"component":"17896441","content":"b80db04d"},"/mvp/privacy-dashboard-4e1":{"component":"17896441","content":"256e3dd8"},"/mvp/questions-497":{"component":"17896441","content":"7e50ec22"},"/mvp/technical-questions-e66":{"component":"17896441","content":"07401f6a"},"/mvp/unboxing-ef3":{"component":"17896441","content":"4321c919"},"/reference-api-669":{"component":"17896441","content":"18f5500a"},"/release/testnet-alpha-9f4":{"component":"17896441","content":"be614d59"},"/RFCs/document-syncing-9f5":{"component":"17896441","content":"68453654"},"/RFCs/fula-sec-fd9":{"component":"17896441","content":"eb9f70f2"},"/RFCs/fula-sec/did-357":{"component":"17896441","content":"665bb1c2"},"/RFCs/fula-sec/encryption-93a":{"component":"17896441","content":"01430d47"},"/RFCs/personal-data-reserve-557":{"component":"17896441","content":"bd78fdc3"},"/RFCs/private-network-f3c":{"component":"17896441","content":"649c7e91"},"/RFCs/replication-ea8":{"component":"17896441","content":"ef6fc643"},"/RFCs/rfc-process-0ae":{"component":"17896441","content":"ec9cc4dd"},"/whitepaper-fae":{"component":"17896441","content":"736647ea"},"/work_in_progress-86d":{"component":"17896441","content":"2b0a0def"}}'),u={"00e8b4a4":[()=>n.e(7823).then(n.bind(n,1786)),"@site/docs/api/graph.md",1786],"01430d47":[()=>n.e(1752).then(n.bind(n,2938)),"@site/docs/RFCs/fula-sec/encryption.md",2938],"07401f6a":[()=>n.e(9104).then(n.bind(n,5196)),"@site/docs/mvp/technical_questions.md",5196],"0ab2a066":[()=>n.e(5065).then(n.bind(n,2673)),"@site/docs/blockchain/recipes.md",2673],"0f3c4d9e":[()=>n.e(7648).then(n.bind(n,1310)),"@site/docs/blockchain/Services/Explorer.md",1310],"1299eea8":[()=>Promise.all([n.e(1068),n.e(2217)]).then(n.bind(n,3399)),"@site/docs/functionyard/add-storage.md",3399],17896441:[()=>Promise.all([n.e(532),n.e(7918)]).then(n.bind(n,8406)),"@theme/DocItem",8406],"17e75398":[()=>n.e(3300).then(n.bind(n,3530)),"@site/docs/getting-started/using-samples.md",3530],"18f5500a":[()=>n.e(6936).then(n.bind(n,3312)),"@site/docs/reference-api.md",3312],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,7465)),"@theme/DocPage",7465],"1c5b444a":[()=>n.e(3693).then(n.bind(n,8456)),"@site/docs/functionyard/hardware/fxblox-hardware-rpi.md",8456],"1cc0488f":[()=>n.e(1919).then(n.bind(n,8478)),"@site/docs/getting-started/fula-client.md",8478],"256e3dd8":[()=>n.e(8432).then(n.bind(n,8398)),"@site/docs/mvp/privacy-dashboard.md",8398],27873332:[()=>n.e(1142).then(n.bind(n,5258)),"@site/docs/mvp/box-admin.md",5258],"2a6dab62":[()=>n.e(7738).then(n.bind(n,1298)),"@site/docs/blockchain/Recipes/Pool.md",1298],"2b0a0def":[()=>n.e(2794).then(n.bind(n,7156)),"@site/docs/work_in_progress.mdx",7156],"2e7550da":[()=>n.e(2672).then(n.bind(n,2922)),"@site/docs/introduction/contribute/styling-guide.md",2922],"313672b0":[()=>n.e(3780).then(n.bind(n,8421)),"@site/docs/api/client-instance.md",8421],"32415a15":[()=>n.e(5213).then(n.bind(n,8976)),"@site/docs/blockchain/Services/FulaContractAPI.md",8976],"37866fe0":[()=>n.e(5194).then(n.bind(n,1974)),"@site/docs/design/encryption.md",1974],"395b74f0":[()=>n.e(1969).then(n.bind(n,8194)),"@site/docs/blockchain/blockchain-intro.md",8194],39968117:[()=>n.e(553).then(n.bind(n,6464)),"@site/docs/blockchain/Recipes/Bag.md",6464],"4321c919":[()=>n.e(710).then(n.bind(n,1210)),"@site/docs/mvp/unboxing.md",1210],"48a74962":[()=>n.e(3334).then(n.bind(n,3813)),"@site/docs/functionyard/fxfotos.md",3813],"533b8a8b":[()=>n.e(9124).then(n.bind(n,1581)),"@site/docs/functionyard/index.md",1581],"5a04bf5c":[()=>n.e(4492).then(n.bind(n,7278)),"@site/docs/mvp/fotos/availability.md",7278],"63c3a5f4":[()=>n.e(2696).then(n.bind(n,7795)),"@site/docs/getting-started/rpi-setup.md",7795],"649c7e91":[()=>n.e(7877).then(n.bind(n,7691)),"@site/docs/RFCs/private-network.md",7691],"665bb1c2":[()=>n.e(1082).then(n.bind(n,3713)),"@site/docs/RFCs/fula-sec/did.md",3713],68453654:[()=>n.e(2746).then(n.bind(n,3392)),"@site/docs/RFCs/document-syncing.md",3392],"6c7613ed":[()=>n.e(3009).then(n.bind(n,372)),"@site/docs/introduction/fula.md",372],"6f0e7e6f":[()=>n.e(5153).then(n.bind(n,7866)),"@site/docs/blockchain/Services/Node.md",7866],"72fa51da":[()=>n.e(1648).then(n.bind(n,9413)),"@site/docs/blockchain/Recipes/Bundle.md",9413],"736647ea":[()=>n.e(5490).then(n.bind(n,9386)),"@site/docs/whitepaper/whitepaper.md",9386],"74636f36":[()=>n.e(5192).then(n.bind(n,5361)),"@site/docs/api-intro.md",5361],"748a29f1":[()=>n.e(3649).then(n.bind(n,6990)),"@site/docs/introduction/blox.md",6990],"799a1b22":[()=>n.e(7878).then(n.bind(n,9053)),"@site/docs/functionyard/fxblox-app.md",9053],"79f59562":[()=>n.e(5389).then(n.bind(n,7770)),"@site/docs/blockchain/Services/BuildNode.md",7770],"7ad88a01":[()=>n.e(7868).then(n.bind(n,4309)),"@site/docs/blockchain/Recipes/Asset.md",4309],"7dbfe80c":[()=>n.e(6208).then(n.bind(n,1283)),"@site/docs/blockchain/Services/NodeAPI.md",1283],"7e4aa304":[()=>n.e(8899).then(n.bind(n,5176)),"@site/docs/functionyard/hardware/fxblox-hardware-rpi-reimage.md",5176],"7e50ec22":[()=>n.e(6358).then(n.bind(n,3066)),"@site/docs/mvp/questions.md",3066],"831e3b29":[()=>n.e(5326).then(n.bind(n,4270)),"@site/docs/blockchain/Recipes/Account.md",4270],"8a24b94f":[()=>n.e(3854).then(n.bind(n,2334)),"@site/docs/mvp/my-account.md",2334],"8ef82ac0":[()=>n.e(5006).then(n.bind(n,7550)),"@site/docs/blockchain/Recipes/Manifest.md",7550],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"952b5e81":[()=>n.e(4205).then(n.bind(n,5229)),"@site/docs/blockchain/Recipes/Market.md",5229],"96034ec1":[()=>n.e(2686).then(n.bind(n,5321)),"@site/docs/introduction/contribute/contribution-tutorial.md",5321],"9e4087bc":[()=>n.e(3608).then(n.bind(n,3012)),"@theme/BlogArchivePage",3012],a2977611:[()=>n.e(2356).then(n.bind(n,2142)),"@site/docs/introduction/contribute/contribute.md",2142],a98adb27:[()=>n.e(815).then(n.bind(n,7377)),"@site/docs/functionyard/join.md",7377],aa32ca26:[()=>n.e(6502).then(n.bind(n,730)),"@site/docs/functionyard/hardware/fxblox-hardware-rk1.md",730],b0d6fa48:[()=>n.e(3557).then(n.bind(n,3890)),"@site/docs/mvp.md",3890],b2f554cd:[()=>n.e(1477).then(n.t.bind(n,10,19)),"~blog/default/blog-archive-80c.json",10],b48a96ee:[()=>n.e(8010).then(n.bind(n,4171)),"@site/docs/blockchain/services .md",4171],b7a78bd3:[()=>n.e(1413).then(n.bind(n,8336)),"@site/docs/functionyard/metamask.md",8336],b80db04d:[()=>n.e(8489).then(n.bind(n,1660)),"@site/docs/mvp/pools/storage-provide.md",1660],bc2ced7b:[()=>n.e(3772).then(n.bind(n,9834)),"@site/docs/blockchain/Services/ProofEngine.md",9834],bd78fdc3:[()=>n.e(8839).then(n.bind(n,8692)),"@site/docs/RFCs/personal-data-reserve.md",8692],be614d59:[()=>n.e(2523).then(n.bind(n,6169)),"@site/docs/release/testnet-alpha.md",6169],c377a04b:[()=>n.e(6971).then(n.bind(n,1269)),"@site/docs/index.md",1269],c4cee058:[()=>n.e(4566).then(n.bind(n,9277)),"@site/docs/design/test.md",9277],c7806b8e:[()=>n.e(4100).then(n.bind(n,2881)),"@site/docs/blockchain/Recipes/Claims.md",2881],c9e48236:[()=>n.e(1564).then(n.bind(n,4895)),"@site/docs/mvp/fotos/setup.md",4895],ca2fca4c:[()=>n.e(7170).then(n.bind(n,4439)),"@site/docs/introduction/contribute/writing-guide.md",4439],d589d3a7:[()=>n.e(7162).then(n.bind(n,9390)),"@site/docs/getting-started.md",9390],da49a82e:[()=>n.e(2027).then(n.bind(n,4507)),"@site/docs/getting-started/box-setup.md",4507],dbaeb152:[()=>Promise.all([n.e(532),n.e(1e3)]).then(n.bind(n,8605)),"@site/docs/functionyard/hardware/fxblox-hardware.mdx",8605],e58963f1:[()=>n.e(2369).then(n.bind(n,5681)),"@site/docs/components/WorkInProgress.mdx",5681],e9a5100a:[()=>n.e(6950).then(n.bind(n,42)),"@site/docs/mvp/pools.md",42],eb64892a:[()=>n.e(1565).then(n.bind(n,7841)),"@site/docs/mvp/usage.md",7841],eb9f70f2:[()=>n.e(8930).then(n.bind(n,3763)),"@site/docs/RFCs/fula-sec.md",3763],ec73ac1d:[()=>n.e(6235).then(n.bind(n,7043)),"@site/docs/mvp/forgot-password.md",7043],ec9cc4dd:[()=>n.e(1973).then(n.bind(n,9201)),"@site/docs/RFCs/rfc-process.md",9201],ef6fc643:[()=>n.e(5507).then(n.bind(n,1259)),"@site/docs/RFCs/replication.md",1259],f0ae19a0:[()=>n.e(7118).then(n.bind(n,8700)),"@site/docs/blockchain/Services/RunNode.md",8700],f19b4864:[()=>n.e(771).then(n.bind(n,4582)),"@site/docs/mvp/fotos/sharing.md",4582],f277957b:[()=>n.e(4004).then(n.bind(n,6950)),"@site/docs/blockchain/Services/Status.md",6950],f2d4d1e7:[()=>n.e(8265).then(n.bind(n,3465)),"@site/docs/mvp/fotos/backup.md",3465],f3ebba76:[()=>n.e(8358).then(n.bind(n,7913)),"@site/docs/mvp/fotos.md",7913],f7d1f36e:[()=>n.e(3616).then(n.bind(n,6642)),"@site/docs/api/file.md",6642],f9725412:[()=>n.e(6938).then(n.bind(n,7239)),"@site/docs/functionyard/dapps.md",7239],f9ddae1b:[()=>n.e(1646).then(n.bind(n,749)),"@site/docs/introduction/bas.md",749],ffb0c1a3:[()=>n.e(1989).then(n.bind(n,1203)),"@site/docs/blockchain/Recipes/Challenges.md",1203]};const d=function(e){const t={};return function e(n,r){Object.keys(n).forEach((a=>{const o=n[a],i=r?`${r}.${a}`:a;var l;"object"==typeof(l=o)&&l&&Object.keys(l).length>0?e(o,i):t[i]=o}))}(e),t};const p=function(e,t){if("*"===e)return l()({loading:s,loader:()=>n.e(4608).then(n.bind(n,4608))});const a=c[`${e}-${t}`],o=[],i=[],p={},f=d(a);return Object.keys(f).forEach((e=>{const t=u[f[e]];t&&(p[e]=t[0],o.push(t[1]),i.push(t[2]))})),l().Map({loading:s,loader:p,modules:o,webpack:()=>i,render:(e,t)=>{const n=JSON.parse(JSON.stringify(a));Object.keys(e).forEach((t=>{let r=n;const a=t.split(".");for(let e=0;e"default"!==e));o&&o.length&&o.forEach((n=>{r[a[a.length-1]][n]=e[t][n]}))}));const o=n.component;return delete n.component,r.createElement(o,{...n,...t})}})},f=[{path:"/blog/archive",component:p("/blog/archive","f4c"),exact:!0},{path:"/",component:p("/","244"),routes:[{path:"/",component:p("/","98e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/api-intro",component:p("/api-intro","a34"),exact:!0,sidebar:"tutorialSidebar"},{path:"/api/client-instance",component:p("/api/client-instance","b3a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/api/file-api",component:p("/api/file-api","90c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/api/graph-api",component:p("/api/graph-api","7ac"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/blockchain-intro",component:p("/blockchain/blockchain-intro","c9b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/recipes",component:p("/blockchain/recipes","28d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/Recipes/Account",component:p("/blockchain/Recipes/Account","000"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/Recipes/Asset",component:p("/blockchain/Recipes/Asset","4e2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/Recipes/Bag",component:p("/blockchain/Recipes/Bag","832"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/Recipes/Bundle",component:p("/blockchain/Recipes/Bundle","0ad"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/Recipes/Challenges",component:p("/blockchain/Recipes/Challenges","44d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/Recipes/Claims",component:p("/blockchain/Recipes/Claims","7a5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/Recipes/Manifest",component:p("/blockchain/Recipes/Manifest","c98"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/Recipes/Market",component:p("/blockchain/Recipes/Market","446"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/Recipes/Pool",component:p("/blockchain/Recipes/Pool","1e5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/services",component:p("/blockchain/services","0b4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/Services/BuildNode",component:p("/blockchain/Services/BuildNode","eb6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/Services/Explorer",component:p("/blockchain/Services/Explorer","67a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/Services/FulaContractAPI",component:p("/blockchain/Services/FulaContractAPI","8b5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/Services/Node",component:p("/blockchain/Services/Node","038"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/Services/NodeAPI",component:p("/blockchain/Services/NodeAPI","078"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/Services/ProofEngine",component:p("/blockchain/Services/ProofEngine","45c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/Services/RunNode",component:p("/blockchain/Services/RunNode","c20"),exact:!0,sidebar:"tutorialSidebar"},{path:"/blockchain/Services/Status",component:p("/blockchain/Services/Status","5e5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/components/WorkInProgress",component:p("/components/WorkInProgress","c06"),exact:!0},{path:"/design/encryption",component:p("/design/encryption","763"),exact:!0},{path:"/design/test",component:p("/design/test","86a"),exact:!0},{path:"/functionyard",component:p("/functionyard","7ac"),exact:!0,sidebar:"tutorialSidebar"},{path:"/functionyard/add-storage",component:p("/functionyard/add-storage","9cd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/functionyard/dapps",component:p("/functionyard/dapps","c9f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/functionyard/fxblox-app",component:p("/functionyard/fxblox-app","6ce"),exact:!0,sidebar:"tutorialSidebar"},{path:"/functionyard/fxfotos",component:p("/functionyard/fxfotos","a2c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/functionyard/hardware/fxblox-hardware",component:p("/functionyard/hardware/fxblox-hardware","90a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/functionyard/hardware/fxblox-hardware-rk1",component:p("/functionyard/hardware/fxblox-hardware-rk1","f1c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/functionyard/hardware/fxblox-hardware-rpi",component:p("/functionyard/hardware/fxblox-hardware-rpi","115"),exact:!0,sidebar:"tutorialSidebar"},{path:"/functionyard/hardware/fxblox-hardware-rpi-reimage",component:p("/functionyard/hardware/fxblox-hardware-rpi-reimage","bc0"),exact:!0},{path:"/functionyard/join",component:p("/functionyard/join","cd1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/functionyard/metamask",component:p("/functionyard/metamask","739"),exact:!0,sidebar:"tutorialSidebar"},{path:"/getting-started",component:p("/getting-started","c9b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/getting-started/box-setup",component:p("/getting-started/box-setup","3d2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/getting-started/fula-client",component:p("/getting-started/fula-client","1d1"),exact:!0},{path:"/getting-started/rpi-setup",component:p("/getting-started/rpi-setup","19a"),exact:!0},{path:"/getting-started/using-samples",component:p("/getting-started/using-samples","a3e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/introduction/bas",component:p("/introduction/bas","0ae"),exact:!0,sidebar:"tutorialSidebar"},{path:"/introduction/blox",component:p("/introduction/blox","ab0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/introduction/contribute",component:p("/introduction/contribute","850"),exact:!0,sidebar:"tutorialSidebar"},{path:"/introduction/contribute/contribution-tutorial",component:p("/introduction/contribute/contribution-tutorial","2b9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/introduction/contribute/styling",component:p("/introduction/contribute/styling","a1e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/introduction/contribute/writing",component:p("/introduction/contribute/writing","0dd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/introduction/fula",component:p("/introduction/fula","032"),exact:!0,sidebar:"tutorialSidebar"},{path:"/mvp",component:p("/mvp","308"),exact:!0,sidebar:"mvpSidebar"},{path:"/mvp/admin-reporting",component:p("/mvp/admin-reporting","c99"),exact:!0},{path:"/mvp/box-admin",component:p("/mvp/box-admin","577"),exact:!0},{path:"/mvp/forgot-password",component:p("/mvp/forgot-password","e97"),exact:!0},{path:"/mvp/fotos",component:p("/mvp/fotos","b03"),exact:!0,sidebar:"mvpSidebar"},{path:"/mvp/fotos/availability",component:p("/mvp/fotos/availability","bfb"),exact:!0},{path:"/mvp/fotos/backup",component:p("/mvp/fotos/backup","481"),exact:!0,sidebar:"mvpSidebar"},{path:"/mvp/fotos/setup",component:p("/mvp/fotos/setup","8f6"),exact:!0,sidebar:"mvpSidebar"},{path:"/mvp/fotos/sharing",component:p("/mvp/fotos/sharing","059"),exact:!0,sidebar:"mvpSidebar"},{path:"/mvp/my-account",component:p("/mvp/my-account","79c"),exact:!0},{path:"/mvp/pools",component:p("/mvp/pools","b04"),exact:!0,sidebar:"mvpSidebar"},{path:"/mvp/pools/storage-provide",component:p("/mvp/pools/storage-provide","eaf"),exact:!0,sidebar:"mvpSidebar"},{path:"/mvp/privacy-dashboard",component:p("/mvp/privacy-dashboard","4e1"),exact:!0},{path:"/mvp/questions",component:p("/mvp/questions","497"),exact:!0},{path:"/mvp/technical-questions",component:p("/mvp/technical-questions","e66"),exact:!0},{path:"/mvp/unboxing",component:p("/mvp/unboxing","ef3"),exact:!0},{path:"/reference-api",component:p("/reference-api","669"),exact:!0,sidebar:"tutorialSidebar"},{path:"/release/testnet-alpha",component:p("/release/testnet-alpha","9f4"),exact:!0},{path:"/RFCs/document-syncing",component:p("/RFCs/document-syncing","9f5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/RFCs/fula-sec",component:p("/RFCs/fula-sec","fd9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/RFCs/fula-sec/did",component:p("/RFCs/fula-sec/did","357"),exact:!0,sidebar:"tutorialSidebar"},{path:"/RFCs/fula-sec/encryption",component:p("/RFCs/fula-sec/encryption","93a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/RFCs/personal-data-reserve",component:p("/RFCs/personal-data-reserve","557"),exact:!0,sidebar:"tutorialSidebar"},{path:"/RFCs/private-network",component:p("/RFCs/private-network","f3c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/RFCs/replication",component:p("/RFCs/replication","ea8"),exact:!0},{path:"/RFCs/rfc-process",component:p("/RFCs/rfc-process","0ae"),exact:!0,sidebar:"tutorialSidebar"},{path:"/whitepaper",component:p("/whitepaper","fae"),exact:!0,sidebar:"tutorialSidebar"},{path:"/work_in_progress",component:p("/work_in_progress","86d"),exact:!0}]},{path:"*",component:p("*")}];var m=n(412),h=n(6291),g=n(9913),b=n(7041),v=n(6775),y=n(4865),w=n.n(y);const k=[n(2497),n(2448),n(6743),n(2295)];function S(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{var r,a;const o=null!==(a=null===(r=null==t?void 0:t.default)||void 0===r?void 0:r[e])&&void 0!==a?a:t[e];o&&o(...n)}))}const E={onRouteUpdate(){for(var e=arguments.length,t=new Array(e),n=0;n{const{component:t}=e.route;if(t&&t.preload)return t.preload()})))}const _={};const T=function(e){if(_[e.pathname])return{...e,pathname:_[e.pathname]};let t=e.pathname||"/";return t=t.trim().replace(/\/index\.html$/,""),""===t&&(t="/"),_[e.pathname]=t,{...e,pathname:t}};w().configure({showSpinner:!1});class R extends r.Component{constructor(e){super(e),this.previousLocation=null,this.progressBarTimeout=null,this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){const n=e.location!==this.props.location,{routes:r,delay:a}=this.props;if(n){const t=T(e.location);return this.startProgressBar(a),this.previousLocation=T(this.props.location),this.setState({nextRouteHasLoaded:!1}),C(r,t.pathname).then((()=>{E.onRouteUpdate({previousLocation:this.previousLocation,location:t}),this.previousLocation=null,this.setState({nextRouteHasLoaded:!0},this.stopProgressBar);const{hash:e}=t;if(e){const t=decodeURIComponent(e.substring(1)),n=document.getElementById(t);n&&n.scrollIntoView()}else window.scrollTo(0,0)})).catch((e=>console.warn(e))),!1}return!!t.nextRouteHasLoaded}clearProgressBarTimeout(){this.progressBarTimeout&&(clearTimeout(this.progressBarTimeout),this.progressBarTimeout=null)}startProgressBar(e){this.clearProgressBarTimeout(),this.progressBarTimeout=setTimeout((()=>{E.onRouteUpdateDelayed({location:T(this.props.location)}),w().start()}),e)}stopProgressBar(){this.clearProgressBarTimeout(),w().done()}render(){const{children:e,location:t}=this.props;return r.createElement(v.AW,{location:T(t),render:()=>e})}}const A=(0,v.EN)(R);var P=n(2859),L=n(2263);const N="docusaurus-base-url-issue-banner-container",O="docusaurus-base-url-issue-banner-suggestion-container",D="__DOCUSAURUS_INSERT_BASEURL_BANNER";function I(e){return`\nwindow['${D}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${D}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${N}');\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[D]=!1}),[]),r.createElement(r.Fragment,null,!m.Z.canUseDOM&&r.createElement(P.Z,null,r.createElement("script",null,I(e))),r.createElement("div",{id:N}))}function M(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,L.Z)(),{pathname:n}=(0,v.TH)();return t&&n===e?r.createElement(F,null):null}const j=function(e){let{children:t}=e;return t};var B=n(780),U=n(4953);const $=function(){return r.createElement(B.Z,{fallback:U.Z},r.createElement(b.M,null,r.createElement(g.t,null,r.createElement(j,null,r.createElement(M,null),r.createElement(A,{routes:f,delay:1e3},(0,h.Z)(f))))))};const z=function(e){if("undefined"==typeof document)return!1;const t=document.createElement("link");try{if(t.relList&&"function"==typeof t.relList.supports)return t.relList.supports(e)}catch(n){return!1}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;(document.getElementsByTagName("head")[0]||document.getElementsByName("script")[0].parentNode).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)}))},q={};const Z=function(e){return new Promise((t=>{q[e]?t():z(e).then((()=>{t(),q[e]=!0})).catch((()=>{}))}))},G={},H={},V=()=>{var e,t;return(null===(e=navigator.connection)||void 0===e?void 0:e.effectiveType.includes("2g"))&&(null===(t=navigator.connection)||void 0===t?void 0:t.saveData)},W={prefetch:e=>{if(!(e=>!V()&&!H[e]&&!G[e])(e))return!1;G[e]=!0;return(0,x.f)(f,e).flatMap((e=>{return t=e.route.path,Object.entries(c).filter((e=>{let[n]=e;return n.replace(/(-[^-]+)$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values(d(t))}));var t})).forEach((e=>{const t=n.gca(e);t&&!/undefined/.test(t)&&Z(t)})),!0},preload:e=>!!(e=>!V()&&!H[e])(e)&&(H[e]=!0,C(f,e),!0)};if(m.Z.canUseDOM){window.docusaurus=W;const e=a.hydrate;C(f,window.location.pathname).then((()=>{e(r.createElement(o.VK,null,r.createElement($,null)),document.getElementById("__docusaurus"))}))}},780:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l});var r=n(7294),a=n(412),o=n(4953);class i extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){var e;const{children:t}=this.props,{error:n}=this.state;if(n){return(null!==(e=this.props.fallback)&&void 0!==e?e:o.Z)({error:n,tryAgain:()=>this.setState({error:null})})}return null!=t?t:null}}const l=i},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=!("undefined"==typeof window||!window.document||!window.document.createElement),a={canUseDOM:r,canUseEventListeners:r&&!(!window.addEventListener&&!window.attachEvent),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&!!window.screen}},2859:(e,t,n)=>{"use strict";n.d(t,{Z:()=>ge});var r,a,o,i,l=n(7294),s=n(5697),c=n.n(s),u=n(3524),d=n.n(u),p=n(9590),f=n.n(p),m=n(7418),h=n.n(m),g="bodyAttributes",b="htmlAttributes",v="titleAttributes",y={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title"},w=(Object.keys(y).map((function(e){return y[e]})),"charset"),k="cssText",S="href",E="http-equiv",x="innerHTML",C="itemprop",_="name",T="property",R="rel",A="src",P="target",L={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},N="defaultTitle",O="defer",D="encodeSpecialCharacters",I="onChangeClientState",F="titleTemplate",M=Object.keys(L).reduce((function(e,t){return e[L[t]]=t,e}),{}),j=[y.NOSCRIPT,y.SCRIPT,y.STYLE],B="data-react-helmet",U="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},$=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},z=function(){function e(e,t){for(var n=0;n=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n},G=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t},H=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return!1===t?String(e):String(e).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")},V=function(e){var t=X(e,y.TITLE),n=X(e,F);if(n&&t)return n.replace(/%s/g,(function(){return Array.isArray(t)?t.join(""):t}));var r=X(e,N);return t||r||void 0},W=function(e){return X(e,I)||function(){}},K=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return q({},e,t)}),{})},Y=function(e,t){return t.filter((function(e){return void 0!==e[y.BASE]})).map((function(e){return e[y.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),a=0;a=0;n--){var r=e[n];if(r.hasOwnProperty(t))return r[t]}return null},J=(r=Date.now(),function(e){var t=Date.now();t-r>16?(r=t,e(t)):setTimeout((function(){J(e)}),0)}),ee=function(e){return clearTimeout(e)},te="undefined"!=typeof window?window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||J:n.g.requestAnimationFrame||J,ne="undefined"!=typeof window?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||ee:n.g.cancelAnimationFrame||ee,re=function(e){return console&&"function"==typeof console.warn&&console.warn(e)},ae=null,oe=function(e,t){var n=e.baseTag,r=e.bodyAttributes,a=e.htmlAttributes,o=e.linkTags,i=e.metaTags,l=e.noscriptTags,s=e.onChangeClientState,c=e.scriptTags,u=e.styleTags,d=e.title,p=e.titleAttributes;se(y.BODY,r),se(y.HTML,a),le(d,p);var f={baseTag:ce(y.BASE,n),linkTags:ce(y.LINK,o),metaTags:ce(y.META,i),noscriptTags:ce(y.NOSCRIPT,l),scriptTags:ce(y.SCRIPT,c),styleTags:ce(y.STYLE,u)},m={},h={};Object.keys(f).forEach((function(e){var t=f[e],n=t.newTags,r=t.oldTags;n.length&&(m[e]=n),r.length&&(h[e]=f[e].oldTags)})),t&&t(),s(e,m,h)},ie=function(e){return Array.isArray(e)?e.join(""):e},le=function(e,t){void 0!==e&&document.title!==e&&(document.title=ie(e)),se(y.TITLE,t)},se=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute(B),a=r?r.split(","):[],o=[].concat(a),i=Object.keys(t),l=0;l=0;d--)n.removeAttribute(o[d]);a.length===o.length?n.removeAttribute(B):n.getAttribute(B)!==i.join(",")&&n.setAttribute(B,i.join(","))}},ce=function(e,t){var n=document.head||document.querySelector(y.HEAD),r=n.querySelectorAll(e+"["+"data-react-helmet]"),a=Array.prototype.slice.call(r),o=[],i=void 0;return t&&t.length&&t.forEach((function(t){var n=document.createElement(e);for(var r in t)if(t.hasOwnProperty(r))if(r===x)n.innerHTML=t.innerHTML;else if(r===k)n.styleSheet?n.styleSheet.cssText=t.cssText:n.appendChild(document.createTextNode(t.cssText));else{var l=void 0===t[r]?"":t[r];n.setAttribute(r,l)}n.setAttribute(B,"true"),a.some((function(e,t){return i=t,n.isEqualNode(e)}))?a.splice(i,1):o.push(n)})),a.forEach((function(e){return e.parentNode.removeChild(e)})),o.forEach((function(e){return n.appendChild(e)})),{oldTags:a,newTags:o}},ue=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},de=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(e).reduce((function(t,n){return t[L[n]||n]=e[n],t}),t)},pe=function(e,t,n){switch(e){case y.TITLE:return{toComponent:function(){return e=t.title,n=t.titleAttributes,(r={key:e})[B]=!0,a=de(n,r),[l.createElement(y.TITLE,a,e)];var e,n,r,a},toString:function(){return function(e,t,n,r){var a=ue(n),o=ie(t);return a?"<"+e+' data-react-helmet="true" '+a+">"+H(o,r)+"":"<"+e+' data-react-helmet="true">'+H(o,r)+""}(e,t.title,t.titleAttributes,n)}};case g:case b:return{toComponent:function(){return de(t)},toString:function(){return ue(t)}};default:return{toComponent:function(){return function(e,t){return t.map((function(t,n){var r,a=((r={key:n})[B]=!0,r);return Object.keys(t).forEach((function(e){var n=L[e]||e;if(n===x||n===k){var r=t.innerHTML||t.cssText;a.dangerouslySetInnerHTML={__html:r}}else a[n]=t[e]})),l.createElement(e,a)}))}(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var a=Object.keys(r).filter((function(e){return!(e===x||e===k)})).reduce((function(e,t){var a=void 0===r[t]?t:t+'="'+H(r[t],n)+'"';return e?e+" "+a:a}),""),o=r.innerHTML||r.cssText||"",i=-1===j.indexOf(e);return t+"<"+e+' data-react-helmet="true" '+a+(i?"/>":">"+o+"")}),"")}(e,t,n)}}}},fe=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,a=e.htmlAttributes,o=e.linkTags,i=e.metaTags,l=e.noscriptTags,s=e.scriptTags,c=e.styleTags,u=e.title,d=void 0===u?"":u,p=e.titleAttributes;return{base:pe(y.BASE,t,r),bodyAttributes:pe(g,n,r),htmlAttributes:pe(b,a,r),link:pe(y.LINK,o,r),meta:pe(y.META,i,r),noscript:pe(y.NOSCRIPT,l,r),script:pe(y.SCRIPT,s,r),style:pe(y.STYLE,c,r),title:pe(y.TITLE,{title:d,titleAttributes:p},r)}},me=d()((function(e){return{baseTag:Y([S,P],e),bodyAttributes:K(g,e),defer:X(e,O),encode:X(e,D),htmlAttributes:K(b,e),linkTags:Q(y.LINK,[R,S],e),metaTags:Q(y.META,[_,w,E,T,C],e),noscriptTags:Q(y.NOSCRIPT,[x],e),onChangeClientState:W(e),scriptTags:Q(y.SCRIPT,[A,x],e),styleTags:Q(y.STYLE,[k],e),title:V(e),titleAttributes:K(v,e)}}),(function(e){ae&&ne(ae),e.defer?ae=te((function(){oe(e,(function(){ae=null}))})):(oe(e),ae=null)}),fe)((function(){return null})),he=(a=me,i=o=function(e){function t(){return $(this,t),G(this,e.apply(this,arguments))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),t.prototype.shouldComponentUpdate=function(e){return!f()(this.props,e)},t.prototype.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case y.SCRIPT:case y.NOSCRIPT:return{innerHTML:t};case y.STYLE:return{cssText:t}}throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")},t.prototype.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren,a=e.newChildProps,o=e.nestedChildren;return q({},r,((t={})[n.type]=[].concat(r[n.type]||[],[q({},a,this.mapNestedChildrenToProps(n,o))]),t))},t.prototype.mapObjectTypeChildren=function(e){var t,n,r=e.child,a=e.newProps,o=e.newChildProps,i=e.nestedChildren;switch(r.type){case y.TITLE:return q({},a,((t={})[r.type]=i,t.titleAttributes=q({},o),t));case y.BODY:return q({},a,{bodyAttributes:q({},o)});case y.HTML:return q({},a,{htmlAttributes:q({},o)})}return q({},a,((n={})[r.type]=q({},o),n))},t.prototype.mapArrayTypeChildrenToProps=function(e,t){var n=q({},t);return Object.keys(e).forEach((function(t){var r;n=q({},n,((r={})[t]=e[t],r))})),n},t.prototype.warnOnInvalidChildren=function(e,t){return!0},t.prototype.mapChildrenToProps=function(e,t){var n=this,r={};return l.Children.forEach(e,(function(e){if(e&&e.props){var a=e.props,o=a.children,i=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(e).reduce((function(t,n){return t[M[n]||n]=e[n],t}),t)}(Z(a,["children"]));switch(n.warnOnInvalidChildren(e,o),e.type){case y.LINK:case y.META:case y.NOSCRIPT:case y.SCRIPT:case y.STYLE:r=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:r,newChildProps:i,nestedChildren:o});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:i,nestedChildren:o})}}})),t=this.mapArrayTypeChildrenToProps(r,t)},t.prototype.render=function(){var e=this.props,t=e.children,n=Z(e,["children"]),r=q({},n);return t&&(r=this.mapChildrenToProps(t,r)),l.createElement(a,r)},z(t,null,[{key:"canUseDOM",set:function(e){a.canUseDOM=e}}]),t}(l.Component),o.propTypes={base:c().object,bodyAttributes:c().object,children:c().oneOfType([c().arrayOf(c().node),c().node]),defaultTitle:c().string,defer:c().bool,encodeSpecialCharacters:c().bool,htmlAttributes:c().object,link:c().arrayOf(c().object),meta:c().arrayOf(c().object),noscript:c().arrayOf(c().object),onChangeClientState:c().func,script:c().arrayOf(c().object),style:c().arrayOf(c().object),title:c().string,titleAttributes:c().object,titleTemplate:c().string},o.defaultProps={defer:!0,encodeSpecialCharacters:!0},o.peek=a.peek,o.rewind=function(){var e=a.rewind();return e||(e=fe({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}})),e},i);he.renderStatic=he.rewind;const ge=function(e){return l.createElement(he,{...e})}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7294),a=n(3727),o=n(2263),i=n(3919),l=n(412);const s=(0,r.createContext)({collectLink:()=>{}});var c=n(4996),u=n(8780);const d=function(e){let{isNavLink:t,to:n,href:d,activeClassName:p,isActive:f,"data-noBrokenLinkCheck":m,autoAddBaseUrl:h=!0,...g}=e;var b;const{siteConfig:{trailingSlash:v,baseUrl:y}}=(0,o.Z)(),{withBaseUrl:w}=(0,c.C)(),k=(0,r.useContext)(s),S=n||d,E=(0,i.Z)(S),x=null==S?void 0:S.replace("pathname://","");let C=void 0!==x?(_=x,h&&(e=>e.startsWith("/"))(_)?w(_):_):void 0;var _;C&&E&&(C=(0,u.applyTrailingSlash)(C,{trailingSlash:v,baseUrl:y}));const T=(0,r.useRef)(!1),R=t?a.OL:a.rU,A=l.Z.canUseIntersectionObserver,P=(0,r.useRef)();(0,r.useEffect)((()=>(!A&&E&&null!=C&&window.docusaurus.prefetch(C),()=>{A&&P.current&&P.current.disconnect()})),[P,C,A,E]);const L=null!==(b=null==C?void 0:C.startsWith("#"))&&void 0!==b&&b,N=!C||!E||L;return C&&E&&!L&&!m&&k.collectLink(C),N?r.createElement("a",{href:C,...S&&!E&&{target:"_blank",rel:"noopener noreferrer"},...g}):r.createElement(R,{...g,onMouseEnter:()=>{T.current||null==C||(window.docusaurus.preload(C),T.current=!0)},innerRef:e=>{var t,n;A&&e&&E&&(t=e,n=()=>{null!=C&&window.docusaurus.prefetch(C)},P.current=new window.IntersectionObserver((e=>{e.forEach((e=>{t===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(P.current.unobserve(t),P.current.disconnect(),n())}))})),P.current.observe(t))},to:C||"",...t&&{isActive:f,activeClassName:p}})}},1875:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r=()=>null},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u,I:()=>c});var r=n(7294);const a=/{\w+}/g,o="{}";function i(e,t){const n=[],i=e.replace(a,(e=>{const a=e.substring(1,e.length-1),i=null==t?void 0:t[a];if(void 0!==i){const e=r.isValidElement(i)?i:String(i);return n.push(e),o}return e}));return 0===n.length?e:n.every((e=>"string"==typeof e))?i.split(o).reduce(((e,t,r)=>{var a;return e.concat(t).concat(null!==(a=n[r])&&void 0!==a?a:"")}),""):i.split(o).reduce(((e,t,a)=>[...e,r.createElement(r.Fragment,{key:a},t,n[a])]),[])}var l=n(7529);function s(e){let{id:t,message:n}=e;var r,a;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 null!==(a=null!==(r=l[null!=t?t:n])&&void 0!==r?r:n)&&void 0!==a?a:t}function c(e,t){let{message:n,id:r}=e;return i(s({message:n,id:r}),t)}function u(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");return i(s({message:t,id:n}),r)}},9913:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},7041:(e,t,n)=>{"use strict";n.d(t,{_:()=>u,M:()=>d});var r=n(7294),a=n(9782);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/","mainDocId":"index","docs":[{"id":"api-intro","path":"/api-intro","sidebar":"tutorialSidebar"},{"id":"api/client-instance","path":"/api/client-instance","sidebar":"tutorialSidebar"},{"id":"api/file-api","path":"/api/file-api","sidebar":"tutorialSidebar"},{"id":"api/graph-api","path":"/api/graph-api","sidebar":"tutorialSidebar"},{"id":"blockchain/blockchain-intro","path":"/blockchain/blockchain-intro","sidebar":"tutorialSidebar"},{"id":"blockchain/recipes","path":"/blockchain/recipes","sidebar":"tutorialSidebar"},{"id":"blockchain/Recipes/Account","path":"/blockchain/Recipes/Account","sidebar":"tutorialSidebar"},{"id":"blockchain/Recipes/Asset","path":"/blockchain/Recipes/Asset","sidebar":"tutorialSidebar"},{"id":"blockchain/Recipes/Bag","path":"/blockchain/Recipes/Bag","sidebar":"tutorialSidebar"},{"id":"blockchain/Recipes/Bundle","path":"/blockchain/Recipes/Bundle","sidebar":"tutorialSidebar"},{"id":"blockchain/Recipes/Challenges","path":"/blockchain/Recipes/Challenges","sidebar":"tutorialSidebar"},{"id":"blockchain/Recipes/Claims","path":"/blockchain/Recipes/Claims","sidebar":"tutorialSidebar"},{"id":"blockchain/Recipes/Manifest","path":"/blockchain/Recipes/Manifest","sidebar":"tutorialSidebar"},{"id":"blockchain/Recipes/Market","path":"/blockchain/Recipes/Market","sidebar":"tutorialSidebar"},{"id":"blockchain/Recipes/Pool","path":"/blockchain/Recipes/Pool","sidebar":"tutorialSidebar"},{"id":"blockchain/services","path":"/blockchain/services","sidebar":"tutorialSidebar"},{"id":"blockchain/Services/BuildNode","path":"/blockchain/Services/BuildNode","sidebar":"tutorialSidebar"},{"id":"blockchain/Services/Explorer","path":"/blockchain/Services/Explorer","sidebar":"tutorialSidebar"},{"id":"blockchain/Services/FulaContractAPI","path":"/blockchain/Services/FulaContractAPI","sidebar":"tutorialSidebar"},{"id":"blockchain/Services/Node","path":"/blockchain/Services/Node","sidebar":"tutorialSidebar"},{"id":"blockchain/Services/NodeAPI","path":"/blockchain/Services/NodeAPI","sidebar":"tutorialSidebar"},{"id":"blockchain/Services/ProofEngine","path":"/blockchain/Services/ProofEngine","sidebar":"tutorialSidebar"},{"id":"blockchain/Services/RunNode","path":"/blockchain/Services/RunNode","sidebar":"tutorialSidebar"},{"id":"blockchain/Services/Status","path":"/blockchain/Services/Status","sidebar":"tutorialSidebar"},{"id":"components/WorkInProgress","path":"/components/WorkInProgress"},{"id":"design/encryption","path":"/design/encryption"},{"id":"design/test","path":"/design/test"},{"id":"functionyard/add-storage","path":"/functionyard/add-storage","sidebar":"tutorialSidebar"},{"id":"functionyard/dapps","path":"/functionyard/dapps","sidebar":"tutorialSidebar"},{"id":"functionyard/fxblox-app","path":"/functionyard/fxblox-app","sidebar":"tutorialSidebar"},{"id":"functionyard/fxfotos","path":"/functionyard/fxfotos","sidebar":"tutorialSidebar"},{"id":"functionyard/hardware/fxblox-hardware","path":"/functionyard/hardware/fxblox-hardware","sidebar":"tutorialSidebar"},{"id":"functionyard/hardware/fxblox-hardware-rk1","path":"/functionyard/hardware/fxblox-hardware-rk1","sidebar":"tutorialSidebar"},{"id":"functionyard/hardware/fxblox-hardware-rpi","path":"/functionyard/hardware/fxblox-hardware-rpi","sidebar":"tutorialSidebar"},{"id":"functionyard/hardware/fxblox-hardware-rpi-reimage","path":"/functionyard/hardware/fxblox-hardware-rpi-reimage"},{"id":"functionyard/index","path":"/functionyard/","sidebar":"tutorialSidebar"},{"id":"functionyard/join","path":"/functionyard/join","sidebar":"tutorialSidebar"},{"id":"functionyard/metamask","path":"/functionyard/metamask","sidebar":"tutorialSidebar"},{"id":"getting-started","path":"/getting-started","sidebar":"tutorialSidebar"},{"id":"getting-started/box-setup","path":"/getting-started/box-setup","sidebar":"tutorialSidebar"},{"id":"getting-started/fula-client","path":"/getting-started/fula-client"},{"id":"getting-started/rpi-setup","path":"/getting-started/rpi-setup"},{"id":"getting-started/using-samples","path":"/getting-started/using-samples","sidebar":"tutorialSidebar"},{"id":"index","path":"/","sidebar":"tutorialSidebar"},{"id":"introduction/bas","path":"/introduction/bas","sidebar":"tutorialSidebar"},{"id":"introduction/blox","path":"/introduction/blox","sidebar":"tutorialSidebar"},{"id":"introduction/contribute/contribute","path":"/introduction/contribute/","sidebar":"tutorialSidebar"},{"id":"introduction/contribute/contribution-tutorial","path":"/introduction/contribute/contribution-tutorial","sidebar":"tutorialSidebar"},{"id":"introduction/contribute/styling","path":"/introduction/contribute/styling","sidebar":"tutorialSidebar"},{"id":"introduction/contribute/writing","path":"/introduction/contribute/writing","sidebar":"tutorialSidebar"},{"id":"introduction/fula","path":"/introduction/fula","sidebar":"tutorialSidebar"},{"id":"mvp","path":"/mvp","sidebar":"mvpSidebar"},{"id":"mvp/admin-reporting","path":"/mvp/admin-reporting"},{"id":"mvp/box-admin","path":"/mvp/box-admin"},{"id":"mvp/forgot-password","path":"/mvp/forgot-password"},{"id":"mvp/fotos","path":"/mvp/fotos","sidebar":"mvpSidebar"},{"id":"mvp/fotos/availability","path":"/mvp/fotos/availability"},{"id":"mvp/fotos/backup","path":"/mvp/fotos/backup","sidebar":"mvpSidebar"},{"id":"mvp/fotos/setup","path":"/mvp/fotos/setup","sidebar":"mvpSidebar"},{"id":"mvp/fotos/sharing","path":"/mvp/fotos/sharing","sidebar":"mvpSidebar"},{"id":"mvp/my-account","path":"/mvp/my-account"},{"id":"mvp/pools","path":"/mvp/pools","sidebar":"mvpSidebar"},{"id":"mvp/pools/storage-provide","path":"/mvp/pools/storage-provide","sidebar":"mvpSidebar"},{"id":"mvp/privacy-dashboard","path":"/mvp/privacy-dashboard"},{"id":"mvp/questions","path":"/mvp/questions"},{"id":"mvp/technical-questions","path":"/mvp/technical-questions"},{"id":"mvp/unboxing","path":"/mvp/unboxing"},{"id":"reference-api","path":"/reference-api","sidebar":"tutorialSidebar"},{"id":"release/testnet-alpha","path":"/release/testnet-alpha"},{"id":"RFCs/document-syncing","path":"/RFCs/document-syncing","sidebar":"tutorialSidebar"},{"id":"RFCs/fula-sec","path":"/RFCs/fula-sec","sidebar":"tutorialSidebar"},{"id":"RFCs/fula-sec/did","path":"/RFCs/fula-sec/did","sidebar":"tutorialSidebar"},{"id":"RFCs/fula-sec/encryption","path":"/RFCs/fula-sec/encryption","sidebar":"tutorialSidebar"},{"id":"RFCs/personal-data-reserve","path":"/RFCs/personal-data-reserve","sidebar":"tutorialSidebar"},{"id":"RFCs/private-network","path":"/RFCs/private-network","sidebar":"tutorialSidebar"},{"id":"RFCs/replication","path":"/RFCs/replication"},{"id":"RFCs/rfc-process","path":"/RFCs/rfc-process","sidebar":"tutorialSidebar"},{"id":"whitepaper/whitepaper","path":"/whitepaper/","sidebar":"tutorialSidebar"},{"id":"work_in_progress","path":"/work_in_progress"}],"sidebars":{"tutorialSidebar":{"link":{"path":"/","label":"Introduction"}},"mvpSidebar":{"link":{"path":"/mvp","label":"MVP"}}}}]}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.0.0-beta.15","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.0.0-beta.15"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.0.0-beta.15"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.0.0-beta.15"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.0.0-beta.15"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.0.0-beta.15"}}}'),c={siteConfig:a.Z,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},u=r.createContext(c);function d(e){let{children:t}=e;return r.createElement(u.Provider,{value:c},t)}},3919:(e,t,n)=>{"use strict";function r(e){return!0===/^(\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},6291:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r=n(8790).H},8143:(e,t,n)=>{"use strict";n.r(t),n.d(t,{BrowserRouter:()=>r.VK,HashRouter:()=>r.UT,Link:()=>r.rU,MemoryRouter:()=>r.VA,NavLink:()=>r.OL,Prompt:()=>r.NL,Redirect:()=>r.l_,Route:()=>r.AW,Router:()=>r.F0,StaticRouter:()=>r.gx,Switch:()=>r.rs,generatePath:()=>r.Gn,matchPath:()=>r.LX,useHistory:()=>r.k6,useLocation:()=>r.TH,useParams:()=>r.UO,useRouteMatch:()=>r.$B,withRouter:()=>r.EN});var r=n(3727)},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>o,Z:()=>i});var r=n(2263),a=n(3919);function o(){const{siteConfig:{baseUrl:e,url:t}}=(0,r.Z)();return{withBaseUrl:(n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n)return n;if(n.startsWith("#"))return n;if((0,a.b)(n))return n;if(o)return t+n.replace(/^\//,"");const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)}}function i(e,t){void 0===t&&(t={});const{withBaseUrl:n}=o();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(7041);const o=function(){return(0,r.useContext)(a._)}},8084:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o,useAllPluginInstancesData:()=>i,usePluginData:()=>l});var r=n(2263),a=n(9935);function o(){const{globalData:e}=(0,r.Z)();if(!e)throw new Error("Docusaurus global data not found.");return e}function i(e){const t=o()[e];if(!t)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return t}function l(e,t){void 0===t&&(t=a.m);const n=i(e)[t];if(!n)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return n}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(9913);function o(){return(0,r.useContext)(a._)}},4953:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l});var r=n(7294),a=n(2434),o=n(780);function i(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"))}const l=function(e){let{error:t,tryAgain:n}=e;return r.createElement(o.Z,{fallback:()=>r.createElement(i,{error:t,tryAgain:n})},r.createElement(a.Z,{title:"Page Error"},r.createElement(i,{error:t,tryAgain:n})))}},8408:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getDocVersionSuggestions=t.getActiveDocContext=t.getActiveVersion=t.getLatestVersion=t.getActivePlugin=void 0;const r=n(8143);t.getActivePlugin=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.matchPath)(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.getLatestVersion=e=>e.versions.find((e=>e.isLast));t.getActiveVersion=(e,n)=>{const a=(0,t.getLatestVersion)(e);return[...e.versions.filter((e=>e!==a)),a].find((e=>!!(0,r.matchPath)(n,{path:e.path,exact:!1,strict:!1})))};t.getActiveDocContext=(e,n)=>{const a=(0,t.getActiveVersion)(e,n),o=null==a?void 0:a.docs.find((e=>!!(0,r.matchPath)(n,{path:e.path,exact:!0,strict:!1})));return{activeVersion:a,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}};t.getDocVersionSuggestions=(e,n)=>{const r=(0,t.getLatestVersion)(e),a=(0,t.getActiveDocContext)(e,n);return{latestDocSuggestion:null==a?void 0:a.alternateDocVersions[r.name],latestVersionSuggestion:r}}},7608:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useDocVersionSuggestions=t.useActiveDocContext=t.useActiveVersion=t.useLatestVersion=t.useVersions=t.useActivePluginAndVersion=t.useActivePlugin=t.useDocsData=t.useAllDocsData=void 0;const r=n(655),a=n(8143),o=(0,r.__importStar)(n(8084)),i=n(8408),l={};t.useAllDocsData=()=>{var e;return null!==(e=(0,o.default)()["docusaurus-plugin-content-docs"])&&void 0!==e?e:l};t.useDocsData=e=>(0,o.usePluginData)("docusaurus-plugin-content-docs",e);t.useActivePlugin=function(e){void 0===e&&(e={});const n=(0,t.useAllDocsData)(),{pathname:r}=(0,a.useLocation)();return(0,i.getActivePlugin)(n,r,e)};t.useActivePluginAndVersion=function(e){void 0===e&&(e={});const n=(0,t.useActivePlugin)(e),{pathname:r}=(0,a.useLocation)();if(n){return{activePlugin:n,activeVersion:(0,i.getActiveVersion)(n.pluginData,r)}}};t.useVersions=e=>(0,t.useDocsData)(e).versions;t.useLatestVersion=e=>{const n=(0,t.useDocsData)(e);return(0,i.getLatestVersion)(n)};t.useActiveVersion=e=>{const n=(0,t.useDocsData)(e),{pathname:r}=(0,a.useLocation)();return(0,i.getActiveVersion)(n,r)};t.useActiveDocContext=e=>{const n=(0,t.useDocsData)(e),{pathname:r}=(0,a.useLocation)();return(0,i.getActiveDocContext)(n,r)};t.useDocVersionSuggestions=e=>{const n=(0,t.useDocsData)(e),{pathname:r}=(0,a.useLocation)();return(0,i.getDocVersionSuggestions)(n,r)}},5551:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});(0,n(655).__exportStar)(n(7608),t)},541:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a="iconExternalLink_I5OW";const o=function(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},2434:(e,t,n)=>{"use strict";n.d(t,{Z:()=>ue});var r=n(7294),a=n(6010),o=n(780),i=n(6775),l=n(5999),s=n(5773);const c="skipToContent_ZgBM";function u(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}const d=function(){const e=(0,r.useRef)(null),{action:t}=(0,i.k6)();return(0,s.SL)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&u(e.current)})),r.createElement("div",{ref:e,role:"region"},r.createElement("a",{href:"#",className:c,onClick:e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")||document.querySelector(".main-wrapper");t&&u(t)}},r.createElement(l.Z,{id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"},"Skip to main content")))};var p=n(7462);function f(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...l}=e;return r.createElement("svg",(0,p.Z)({viewBox:"0 0 15 15",width:t,height:n},l),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const m="announcementBar_IbjG",h="announcementBarPlaceholder_NC_W",g="announcementBarClose_FG1z",b="announcementBarContent_KsVm";const v=function(){const{isActive:e,close:t}=(0,s.nT)(),{announcementBar:n}=(0,s.LU)();if(!e)return null;const{content:o,backgroundColor:i,textColor:c,isCloseable:u}=n;return r.createElement("div",{className:m,style:{backgroundColor:i,color:c},role:"banner"},u&&r.createElement("div",{className:h}),r.createElement("div",{className:b,dangerouslySetInnerHTML:{__html:o}}),u?r.createElement("button",{type:"button",className:(0,a.Z)("clean-btn close",g),onClick:t,"aria-label":(0,l.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},r.createElement(f,{width:14,height:14,strokeWidth:3.1})):null)};var y=n(1875),w=n(2389);const k="toggle_Pssr",S="toggleScreenReader_JnkT",E="toggleDisabled_jDku",x="toggleTrack_SSoT",C="toggleTrackCheck_XobZ",_="toggleChecked_cnQY",T="toggleTrackX_YkSC",R="toggleTrackThumb_uRm4",A="toggleFocused_A7DC",P="toggleIcon_eZtF",L=(0,r.memo)((e=>{let{className:t,switchConfig:n,checked:o,disabled:i,onChange:l}=e;const{darkIcon:s,darkIconStyle:c,lightIcon:u,lightIconStyle:d}=n,[p,f]=(0,r.useState)(o),[m,h]=(0,r.useState)(!1),g=(0,r.useRef)(null);return r.createElement("div",{className:(0,a.Z)(k,t,{[_]:p,[A]:m,[E]:i})},r.createElement("div",{className:x,role:"button",tabIndex:-1,onClick:()=>{var e;return null==(e=g.current)?void 0:e.click()}},r.createElement("div",{className:C},r.createElement("span",{className:P,style:c},s)),r.createElement("div",{className:T},r.createElement("span",{className:P,style:d},u)),r.createElement("div",{className:R})),r.createElement("input",{ref:g,checked:p,type:"checkbox",className:S,"aria-label":"Switch between dark and light mode",onChange:l,onClick:()=>f(!p),onFocus:()=>h(!0),onBlur:()=>h(!1),onKeyDown:e=>{var t;"Enter"===e.key&&(null==(t=g.current)||t.click())}}))}));function N(e){const{colorMode:{switchConfig:t}}=(0,s.LU)(),n=(0,w.Z)();return r.createElement(L,(0,p.Z)({switchConfig:t,disabled:!n},e))}var O=n(5551),D=n(2207),I=n(5537);const F=function(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,p.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"}))},M={toggle:"toggle_TdHA",navbarHideable:"navbarHideable_aKYr",navbarHidden:"navbarHidden_KUhG",navbarSidebarToggle:"navbarSidebarToggle_nL8I"},j="right";function B(){return(0,s.LU)().navbar.items}function U(){const{colorMode:{disableSwitch:e}}=(0,s.LU)(),{isDarkTheme:t,setLightTheme:n,setDarkTheme:a}=(0,s.If)();return{isDarkTheme:t,toggle:(0,r.useCallback)((e=>e.target.checked?a():n()),[n,a]),disabled:e}}function $(e){let{sidebarShown:t,toggleSidebar:n}=e;(0,s.Ni)(t);const o=B(),i=U(),c=function(e){var t;let{sidebarShown:n,toggleSidebar:a}=e;const o=null==(t=(0,s.g8)())?void 0:t({toggleSidebar:a}),i=(0,s.D9)(o),[l,c]=(0,r.useState)((()=>!1));(0,r.useEffect)((()=>{o&&!i&&c(!0)}),[o,i]);const u=!!o;return(0,r.useEffect)((()=>{u?n||c(!0):c(!1)}),[n,u]),{shown:l,hide:(0,r.useCallback)((()=>{c(!1)}),[]),content:o}}({sidebarShown:t,toggleSidebar:n});return r.createElement("div",{className:"navbar-sidebar"},r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(I.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title"}),!i.disabled&&r.createElement(N,{className:M.navbarSidebarToggle,checked:i.isDarkTheme,onChange:i.toggle}),r.createElement("button",{type:"button",className:"clean-btn navbar-sidebar__close",onClick:n},r.createElement(f,{color:"var(--ifm-color-emphasis-600)",className:M.navbarSidebarCloseSvg}))),r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":c.shown})},r.createElement("div",{className:"navbar-sidebar__item menu"},r.createElement("ul",{className:"menu__list"},o.map(((e,t)=>r.createElement(D.Z,(0,p.Z)({mobile:!0},e,{onClick:n,key:t})))))),r.createElement("div",{className:"navbar-sidebar__item menu"},o.length>0&&r.createElement("button",{type:"button",className:"clean-btn navbar-sidebar__back",onClick:c.hide},r.createElement(l.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")),c.content)))}const z=function(){const{navbar:{hideOnScroll:e,style:t}}=(0,s.LU)(),n=function(){const e=(0,s.iP)(),t="mobile"===e,[n,a]=(0,r.useState)(!1);(0,s.Rb)((()=>{if(n)return a(!1),!1}));const o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===e&&a(!1)}),[e]),{shouldRender:t,toggle:o,shown:n}}(),o=U(),i=(0,O.useActivePlugin)(),{navbarRef:l,isNavbarVisible:c}=(0,s.cK)(e),u=B(),d=u.some((e=>"search"===e.type)),{leftItems:f,rightItems:m}=function(e){return{leftItems:e.filter((e=>"left"===(e.position??j))),rightItems:e.filter((e=>"right"===(e.position??j)))}}(u);return r.createElement("nav",{ref:l,className:(0,a.Z)("navbar","navbar--fixed-top",{"navbar--dark":"dark"===t,"navbar--primary":"primary"===t,"navbar-sidebar--show":n.shown,[M.navbarHideable]:e,[M.navbarHidden]:e&&!c})},r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},((null==u?void 0:u.length)>0||i)&&r.createElement("button",{"aria-label":"Navigation bar toggle",className:"navbar__toggle clean-btn",type:"button",tabIndex:0,onClick:n.toggle,onKeyDown:n.toggle},r.createElement(F,null)),r.createElement(I.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title"}),f.map(((e,t)=>r.createElement(D.Z,(0,p.Z)({},e,{key:t}))))),r.createElement("div",{className:"navbar__items navbar__items--right"},m.map(((e,t)=>r.createElement(D.Z,(0,p.Z)({},e,{key:t})))),!o.disabled&&r.createElement(N,{className:M.toggle,checked:o.isDarkTheme,onChange:o.toggle}),!d&&r.createElement(y.Z,null))),r.createElement("div",{role:"presentation",className:"navbar-sidebar__backdrop",onClick:n.toggle}),n.shouldRender&&r.createElement($,{sidebarShown:n.shown,toggleSidebar:n.toggle}))};var q=n(9960),Z=n(4996),G=n(3919);const H="footerLogoLink_RC3H";var V=n(9750),W=n(541);function K(e){let{to:t,href:n,label:a,prependBaseUrlToHref:o,...i}=e;const l=(0,Z.Z)(t),s=(0,Z.Z)(n,{forcePrependBaseUrl:!0});return r.createElement(q.Z,(0,p.Z)({className:"footer__link-item"},n?{href:o?s:n}:{to:l},i),n&&!(0,G.Z)(n)?r.createElement("span",null,a,r.createElement(W.Z,null)):a)}function Y(e){let{sources:t,alt:n,width:a,height:o}=e;return r.createElement(V.Z,{className:"footer__logo",alt:n,sources:t,width:a,height:o})}function Q(e){let{links:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement("div",{key:t,className:"col footer__col"},r.createElement("div",{className:"footer__title"},e.title),r.createElement("ul",{className:"footer__items"},e.items.map(((e,t)=>e.html?r.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.createElement("li",{key:e.href||e.to,className:"footer__item"},r.createElement(K,e)))))))))}function X(e){let{links:t}=e;return r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,null,e.html?r.createElement("span",{key:n,className:"footer__link-item",dangerouslySetInnerHTML:{__html:e.html}}):r.createElement(K,e),t.length!==n+1&&r.createElement("span",{className:"footer__link-separator"},"\xb7")))))}function J(){const{footer:e}=(0,s.LU)(),{copyright:t,links:n=[],logo:o={}}=e||{},i={light:(0,Z.Z)(o.src),dark:(0,Z.Z)(o.srcDark||o.src)};return e?r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===e.style})},r.createElement("div",{className:"container container-fluid"},n&&n.length>0&&(function(e){return"title"in e[0]}(n)?r.createElement("div",{className:"row footer__links"},r.createElement(Q,{links:n})):r.createElement("div",{className:"footer__links text--center"},r.createElement(X,{links:n}))),(o||t)&&r.createElement("div",{className:"footer__bottom text--center"},o&&(o.src||o.srcDark)&&r.createElement("div",{className:"margin-bottom--sm"},o.href?r.createElement(q.Z,{href:o.href,className:H},r.createElement(Y,{alt:o.alt,sources:i,width:o.width,height:o.height})):r.createElement(Y,{alt:o.alt,sources:i})),t?r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}}):null))):null}const ee=r.memo(J);function te(e){let{children:t}=e;return r.createElement(s.SG,null,r.createElement(s.pl,null,r.createElement(s.z5,null,r.createElement(s.OC,null,r.createElement(s.L5,null,r.createElement(s.Cn,null,t))))))}var ne=n(2859),re=n(2263);function ae(e){let{locale:t,version:n,tag:a}=e;return r.createElement(ne.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),a&&r.createElement("meta",{name:"docusaurus_tag",content:a}))}var oe=n(1217);function ie(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,re.Z)(),n=(0,s.l5)();return r.createElement(ne.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 le(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,re.Z)(),a=function(){const{siteConfig:{url:e}}=(0,re.Z)(),{pathname:t}=(0,i.TH)();return e+(0,Z.Z)(t)}(),o=t?`${n}${t}`:a;return r.createElement(ne.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function se(e){const{siteConfig:{favicon:t},i18n:{currentLocale:n,localeConfigs:a}}=(0,re.Z)(),{metadata:o,image:i}=(0,s.LU)(),{title:l,description:c,image:u,keywords:d,searchMetadata:f}=e,m=(0,Z.Z)(t),h=(0,s.pe)(l),{htmlLang:g,direction:b}=a[n];return r.createElement(r.Fragment,null,r.createElement(ne.Z,null,r.createElement("html",{lang:g,dir:b}),t&&r.createElement("link",{rel:"icon",href:m}),r.createElement("title",null,h),r.createElement("meta",{property:"og:title",content:h}),r.createElement("meta",{name:"twitter:card",content:"summary_large_image"})),i&&r.createElement(oe.Z,{image:i}),u&&r.createElement(oe.Z,{image:u}),r.createElement(oe.Z,{description:c,keywords:d}),r.createElement(le,null),r.createElement(ie,null),r.createElement(ae,(0,p.Z)({tag:s.HX,locale:n},f)),r.createElement(ne.Z,null,o.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:`metadata_${t}`},e))))))}function ce(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(l.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(l.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}const ue=function(e){const{children:t,noFooter:n,wrapperClassName:i,pageClassName:l}=e;return(0,s.t$)(),r.createElement(te,null,r.createElement(se,e),r.createElement(d,null),r.createElement(v,null),r.createElement(z,null),r.createElement("div",{className:(0,a.Z)(s.kM.wrapper.main,i,l)},r.createElement(o.Z,{fallback:ce},t)),!n&&r.createElement(ee,null))}},5537:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),a=n(7294),o=n(9960),i=n(9750),l=n(4996),s=n(2263),c=n(5773);const u=function(e){const{siteConfig:{title:t}}=(0,s.Z)(),{navbar:{title:n,logo:u={src:""}}}=(0,c.LU)(),{imageClassName:d,titleClassName:p,...f}=e,m=(0,l.Z)(u.href||"/"),h={light:(0,l.Z)(u.src),dark:(0,l.Z)(u.srcDark||u.src)},g=a.createElement(i.Z,{sources:h,height:u.height,width:u.width,alt:u.alt||n||t});return a.createElement(o.Z,(0,r.Z)({to:m},f,u.target&&{target:u.target}),u.src&&(d?a.createElement("div",{className:d},g):g),null!=n&&a.createElement("b",{className:p},n))}},5525:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),a=n(7294),o=n(6010),i=n(3072),l=n(1068);function s(e){let{className:t,isDropdownItem:n=!1,...l}=e;const s=a.createElement(i.Z,(0,r.Z)({className:(0,o.Z)(n?"dropdown__link":"navbar__item navbar__link",t)},l));return n?a.createElement("li",null,s):s}function c(e){let{className:t,isDropdownItem:n,...l}=e;return a.createElement("li",{className:"menu__list-item"},a.createElement(i.Z,(0,r.Z)({className:(0,o.Z)("menu__link",t)},l)))}const u=function(e){let{mobile:t=!1,position:n,...o}=e;const i=t?c:s;return a.createElement(i,(0,r.Z)({},o,{activeClassName:o.activeClassName??(0,l.E)(t)}))}},6400:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),a=n(7294),o=n(5525),i=n(5551),l=n(6010),s=n(1068),c=n(5773);function u(e){let{docId:t,label:n,docsPluginId:u,...d}=e;const{activeVersion:p,activeDoc:f}=(0,i.useActiveDocContext)(u),{preferredVersion:m}=(0,c.J)(u),h=(0,i.useLatestVersion)(u),g=function(e,t){const n=e.flatMap((e=>e.docs)),r=n.find((e=>e.id===t));if(!r){const r=n.map((e=>e.id)).join("\n- ");throw new Error(`DocNavbarItem: couldn't find any doc with id "${t}" in version${e.length?"s":""} ${e.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${r}`)}return r}((0,c.jj)([p,m,h].filter(Boolean)),t),b=(0,s.E)(d.mobile);return a.createElement(o.Z,(0,r.Z)({exact:!0},d,{className:(0,l.Z)(d.className,{[b]:(null==f?void 0:f.sidebar)&&f.sidebar===g.sidebar}),activeClassName:b,label:n??g.id,to:g.path}))}},4792:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),a=n(7294),o=n(5525),i=n(5551),l=n(6010),s=n(1068),c=n(5773);function u(e){let{sidebarId:t,label:n,docsPluginId:u,...d}=e;const{activeVersion:p,activeDoc:f}=(0,i.useActiveDocContext)(u),{preferredVersion:m}=(0,c.J)(u),h=(0,i.useLatestVersion)(u),g=function(e,t){const n=e.flatMap((e=>{if(e.sidebars)return Object.entries(e.sidebars)})).filter((e=>!!e)),r=n.find((e=>e[0]===t));if(!r)throw new Error(`DocSidebarNavbarItem: couldn't find any sidebar with id "${t}" in version${e.length?"s":""} ${e.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${Object.keys(n).join("\n- ")}`);if(!r[1].link)throw new Error(`DocSidebarNavbarItem: couldn't find any document for sidebar with id "${t}"`);return r[1].link}((0,c.jj)([p,m,h].filter(Boolean)),t),b=(0,s.E)(d.mobile);return a.createElement(o.Z,(0,r.Z)({exact:!0},d,{className:(0,l.Z)(d.className,{[b]:(null==f?void 0:f.sidebar)===t}),activeClassName:b,label:n??g.label,to:g.path}))}},9308:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(5525),i=n(3154),l=n(5551),s=n(5773),c=n(5999);const u=e=>e.docs.find((t=>t.id===e.mainDocId));function d(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:d,dropdownItemsBefore:p,dropdownItemsAfter:f,...m}=e;const h=(0,l.useActiveDocContext)(n),g=(0,l.useVersions)(n),b=(0,l.useLatestVersion)(n),{preferredVersion:v,savePreferredVersionName:y}=(0,s.J)(n);const w=function(){const e=g.map((e=>{const t=(null==h?void 0:h.alternateDocVersions[e.name])||u(e);return{isNavLink:!0,label:e.label,to:t.path,isActive:()=>e===(null==h?void 0:h.activeVersion),onClick:()=>{y(e.name)}}}));return[...p,...e,...f]}(),k=h.activeVersion??v??b,S=t&&w.length>1?(0,c.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):k.label,E=t&&w.length>1?void 0:u(k).path;return w.length<=1?a.createElement(o.Z,(0,r.Z)({},m,{mobile:t,label:S,to:E,isActive:d?()=>!1:void 0})):a.createElement(i.Z,(0,r.Z)({},m,{mobile:t,label:S,to:E,items:w,isActive:d?()=>!1:void 0}))}},7250:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s});var r=n(7462),a=n(7294),o=n(5525),i=n(5551),l=n(5773);function s(e){let{label:t,to:n,docsPluginId:s,...c}=e;const u=(0,i.useActiveVersion)(s),{preferredVersion:d}=(0,l.J)(s),p=(0,i.useLatestVersion)(s),f=u??d??p,m=t??f.label,h=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(f).path;return a.createElement(o.Z,(0,r.Z)({},c,{label:m,to:h}))}},3154:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7462),a=n(7294),o=n(6010),i=n(5773),l=n(3072),s=n(2207);function c(e,t){return e.some((e=>function(e,t){return!!(0,i.Mg)(e.to,t)||!!(0,i.Fx)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function u(e){let{items:t,position:n,className:i,...c}=e;const u=(0,a.useRef)(null),[d,p]=(0,a.useState)(!1);return(0,a.useEffect)((()=>{const e=e=>{u.current&&!u.current.contains(e.target)&&p(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[u]),a.createElement("div",{ref:u,className:(0,o.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":d})},a.createElement(l.Z,(0,r.Z)({href:c.to?void 0:"#",className:(0,o.Z)("navbar__link",i)},c,{onClick:c.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),p(!d))}}),c.children??c.label),a.createElement("ul",{className:"dropdown__menu"},t.map(((e,n)=>a.createElement(s.Z,(0,r.Z)({isDropdownItem:!0,onKeyDown:e=>{if(n===t.length-1&&"Tab"===e.key){e.preventDefault(),p(!1);const t=u.current.nextElementSibling;t&&t.focus()}},activeClassName:"dropdown__link--active"},e,{key:n}))))))}function d(e){let{items:t,className:n,position:u,...d}=e;const p=(0,i.be)(),f=c(t,p),{collapsed:m,toggleCollapsed:h,setCollapsed:g}=(0,i.uR)({initialState:()=>!f});return(0,a.useEffect)((()=>{f&&g(!f)}),[p,f,g]),a.createElement("li",{className:(0,o.Z)("menu__list-item",{"menu__list-item--collapsed":m})},a.createElement(l.Z,(0,r.Z)({role:"button",className:(0,o.Z)("menu__link menu__link--sublist",n)},d,{onClick:e=>{e.preventDefault(),h()}}),d.children??d.label),a.createElement(i.zF,{lazy:!0,as:"ul",className:"menu__list",collapsed:m},t.map(((e,t)=>a.createElement(s.Z,(0,r.Z)({mobile:!0,isDropdownItem:!0,onClick:d.onClick,activeClassName:"menu__link--active"},e,{key:t}))))))}const p=function(e){let{mobile:t=!1,...n}=e;const r=t?d:u;return a.createElement(r,n)}},3072:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),a=n(7294),o=n(9960),i=n(4996),l=n(541),s=n(3919),c=n(5773);function u(e){var t;let{activeBasePath:n,activeBaseRegex:u,to:d,href:p,label:f,activeClassName:m="",prependBaseUrlToHref:h,...g}=e;const b=(0,i.Z)(d),v=(0,i.Z)(n),y=(0,i.Z)(p,{forcePrependBaseUrl:!0}),w=f&&p&&!(0,s.Z)(p),k="dropdown__link--active"===m;return a.createElement(o.Z,(0,r.Z)({},p?{href:h?y:p}:{isNavLink:!0,activeClassName:null!=(t=g.className)&&t.includes(m)?"":m,to:b,...n||u?{isActive:(e,t)=>u?(0,c.Fx)(u,t.pathname):t.pathname.startsWith(v)}:null},g),w?a.createElement("span",null,f,a.createElement(l.Z,k&&{width:12,height:12})):f)}},2207:(e,t,n)=>{"use strict";n.d(t,{Z:()=>h});var r=n(7294),a=n(5525),o=n(3154),i=n(7462);const l=function(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,i.Z)({viewBox:"0 0 20 20",width:t,height:n,"aria-hidden":"true"},a),r.createElement("path",{fill:"currentColor",d:"M19.753 10.909c-.624-1.707-2.366-2.726-4.661-2.726-.09 0-.176.002-.262.006l-.016-2.063 3.525-.607c.115-.019.133-.119.109-.231-.023-.111-.167-.883-.188-.976-.027-.131-.102-.127-.207-.109-.104.018-3.25.461-3.25.461l-.013-2.078c-.001-.125-.069-.158-.194-.156l-1.025.016c-.105.002-.164.049-.162.148l.033 2.307s-3.061.527-3.144.543c-.084.014-.17.053-.151.143.019.09.19 1.094.208 1.172.018.08.072.129.188.107l2.924-.504.035 2.018c-1.077.281-1.801.824-2.256 1.303-.768.807-1.207 1.887-1.207 2.963 0 1.586.971 2.529 2.328 2.695 3.162.387 5.119-3.06 5.769-4.715 1.097 1.506.256 4.354-2.094 5.98-.043.029-.098.129-.033.207l.619.756c.08.096.206.059.256.023 2.51-1.73 3.661-4.515 2.869-6.683zm-7.386 3.188c-.966-.121-.944-.914-.944-1.453 0-.773.327-1.58.876-2.156a3.21 3.21 0 011.229-.799l.082 4.277a2.773 2.773 0 01-1.243.131zm2.427-.553l.046-4.109c.084-.004.166-.01.252-.01.773 0 1.494.145 1.885.361.391.217-1.023 2.713-2.183 3.758zm-8.95-7.668a.196.196 0 00-.196-.145h-1.95a.194.194 0 00-.194.144L.008 16.916c-.017.051-.011.076.062.076h1.733c.075 0 .099-.023.114-.072l1.008-3.318h3.496l1.008 3.318c.016.049.039.072.113.072h1.734c.072 0 .078-.025.062-.076-.014-.05-3.083-9.741-3.494-11.04zm-2.618 6.318l1.447-5.25 1.447 5.25H3.226z"}))};var s=n(2263),c=n(5773);const u="iconLanguage_dNtB";function d(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...d}=e;const{i18n:{currentLocale:p,locales:f,localeConfigs:m}}=(0,s.Z)(),h=(0,c.l5)();function g(e){return m[e].label}const b=[...n,...f.map((e=>{const t=`pathname://${h.createUrl({locale:e,fullyQualified:!1})}`;return{isNavLink:!0,label:g(e),to:t,target:"_self",autoAddBaseUrl:!1,className:e===p?"dropdown__link--active":""}})),...a],v=t?"Languages":g(p);return r.createElement(o.Z,(0,i.Z)({},d,{mobile:t,label:r.createElement("span",null,r.createElement(l,{className:u}),r.createElement("span",null,v)),items:b}))}var p=n(1875);function f(e){let{mobile:t}=e;return t?null:r.createElement(p.Z,null)}const m={default:()=>a.Z,localeDropdown:()=>d,search:()=>f,dropdown:()=>o.Z,docsVersion:()=>n(7250).Z,docsVersionDropdown:()=>n(9308).Z,doc:()=>n(6400).Z,docSidebar:()=>n(4792).Z};function h(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:t?"dropdown":"default"}(t,void 0!==n.items),o=(e=>{const t=m[e];if(!t)throw new Error(`No NavbarItem component found for type "${e}".`);return t()})(a);return r.createElement(o,n)}},1068:(e,t,n)=>{"use strict";n.d(t,{E:()=>r});const r=e=>e?"menu__link--active":"navbar__link--active"},1217:(e,t,n)=>{"use strict";n.d(t,{Z:()=>l});var r=n(7294),a=n(2859),o=n(5773),i=n(4996);function l(e){let{title:t,description:n,keywords:l,image:s,children:c}=e;const u=(0,o.pe)(t),{withBaseUrl:d}=(0,i.C)(),p=s?d(s,{absolute:!0}):void 0;return r.createElement(a.Z,null,t&&r.createElement("title",null,u),t&&r.createElement("meta",{property:"og:title",content:u}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),l&&r.createElement("meta",{name:"keywords",content:Array.isArray(l)?l.join(","):l}),p&&r.createElement("meta",{property:"og:image",content:p}),p&&r.createElement("meta",{name:"twitter:image",content:p}),c)}},9750:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7462),a=n(7294),o=n(6010),i=n(2389),l=n(5773);const s={themedImage:"themedImage_W2Cr","themedImage--light":"themedImage--light_TfLj","themedImage--dark":"themedImage--dark_oUvU"};const c=function(e){const t=(0,i.Z)(),{isDarkTheme:n}=(0,l.If)(),{sources:c,className:u,alt:d="",...p}=e,f=t?n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,f.map((e=>a.createElement("img",(0,r.Z)({key:e,src:c[e],alt:d,className:(0,o.Z)(s.themedImage,s[`themedImage--${e}`],u)},p)))))}},467:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(412),a=n(9782);const o=e=>{if(r.Z.canUseDOM){const{themeConfig:{prism:t}}=a.Z,{additionalLanguages:r}=t;window.Prism=e,r.forEach((e=>{n(6726)(`./prism-${e}`)})),delete window.Prism}}},2448:(e,t,n)=>{"use strict";var r=a(n(7410));function a(e){return e&&e.__esModule?e:{default:e}}(0,a(n(467)).default)(r.default)},5773:(e,t,n)=>{"use strict";n.d(t,{pl:()=>Ie,zF:()=>fe,SG:()=>it,HX:()=>K,PO:()=>ke,D_:()=>s,L5:()=>D,bT:()=>C,qu:()=>S,Cv:()=>_e,Cn:()=>Ee,OC:()=>Ve,z5:()=>dt,kM:()=>Ae,os:()=>Y,lx:()=>Te,Wl:()=>T,_F:()=>R,Fx:()=>Xe,Mg:()=>v,bc:()=>H,Vo:()=>V,nZ:()=>W,jj:()=>Re,l5:()=>g,nT:()=>Fe,uR:()=>oe,If:()=>lt,fP:()=>c,J:()=>M,Vq:()=>_,E6:()=>E,cK:()=>ft,Rb:()=>je,t$:()=>mt,be:()=>Me,SL:()=>re,Ni:()=>bt,g8:()=>Ce,D9:()=>ne,pJ:()=>gt,RF:()=>Ye,o5:()=>Qe,DA:()=>Ze,Si:()=>ze,UB:()=>pt,LU:()=>a,pe:()=>Q,iP:()=>St});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}var o=n(7294);const i=Symbol("EmptyContext"),l=o.createContext(i);function s(e){let{children:t}=e;const[n,r]=(0,o.useState)(null),a=(0,o.useMemo)((()=>({expandedItem:n,setExpandedItem:r})),[n]);return o.createElement(l.Provider,{value:a},t)}function c(){const e=(0,o.useContext)(l);if(e===i)throw new Error("This hook requires usage of ");return e}const u="localStorage";function d(e){if(void 0===e&&(e=u),"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,p||(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),p=!0),null}var t}let p=!1;const f={get:()=>null,set:()=>{},del:()=>{}};const m=(e,t)=>{if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t}}(e);const n=d(null==t?void 0:t.persistence);return null===n?f:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{n.setItem(e,t)}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{n.removeItem(e)}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}}}};var h=n(6775);function g(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:a}}=(0,r.Z)(),{pathname:o}=(0,h.TH)(),i=a===n?e:e.replace(`/${a}/`,"/"),l=o.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return`${a?t:""}${function(e){return e===n?`${i}`:`${i}${e}/`}(r)}${l}`}}}var b=n(5551);const v=(e,t)=>{const n=e=>!e||(null==e?void 0:e.endsWith("/"))?e:`${e}/`;return n(e)===n(t)},y=!!b.useAllDocsData,w=Symbol("EmptyContext"),k=(0,o.createContext)(w);function S(e){let{children:t,version:n}=e;return o.createElement(k.Provider,{value:n},t)}function E(){const e=(0,o.useContext)(k);if(e===w)throw new Error("This hook requires usage of ");return e}const x=(0,o.createContext)(w);function C(e){let{children:t,sidebar:n}=e;return o.createElement(x.Provider,{value:n},t)}function _(){const e=(0,o.useContext)(x);if(e===w)throw new Error("This hook requires usage of ");return e}function T(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"!==t.type)throw new Error(`Unexpected category item type for ${JSON.stringify(t)}`);{const e=T(t);if(e)return e}}}function R(e,t){const n=e=>void 0!==e&&v(e,t);return"link"===e.type?n(e.href):"category"===e.type&&(n(e.href)||function(e,t){return e.some((e=>R(e,t)))}(e.items,t))}const A=e=>`docs-preferred-version-${e}`,P={save:(e,t,n)=>{m(A(e),{persistence:t}).set(n)},read:(e,t)=>m(A(e),{persistence:t}).get(),clear:(e,t)=>{m(A(e),{persistence:t}).del()}};function L(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;const a={};return t.forEach((e=>{a[e]=function(e){const t=P.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(P.clear(e,n),{preferredVersionName:null})}(e)})),a}function N(){const e=(0,b.useAllDocsData)(),t=a().docs.versionPersistence,n=(0,o.useMemo)((()=>Object.keys(e)),[e]),[r,i]=(0,o.useState)((()=>function(e){const t={};return e.forEach((e=>{t[e]={preferredVersionName:null}})),t}(n)));(0,o.useEffect)((()=>{i(L({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[r,(0,o.useMemo)((()=>({savePreferredVersion:function(e,n){P.save(e,t,n),i((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}const O=(0,o.createContext)(null);function D(e){let{children:t}=e;return y?o.createElement(I,null,t):t}function I(e){let{children:t}=e;const n=N();return o.createElement(O.Provider,{value:n},t)}var F=n(9935);function M(e){void 0===e&&(e=F.m);const t=(0,b.useDocsData)(e),[n,r]=function(){const e=(0,o.useContext)(O);if(!e)throw new Error('Can\'t find docs preferred context, maybe you forgot to use the "DocsPreferredVersionContextProvider"?');return e}(),{preferredVersionName:a}=n[e];return{preferredVersion:a?t.versions.find((e=>e.name===a)):null,savePreferredVersionName:(0,o.useCallback)((t=>{r.savePreferredVersion(e,t)}),[r,e])}}var j=n(7594),B=n.n(j);const U=/title=(["'])(.*?)\1/,$=/{([\d,-]+)}/,z=["js","jsBlock","jsx","python","html"],q={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},python:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},Z=["highlight-next-line","highlight-start","highlight-end"],G=function(e){void 0===e&&(e=z);const t=e.map((e=>{const{start:t,end:n}=q[e];return`(?:${t}\\s*(${Z.join("|")})\\s*${n})`})).join("|");return new RegExp(`^\\s*(?:${t})\\s*$`)};function H(e){var t,n;return null!==(n=null===(t=null==e?void 0:e.match(U))||void 0===t?void 0:t[2])&&void 0!==n?n:""}function V(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return null==t?void 0:t.replace(/language-/,"")}function W(e,t,n){let r=e.replace(/\n$/,"");if(t&&$.test(t)){const e=t.match($)[1];return{highlightLines:B()(e).filter((e=>e>0)).map((e=>e-1)),code:r}}if(void 0===n)return{highlightLines:[],code:r};const a=(e=>{switch(e){case"js":case"javascript":case"ts":case"typescript":return G(["js","jsBlock"]);case"jsx":case"tsx":return G(["js","jsBlock","jsx"]);case"html":return G(["js","jsBlock","html"]);case"python":case"py":return G(["python"]);default:return G()}})(n),o=r.split("\n");let i,l="";for(let c=0;cvoid 0!==e))){case"highlight-next-line":l+=`${c},`;break;case"highlight-start":i=c;break;case"highlight-end":l+=`${i}-${c-1},`}o.splice(c,1)}else c+=1}const s=B()(l);return r=o.join("\n"),{highlightLines:s,code:r}}const K="default";function Y(e,t){return`docs-${e}-${t}`}const Q=e=>{const{siteConfig:t}=(0,r.Z)(),{title:n,titleDelimiter:a}=t;return e&&e.trim().length?`${e.trim()} ${a} ${n}`:n},X=["zero","one","two","few","many","other"];function J(e){return X.filter((t=>e.includes(t)))}J(["one","other"]);const ee="undefined"!=typeof window?o.useLayoutEffect:o.useEffect;function te(e){const t=(0,o.useRef)(e);return ee((()=>{t.current=e}),[e]),(0,o.useCallback)((function(){return t.current(...arguments)}),[])}function ne(e){const t=(0,o.useRef)();return ee((()=>{t.current=e})),t.current}function re(e){const t=(0,h.TH)(),n=ne(t),r=te(e);(0,o.useEffect)((()=>{t!==n&&r({location:t,previousLocation:n})}),[r,t,n])}var ae=n(412);function oe(e){let{initialState:t}=e;const[n,r]=(0,o.useState)(null!=t&&t),a=(0,o.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:a}}const ie={display:"none",overflow:"hidden",height:"0px"},le={display:"block",overflow:"visible",height:"auto"};function se(e,t){const n=t?ie:le;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function ce(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const a=(0,o.useRef)(!1);(0,o.useEffect)((()=>{const e=t.current;function o(){var t,n;const a=e.scrollHeight,o=null!==(t=null==r?void 0:r.duration)&&void 0!==t?t:function(e){const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(a);return{transition:`height ${o}ms ${null!==(n=null==r?void 0:r.easing)&&void 0!==n?n:"ease-in-out"}`,height:`${a}px`}}function i(){const t=o();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return se(e,n),void(a.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(i(),requestAnimationFrame((()=>{e.style.height=ie.height,e.style.overflow=ie.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{i()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function ue(e){if(!ae.Z.canUseDOM)return e?ie:le}function de(e){let{as:t="div",collapsed:n,children:r,animation:a,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const c=(0,o.useRef)(null);return ce({collapsibleRef:c,collapsed:n,animation:a}),o.createElement(t,{ref:c,style:s?void 0:ue(n),onTransitionEnd:e=>{"height"===e.propertyName&&(se(c.current,n),null==i||i(n))},className:l},r)}function pe(e){let{collapsed:t,...n}=e;const[r,a]=(0,o.useState)(!t);(0,o.useLayoutEffect)((()=>{t||a(!0)}),[t]);const[i,l]=(0,o.useState)(t);return(0,o.useLayoutEffect)((()=>{r&&l(t)}),[r,t]),r?o.createElement(de,{...n,collapsed:i}):null}function fe(e){let{lazy:t,...n}=e;const r=t?pe:de;return o.createElement(r,{...n})}var me=n(2389),he=n(6010);const ge="details_lb9f",be="isBrowser_bmU9",ve="collapsibleContent_i85q";function ye(e){return!!e&&("SUMMARY"===e.tagName||ye(e.parentElement))}function we(e,t){return!!e&&(e===t||we(e.parentElement,t))}const ke=function(e){let{summary:t,children:n,...r}=e;const a=(0,me.Z)(),i=(0,o.useRef)(null),{collapsed:l,setCollapsed:s}=oe({initialState:!r.open}),[c,u]=(0,o.useState)(r.open);return o.createElement("details",{...r,ref:i,open:c,"data-collapsed":l,className:(0,he.Z)(ge,{[be]:a},r.className),onMouseDown:e=>{ye(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;ye(t)&&we(t,i.current)&&(e.preventDefault(),l?(s(!1),u(!0)):s(!0))}},t,o.createElement(fe,{lazy:!1,collapsed:l,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{s(e),u(!e)}},o.createElement("div",{className:ve},n)))};const Se=(0,o.createContext)(null);function Ee(e){let{children:t}=e;return o.createElement(Se.Provider,{value:(0,o.useState)(null)},t)}function xe(){const e=(0,o.useContext)(Se);if(null===e)throw new Error("MobileSecondaryMenuProvider was not used correctly, context value is null");return e}function Ce(){const[e]=xe();if(e){const t=e.component;return function(n){return o.createElement(t,{...e.props,...n})}}return()=>{}}function _e(e){let{component:t,props:n}=e;const[,r]=xe(),a=(i=n,(0,o.useMemo)((()=>i),[...Object.keys(i),...Object.values(i)]));var i;return(0,o.useEffect)((()=>{r({component:t,props:a})}),[r,t,a]),(0,o.useEffect)((()=>()=>r(null)),[r]),null}function Te(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function Re(e){return Array.from(new Set(e))}const Ae={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"},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",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:{}},Pe=m("docusaurus.announcement.dismiss"),Le=m("docusaurus.announcement.id"),Ne=()=>"true"===Pe.get(),Oe=e=>Pe.set(String(e)),De=(0,o.createContext)(null);function Ie(e){let{children:t}=e;const n=(()=>{const{announcementBar:e}=a(),t=(0,me.Z)(),[n,r]=(0,o.useState)((()=>!!t&&Ne()));(0,o.useEffect)((()=>{r(Ne())}),[]);const i=(0,o.useCallback)((()=>{Oe(!0),r(!0)}),[]);return(0,o.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=Le.get();"annoucement-bar"===n&&(n="announcement-bar");const a=t!==n;Le.set(t),a&&Oe(!1),!a&&Ne()||r(!1)}),[e]),(0,o.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])})();return o.createElement(De.Provider,{value:n},t)}const Fe=()=>{const e=(0,o.useContext)(De);if(!e)throw new Error("useAnnouncementBar(): AnnouncementBar not found in React context: make sure to use the AnnouncementBarProvider on top of the tree");return e};function Me(){const{siteConfig:{baseUrl:e}}=(0,r.Z)(),{pathname:t}=(0,h.TH)();return t.replace(e,"/")}n(5999);function je(e){!function(e){const{block:t}=(0,h.k6)(),n=(0,o.useRef)(e);(0,o.useEffect)((()=>{n.current=e}),[e]),(0,o.useEffect)((()=>t(((e,t)=>n.current(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function Be(e){const t=e.getBoundingClientRect();return t.top===t.bottom?Be(e.parentNode):t}function Ue(e,t){let{anchorTopOffset:n}=t;var r;const a=e.find((e=>Be(e).top>=n));if(a){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}const ze=function(e){const t=(0,o.useRef)(void 0),n=$e();(0,o.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:r,linkActiveClassName:a,minHeadingLevel:o,maxHeadingLevel:i}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(r),l=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const r=[];for(let a=t;a<=n;a+=1)r.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(r.join()))}({minHeadingLevel:o,maxHeadingLevel:i}),s=Ue(l,{anchorTopOffset:n.current}),c=e.find((e=>s&&s.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){var r;n?(t.current&&t.current!==e&&(null===(r=t.current)||void 0===r||r.classList.remove(a)),e.classList.add(a),t.current=e,e.scrollIntoView({block:"nearest"})):e.classList.remove(a)}(e,e===c)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,n])};function qe(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:r}=e;return t.flatMap((e=>{const t=qe({toc:e.children,minHeadingLevel:n,maxHeadingLevel:r});return function(e){return e.level>=n&&e.level<=r}(e)?[{...e,children:t}]:t}))}function Ze(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:r}=e;return(0,o.useMemo)((()=>qe({toc:t,minHeadingLevel:n,maxHeadingLevel:r})),[t,n,r])}function Ge(){const e=(0,o.useRef)(!0);return(0,o.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}const He=(0,o.createContext)(void 0);function Ve(e){let{children:t}=e;return o.createElement(He.Provider,{value:Ge()},t)}function We(){const e=(0,o.useContext)(He);if(null==e)throw new Error('"useScrollController" is used but no context provider was found in the React tree.');return e}const Ke=()=>ae.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function Ye(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=We(),r=(0,o.useRef)(Ke()),a=te(e);(0,o.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=Ke();a&&a(e,r.current),r.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function Qe(){const e=We(),t=function(){const e=(0,o.useRef)({elem:null,top:0}),t=(0,o.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,o.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,o.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,o.useRef)(void 0),r=(0,o.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,o.useLayoutEffect)((()=>{var e;null===(e=n.current)||void 0===e||e.call(n)})),{blockElementScrollPositionUntilNextRender:r}}function Xe(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}const Je=m("theme"),et="light",tt="dark",nt=e=>e===tt?tt:et,rt=e=>{m("theme").set(nt(e))};function at(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=a(),[r,i]=(0,o.useState)((e=>ae.Z.canUseDOM?nt(document.documentElement.getAttribute("data-theme")):nt(e))(e)),l=(0,o.useCallback)((()=>{i(et),rt(et)}),[]),s=(0,o.useCallback)((()=>{i(tt),rt(tt)}),[]);return(0,o.useEffect)((()=>{document.documentElement.setAttribute("data-theme",nt(r))}),[r]),(0,o.useEffect)((()=>{if(!t)try{const e=Je.get();null!==e&&i(nt(e))}catch(e){console.error(e)}}),[t,i]),(0,o.useEffect)((()=>{t&&!n||window.matchMedia("(prefers-color-scheme: dark)").addListener((e=>{let{matches:t}=e;i(t?tt:et)}))}),[t,n]),{isDarkTheme:r===tt,setLightTheme:l,setDarkTheme:s}}const ot=o.createContext(void 0);function it(e){let{children:t}=e;const{isDarkTheme:n,setLightTheme:r,setDarkTheme:a}=at(),i=(0,o.useMemo)((()=>({isDarkTheme:n,setLightTheme:r,setDarkTheme:a})),[n,r,a]);return o.createElement(ot.Provider,{value:i},t)}function lt(){const e=(0,o.useContext)(ot);if(null==e)throw new Error('"useColorMode()" is used outside of "Layout" component. Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.');return e}const st="docusaurus.tab.",ct=(0,o.createContext)(void 0);function ut(){const[e,t]=(0,o.useState)({}),n=(0,o.useCallback)(((e,t)=>{m(`docusaurus.tab.${e}`).set(t)}),[]);return(0,o.useEffect)((()=>{try{const e={};(function(e){void 0===e&&(e=u);const t=d(e);if(!t)return[];const n=[];for(let r=0;r{if(t.startsWith(st)){const n=t.substring(st.length);e[n]=m(t).get()}})),t(e)}catch(e){console.error(e)}}),[]),{tabGroupChoices:e,setTabGroupChoices:(e,r)=>{t((t=>({...t,[e]:r}))),n(e,r)}}}function dt(e){let{children:t}=e;const{tabGroupChoices:n,setTabGroupChoices:r}=ut(),a=(0,o.useMemo)((()=>({tabGroupChoices:n,setTabGroupChoices:r})),[n,r]);return o.createElement(ct.Provider,{value:a},t)}function pt(){const e=(0,o.useContext)(ct);if(null==e)throw new Error('"useUserPreferencesContext" is used outside of "Layout" component.');return e}function ft(e){const[t,n]=(0,o.useState)(e),r=(0,o.useRef)(!1),a=(0,o.useRef)(0),i=(0,o.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return Ye(((t,o)=>{if(!e)return;const i=t.scrollY;if(i=l?n(!1):i+c{if(e)return t.location.hash?(r.current=!0,void n(!1)):void n(!0)})),{navbarRef:i,isNavbarVisible:t}}function mt(){(0,o.useEffect)((()=>{const e="navigation-with-keyboard";function t(t){"keydown"===t.type&&"Tab"===t.key&&document.body.classList.add(e),"mousedown"===t.type&&document.body.classList.remove(e)}return document.addEventListener("keydown",t),document.addEventListener("mousedown",t),()=>{document.body.classList.remove(e),document.removeEventListener("keydown",t),document.removeEventListener("mousedown",t)}}),[])}const ht={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string","inserted"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag","deleted"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]};function gt(){const{prism:e}=a(),{isDarkTheme:t}=lt(),n=e.theme||ht,r=e.darkTheme||n;return t?r:n}function bt(e){void 0===e&&(e=!0),(0,o.useEffect)((()=>(document.body.style.overflow=e?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[e])}const vt="desktop",yt="mobile",wt="ssr";function kt(){return ae.Z.canUseDOM?window.innerWidth>996?vt:yt:wt}function St(){const[e,t]=(0,o.useState)((()=>kt()));return(0,o.useEffect)((()=>{function e(){t(kt())}return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(undefined)}}),[]),e}},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)}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.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}})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta})},2358:(e,t,n)=>{"use strict";n.d(t,{lX:()=>E,q_:()=>A,ob:()=>h,PP:()=>L,Ep:()=>m,Hp:()=>g});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;p--){var f=i[p];"."===f?o(i,p):".."===f?(o(i,p),d++):d&&(o(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};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 c=n(2177);function u(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function p(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 f(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 b(){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,p(),w.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=f(n);a&&a!==m&&e(t,a,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},6743:(e,t,n)=>{"use strict";n.r(t)},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(r.barSelector),u=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&f(a),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;function a(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,o){for(var i,l,s=a(e),c=1;c{function n(e){let t,n=[];for(let r of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(r))n.push(parseInt(r,10));else if(t=r.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,r,a,o]=t;if(r&&o){r=parseInt(r),o=parseInt(o);const e=r{"use strict";n.r(t),n.d(t,{default:()=>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);E+=S.value.length,S=S.next){var x=S.value;if(t.length>e.length)return;if(!(x instanceof a)){var C,_=1;if(v){if(!(C=o(k,E,e,b))||C.index>=e.length)break;var T=C.index,R=C.index+C[0].length,A=E;for(A+=S.value.length;T>=A;)A+=(S=S.next).value.length;if(E=A-=S.value.length,S.value instanceof a)continue;for(var P=S;P!==t.tail&&(Ad.reach&&(d.reach=D);var I=S.prev;if(N&&(I=s(t,I,N),E+=N.length),c(t,I,_),S=s(t,I,new a(p,g?r.tokenize(L,g):L,y,L)),O&&s(t,S,O),_>1){var F={cause:p+","+m,reach:D};i(e,t,n,S.prev,E,F),d&&F.reach>d.reach&&(d.reach=F.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function c(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,a=/(?:\{*\.{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){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=p.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=p[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=c(u[a]),f=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),f){var h=[f];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function p(e){return"string"==typeof e?e:Array.isArray(e)?e.map(p).join(""):p(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r",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"],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=p(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&f(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n=o.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[a],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),m=p.indexOf(f);if(m>-1){++a;var h=p.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(m+f.length),v=[];h&&v.push.apply(v,i([h])),v.push(g),b&&v.push.apply(v,i([b])),"string"==typeof c?l.splice.apply(l,[s,1].concat(v)):c.content=v}}else c.content&&i(c.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},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.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,a.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},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){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,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){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:/[()]/},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);const o=a},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},bash:{title:"Bash",alias:"shell",aliasTitles:{shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:"hbs",owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (Scss)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),a=n(9642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),o.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},6500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var l={},s=e[r];if(s){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in a(t,o),l[t]=!0,n[t])l[i]=!0}t(s.require,c),t(s.optional,c),t(s.modify,c)}n[r]=l,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(s);i=i.map(c),l=(l||[]).map(c);var u=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var p,f=r(s),m=u;a(m);){for(var h in p={},m){var g=s[h];t(g&&g.modify,(function(e){e in d&&(p[e]=!0)}))}for(var b in d)if(!(b in u))for(var v in f(b))if(v in u){p[b]=!0;break}for(var y in m=p)u[y]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,l={},s={};function c(e){if(e in l)return l[e];s[e]=!0;var a,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)a=r(e);else{var p=i(u.map((function(e){var t=c(e);return delete s[e],t})));o?a=o(p,(function(){return r(e)})):r(e)}return l[e]=a}for(var u in n)c(u);var d=[];for(var p in s)d.push(l[p]);return i(d)}(f,u,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n